1、delphi 在伺服器和客戶端傳文件:用tcp還是直接用文件流好點?
網路編程里應該有這些。文件流簡單說,就是把一個文件用流的方式獲版得。比如你在權代碼中經常看到用個Tfile類型的對象可以獲取到一個文件。然後對這個對象的操作就是對文件的操作。
TCP是傳輸協議。
通常別人會說用TcpServer控制項和TcpClient控制項。就可以達到網路傳輸的目的。
當然,你也可以用UDP方式傳輸,速度更快,但是不可靠,而且如果網路涉及到外網和內網的話,還需要打洞。比較麻煩。用TCP則省去了這些。方便快捷。
2、tcp多進程並發文件伺服器代碼?
線程是相對獨來立的執行單位,是自計算機系統進行調度的最小單位,其切換由操作系統控制,稱之為短作業調度。換句話說您沒有任何必要去手動調度線程。如果您想要實現的是連接分配的話,請參考您的操作系統的進程間通信和同步文檔,一般底層編程都是通過共享存儲區,消息隊列等方式實現的。如果是高層次的庫實現網路通信,請參考庫文檔,比如C#和Java都提供了足夠的介面實現此類功能。
3、TCP伺服器是什麼
TCP指的是傳輸控制協議。它是一種面向連接導向的、可靠地及基於位元組流的運輸層通信協議。而在接觸TCP中還有UDP,UDP也是一項重要的傳輸協議。TCP提供超時重發,丟棄重復數據,檢驗數據,流量控制等功能,保證數據能從一端傳到另一端
1、提供IP環境下的數據可靠傳輸(一台計算機發出的位元組流會無差錯的發往網路上的其他計算機,而且計算機A接收數據包的時候,也會向計算機B回發數據包,這也會產生部分通信量),有效流控,全雙工操作(數據在兩個方向上能同時傳遞),多路復用服務,是面向連接,端到端的傳輸;
2、面向連接:正式通信前必須要與對方建立連接。事先為所發送的數據開辟出連接好的通道,然後再進行數據發送,就像打電話。
3、TCP支持的應用協議:FTP 文件傳送、RLogin 遠程登錄、SMTP POP3 電子郵件、NFS 網路文件系統、遠程列印、遠程執行、名字伺服器終端伺服器等服務類型。
4、c語言寫的,簡單的tcp文件伺服器
41
5、怎樣實現TCP客戶端和TCP伺服器端文本信息和文件的同時傳輸?
這類的軟體其實很多的,包括windows自帶的插件都是具有這個功能,網上也有這類軟體可以用的。
6、怎樣在自己電腦上建立一個TCP伺服器
在自己電腦上建立一個TCP伺服器的方法如下:
1、 創建一個ServerSocket;
2、從ServerSocket接受客戶連接請求;
3、創建一個服務線程處理新的連接;
4、在服務線程中,從socket中獲得I/O流;
5、對I/O流進行讀寫操作,完成與客戶的交互;
6、關閉I/O流;
7、關閉Socket。
創建一個ServerSocket的方法如下:
ServerSocket server = new ServerSocket(post)
Socket connection = server.accept();
ObjectInputStream put=new ObjectInputStream(connection.getInputStream());
ObjectOutputStreamoput=newObjectOutputStream(connection.getOutputStream())。
7、怎麼使用TCP/IP與伺服器進行通信
使用流進行網路通信
使用socket進行網路編程的最簡單方式是使用NSStream。
NSStream類對流操作進行了抽象,包括對各種流數據的讀和寫:內存流、網路流或文件流。當然,通過NSStream也可以與伺服器進行通信。
無論是通過NSStream向伺服器寫數據,還是從NStream對象中讀取伺服器數據,都是一件簡單的事情。
在Mac OS X中,使用NSHost和NSStream與伺服器進行連接的代碼如下:
NSInputStream *iStream;
NSOutputStream *oStream;
uint portNo = 500;
NSURL *website = [NSURLURLWithString:urlStr];
NSHost *host = [NSHost hostWithName:[websitehost]]; [NSStream getStreamsToHost:host
port:portNo
inputStream:&iStream
outputStream:&oStream];
NSStream的getStreamsToHost:port:inputStream:outputStream:方法用於連接伺服器並創建一對輸入輸出流用於向伺服器讀寫數據。問題是iOS中並沒有這個方法。因此上述代碼無法用於iPhoneapp中。
要
解決這個問題,需要為NSStream增加新的類別以增加
getStreamToHost:Port:inputstream:outputStream:方法。在Xcode中新建文件
NSStreamAdditions.m。然後在NSStreamAdditions.h中編寫代碼如下:
@interface NSStream (MyAdditions)
+ (void)getStreamsToHostNamed:(NSString*)hostName
port:(NSInteger)port
inputStream:(NSInputStream **)inputStreamPtr
outputStream:(NSOutputStream **)outputStreamPtr;
@end
在NSStreamAdditions.m文件中加入下列代碼。
#import "NSStreamAdditions.h"
@implementation NSStream (MyAdditions)
+ (void)getStreamsToHostNamed:(NSString*)hostName
port:(NSInteger)port
inputStream:(NSInputStream **)inputStreamPtr
outputStream:(NSOutputStream **)outputStreamPtr
{
CFReadStreamRef readStream;
CFWriteStreamRef writeStream;
assert(hostName != nil);
assert( (port > 0) && (port <65536) );
assert( (inputStreamPtr != NULL) ||(outputStreamPtr != NULL) );
readStream = NULL;
writeStream = NULL;
(
NULL,
(CFStringRef) hostName,
port,
((inputStreamPtr != nil) ?&readStream : NULL),
((outputStreamPtr != nil) ? &writeStream : NULL)
);
if (inputStreamPtr != NULL) {
*inputStreamPtr = [NSMakeCollectable(readStream)autorelease];
}
if (outputStreamPtr != NULL) {
*outputStreamPtr =[NSMakeCollectable(writeStream) autorelease];
}
}
@end
以上代碼為NSStream類增加了一個類方法叫做:
getStreamsToHostNamed:port:inputStream:outputStream:
現在你可以在iPhone app中,使用該方法了。
作者注:該類別代碼基於蘋果文檔 Apple』s Technical Q&A1652。
在NetworkViewController.m中,加入如下代碼:
#import "NetworkViewController.h"
#import "NSStreamAdditions.h"
@implementation NetworkViewController
NSMutableData *data;
NSInputStream *iStream;
NSOutputStream *oStream;
定義connectToServerUsingStream:portNo:方法如下。在方法中我們連接了伺服器並創建了一對輸入/輸出流:
-(void) connectToServerUsingStream:(NSString*)urlStr portNo: (uint) portNo {
if (![urlStrisEqualToString:@""]) {
NSURL *website =[NSURL URLWithString:urlStr];
if (!website) {
NSLog(@"%@ is not a valid URL");
return;
} else {
[NSStream getStreamsToHostNamed:urlStr
port:portNo
inputStream:&iStream
outputStream:&oStream];
[iStreamretain];
[oStream retain];
[iStreamsetDelegate:self];
[oStream setDelegate:self];
[iStream scheleInRunLoop:[NSRunLoop currentRunLoop]
forMode:NSDefaultRunLoopMode];
[oStream scheleInRunLoop:[NSRunLoop currentRunLoop]
forMode:NSDefaultRunLoopMode];
[oStreamopen];
[iStream open];
}
}
}
在
方法中,我們將input和output放到了runloop中以便接收事件。這樣做,是為了防止流中沒有有效數據時代碼產生阻塞。input和
output的委託屬性都設置為self,因此我們還應該在NetworkViewController類中實現委託方法以便接收流數據。
使用 CFNetwork 進行網路通信
另一種TCP通信的方法是使用CFNetwork框架。CFNetwork屬於核心服務框架(C語言庫),提供了對HTTP、FTP、BSDsockets等網路協議的封裝。
為了演示如何使用CFNetwork框架,在NetworkViewController.m文件中加入如下語句:
#import "NetworkViewController.h"
#import "NSStreamAdditions.h"
@implementation NetworkViewController
NSMutableData *data;
NSInputStream *iStream;
NSOutputStream *oStream;
CFReadStreamRef readStream = NULL;
CFWriteStreamRef writeStream = NULL;
定義 connectToServerUsingCFStream:portNo: 方法如下:
-(void) connectToServerUsingCFStream:(NSString *)
urlStr portNo: (uint) portNo{
(kCFAllocatorDefault,
(CFStringRef) urlStr,
portNo,
&readStream,
&writeStream);
if (readStream &&writeStream){
CFReadStreamSetProperty(readStream,
,
kCFBooleanTrue);
CFWriteStreamSetProperty(writeStream,
,
kCFBooleanTrue);
iStream =(NSInputStream *)readStream;
[iStream retain];
[iStream setDelegate:self];
[iStreamscheleInRunLoop:[NSRunLoop currentRunLoop]
forMode:NSDefaultRunLoopMode];
[iStream open];
oStream = (NSOutputStream *)writeStream;
[oStreamretain];
[oStream setDelegate:self];
[oStream scheleInRunLoop:[NSRunLoopcurrentRunLoop]
forMode:NSDefaultRunLoopMode];
[oStream open];
}
}
首
先,我們使用()方法創建了一個到伺服器的TCP/IP連接,以及一對輸入輸出
流。然後將它們轉換為等價的O-C對象——NSInputStream和NSOutputStream。接下來跟前面一樣,設置delegate屬性並放
到runloop中運行。
發送數據
要想伺服器發送數據,請使用NSOutputStream對象:
-(void) writeToServer:(const uint8_t *) buf {
[oStream write:bufmaxLength:strlen((char*)buf)];
}
這段代碼發送了一個無符號整型數組到伺服器。
讀取數據
當伺服器有數據到達,stream:handleEvent:方法被觸發。因此我們只需在這個方法中讀取數據即可。
- (void)stream:(NSStream *)streamhandleEvent:(NSStreamEvent)eventCode {
switch(eventCode) {
case :
{
if (data == nil) {
data = [[NSMutableData alloc] init];
}
uint8_t buf[1024];
unsigned int len = 0;
len = [(NSInputStream *)stream read:buf maxLength:1024];
if(len) {
[data appendBytes:(const void *)buf length:len];
int bytesRead;
bytesRead += len;
} else {
NSLog(@"No data.");
}
NSString *str =[[NSString alloc] initWithData:data
encoding:NSUTF8StringEncoding];
NSLog(str);
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Fromserver"
message:str
delegate:self
cancelButtonTitle:@"OK"
otherButtonTitles:nil];
[alert show];
[alert release];
[str release];
[data release];
data = nil;
} break;
}
}
該方法有兩個參數。一個NSStream對象和一個NSStreamEvent常量。NSStreamEvent常量可能包含以下取值:
NSStreamEventNone -- 沒有任何事件
NSStreamEventOpenCompleted -- 流打開成功.
-- 此時流中有位元組待讀取
-- 此時可向流中寫入數據
NSStreamEventErrorOccurred -- 有錯誤發生
NSStreamEventEndEncountered -- 到達流的末尾
對於輸入流,你應當檢測 常量。在這里,我們從輸入流中讀取了數據並顯示在UIAlertView中。
在
stream:handleEvent:方法中,很容易檢查到連接錯誤。在本例中,如果
connectToServerUsingStream:portNo:方法連接伺服器失敗,則在stream:handleEvent方法將被調用並在
NSStreamEvent參數中傳遞一個NSStreamEventErrorOccured錯誤。
8、某用戶利用FTP從遠程主機下載了3個文件,在FTP客戶機和FTP伺服器之間至少要建立多少次TCP連接?為什麼?
4次。FTP協議分控制連接和數據連接。控制連接一直存在,而每傳輸一個文件就需要新建一個數據連接。所以至少要創建4次TCP連接。
9、區域網TCP伺服器,需要外網能訪問,怎麼做?
首先你要明白路由是不是共享式NAT上網的,也就是說router port nat出去的數據是一直堆疊或者持續變版動的,而不做埠映射基本沒權有實現的可能!
當然如果是靜態NAT,那麼直接做靜態NAT就可以了!
如樓上灰鴿子,是直接通過本地服務端(中灰鴿子端)連接廣域網客戶端(控制端),然後服務端和建立的聯系。如通過80埠出數據,穿透防火牆等等。
你可以嘗試修改數據包出去的port,同時在兩個端進行修改!
-------------
抓取到數據包的時候注意地址段,關鍵在於讓路由到router nat到數據包的時候,能找到你的主機A或者W。
你可以參照一些三層更新之類的軟體。
10、求一個TCP源程序,客戶端發送文件,伺服器接收文件,用VC6.0編譯可以通過,只要能採納的 ,可以充話費給你
vs2008,行不? 這邊頭誰還用VC6.0呀