之所以要進行socket套接字通訊庫封裝,主要是直接使用套接字進行網路通訊程式設計相對複雜,特別對於初學者而言。實際上微軟從.net 2.0開始已經提供了tcp、udp通訊高階封裝類如下:
tcplistener
tcpclient
udpclient
微軟從.net 4.0開始提供基於task任務的非同步通訊介面。而直接使用socket封裝庫,很多socket本身的細節沒辦法自行控制,本文目就是提供一種socket的封裝供參考。文中展示部分封裝了tcp通訊庫,udp封裝也可觸類旁通:
custcplistener
custcpclient
tcp服務端封裝了服務端本地繫結、監聽、接受客戶端連線,並提供了網路資料流的介面。完整**:
public class custcplistener
}protected bool active
}public endpoint localendpoint
return this.mserversocket.localendpoint;}}
public networkstream datastream
return networkstream;}}
public custcplistener(ipendpoint localep)
public custcplistener(string localaddr, int port)
this.mserversocketendpoint = new ipendpoint(ipaddress.parse(localaddr), port);
this.mserversocket = new socket(this.mserversocketendpoint.addressfamily, sockettype.stream, protocoltype.tcp);
}public custcplistener(int port)
public void start()
/// /// 開始伺服器監聽
///
/// 同時等待連線的最大個數(半連線佇列個數限制)
public void start(int backlog)
if (this.mserversocket == null)
this.mserversocket.bind(this.mserversocketendpoint);
this.mserversocket.listen(backlog);
this.isactive = true;
}public void stop()
this.isactive = false;
this.mserversocket = new socket(this.mserversocketendpoint.addressfamily, sockettype.stream, protocoltype.tcp);
}public socket acceptsocket()
public custcpclient accepttcpclient()
}
tcp客戶端封裝了客戶端本地繫結、連線伺服器,並提供了網路資料流的介面。完整**:
public class custcpclient : idisposable
protected bool active
public ipendpoint clientsocketendpoint
public bool isconnected }
public networkstream datastream
return networkstream;}}
public custcpclient(ipendpoint localep)
this.client = new socket(localep.addressfamily, sockettype.stream, protocoltype.tcp);
this.active = false;
this.client.bind(localep);
this.clientsocketendpoint = localep;
}public custcpclient(string localaddr, int port)
ipendpoint localep = new ipendpoint(ipaddress.parse(localaddr), port);
this.client = new socket(localep.addressfamily, sockettype.stream, protocoltype.tcp);
this.active = false;
this.client.bind(localep);
this.clientsocketendpoint = localep;
}internal custcpclient(socket acceptedsocket)
public void connect(string address, int port)
ipendpoint remoteep = new ipendpoint(ipaddress.parse(address), port);
this.connect(remoteep);
}public void connect(ipendpoint remoteep)
this.client.connect(remoteep);
this.active = true;
}public void close()
protected virtual void dispose(bool disposing)
else
}gc.suppressfinalize(this);}}
public void dispose()
}
控制台程式試驗,服務端程式:
class program
private static void listenerclientconnection()
port=",
tcpclient.clientsocketendpoint.address, tcpclient.clientsocketendpoint.port);
thread thread = new thread(datahandleprocess);
thread.isbackground = true;
thread.start(tcpclient);}}
private static void datahandleprocess(object obj)
catch (exception)
thread.sleep(5);}}
}
客戶端程式:
class program
private static void userprocess()
次,內容:", i, "測試通訊");
console.writeline("傳送資料:", str);
sw.writeline(str);
}break;}}
}
通訊成功:
補充:目前有很多優秀的開源socket框架,比如supersocket、fastsocket等。
網路套接字(socket)
include uint32 t htonl uint32 t hostlong 主機位元組序轉網路位元組序 uint32 t htons uint32 t hostshort uint32 t ntohl uint32 t hostlong 網路位元組序轉主機位元組序 uint32 t ntohl...
網路 Socket套接字
socket介面在讀寫資料時,都是按字串的方式接收的,若要傳輸乙個 結構化的資料 就需要使用序列化和反序列化。序列化是將資料由多變到一的過程,反序列化是將資料由一分為多的過程。ip位址唯一標識公網當中的一台主機 埠號唯一標識互聯 定主機上的特定程序。每一對埠號加ip位址能夠唯一標識網路中一台主機上唯...
socket網路套接字
爬蟲的概念 爬蟲的應用 1.資料採集 大資料時代來臨,資料就是核心,資料就是生產力,越來越多的企業開始注重收集使用者資料,而爬蟲技術是收集資料的一種重要手段。2.搜尋引擎 3.模擬操作 爬蟲也被廣泛用於模擬使用者操作,測試機械人,灌水機械人等。爬蟲難點主要分為兩個方向 資料的獲取 網路公共資源都是為...