在C#中,實(shí)現了很多對Windows API的封裝,在套接字通信方面也是如此。下面是一個(gè)TCP網(wǎng)絡(luò )通信的簡(jiǎn)單實(shí)例,因為自己初學(xué)C#,記下來(lái)學(xué)習
使用名字空間:
using System.Net;
using System.Net.Sockets;
服務(wù)器端:
五個(gè)步驟:
(1) 創(chuàng )建一個(gè)TcpListener類(lèi)的對象,也叫“偵聽(tīng)器”,通過(guò)它,服務(wù)器能監聽(tīng)到客戶(hù)的請求。
下面是TcpListener構造函數的3種實(shí)現:
TcpListener(Int32) 在指定端口號進(jìn)行監聽(tīng),現在比較少用
TcpListener(IPEndPoint) 綁定端點(diǎn)(包括IP和端口號)
TcpListener(IPAddress, Int32) 綁定IP和端口號
IPAddress類(lèi)有一個(gè)方法Parse(),可以將IP 地址字符串轉換為IPAddress 實(shí)例。
TcpListener類(lèi)封裝了套接字的創(chuàng )建(socket)和綁定(bind),簡(jiǎn)化了編程的輸入
(2) 調用TcpListener類(lèi)的Start()方法。該方法可以使TcpListenerduixiang開(kāi)始監聽(tīng)連接請求。
(3) 方法AcceptSock()可以接收來(lái)自客戶(hù)端的連接請求。該方法返回一個(gè)Socket類(lèi)的對象,該對象是實(shí)現與客戶(hù)端通信的套接字;
(4) 調用Sockets類(lèi)的Receive和Send方法來(lái)通信;
(5) 使用Socket對象的Close()方法關(guān)閉連接;
使用TcpListener類(lèi)的Stop()方法關(guān)閉偵聽(tīng)器。
客戶(hù)端:
五個(gè)步驟:
(1) 創(chuàng )建一個(gè)TcpClient類(lèi)的對象
TcpClient() 初始化 TcpClient 類(lèi)的新實(shí)例。
TcpClient(AddressFamily) 使用指定的族初始化 TcpClient 類(lèi)的新實(shí)例。
TcpClient(IPEndPoint) 初始化 TcpClient 類(lèi)的新實(shí)例,并將其綁定到指定的本地終結點(diǎn)。
TcpClient(String, Int32) 初始化 TcpClient 類(lèi)的新實(shí)例并連接到指定主機上的指定端口。
(2) 使用TcpClient類(lèi)的Connect方法建立與服務(wù)器的連接。
疑惑:這里的Connect方法同樣可以實(shí)現與指定IP和端口的服務(wù)器連接,那TcpClient類(lèi)的構建函數中就沒(méi)必要指定IP和端口了
(實(shí)際上,在下面的例子中,創(chuàng )建TcpClient對象時(shí),并沒(méi)有傳參數)
(3) 使用TcpClient的GetStream()方法來(lái)得到一個(gè)用于發(fā)送和接收數據的NetworkStream對象。
NetworkStream的WriteByte和Write方法分別能夠用于向服務(wù)器輸出單字節或一組字節;ReadByte和Read方法分別能從服務(wù)器讀取單字節或一組字節;
public override void Write( byte[] buffer, int offset, int size)
參數解析:
buffer:類(lèi)型 Byte 的數組,該數組包含要寫(xiě)入 NetworkStream 的數據。
offset:buffer 中開(kāi)始寫(xiě)入數據的位置,一般取0;
size:要寫(xiě)入 NetworkStream 的字節數,取值為buffer.Length-offset。
(當offset=0時(shí),size=buffer.Length)
Read()方法類(lèi)似,不單做解釋?zhuān)?/p>
(4) 使用NetworkStream對象的WriteByte,Write,ReadByte,Read方法與服務(wù)器進(jìn)行通信;
(5) 調用NetworkStream的Close方法來(lái)關(guān)閉連接;接著(zhù)調用TcpClient類(lèi)的Close()方法來(lái)終止TCP連接。
注意事項:
無(wú)論是Socket類(lèi)的Receive()或Send()方法,還是NetworkStream的Read()或Write()方法,都是直接讀寫(xiě)Byte[]類(lèi)型的變量,而我們習慣使用string類(lèi)型的變量
使用如下轉換:
字節數組到字符串:
Encoding.ASCII.GetString()
public virtual string GetString( byte[] bytes)
輸入byte[]類(lèi)型變量,輸出string類(lèi)型變量;
字符串到字節數組:
Encoding.ASCII.GetBytes()
public virtual byte[] GetBytes( string s)
輸入string類(lèi)型變量,輸出byte[]類(lèi)型變量;
代碼實(shí)現:
實(shí)現功能:客戶(hù)端向服務(wù)器發(fā)送信息,服務(wù)器在控制臺顯示接收到的信息;
服務(wù)器端:
namespace tcplistenerTest
{
class Program
{
static void Main(string[] args)
{
string srvIP = "127.0.0.1";
IPAddress srvAddr = IPAddress.Parse(srvIP);
int nPort = 2030;
//創(chuàng )建并綁定套接字
TcpListener srvLstner = new TcpListener(srvAddr, nPort);
//開(kāi)始監聽(tīng)
try
{
srvLstner.Start(5);
}
catch (SocketException e)
{
Console.WriteLine(e.Message);
srvLstner.Stop();
Console.ReadLine();
return;
}
//接受客戶(hù)端連接請求
while (true)
{
//接收連接請求
Socket remoteSock = srvLstner.AcceptSocket();
//顯示客戶(hù)端發(fā)送過(guò)來(lái)的消息
Byte[] recvBuf = new Byte[128];
try
{
remoteSock.Receive(recvBuf);
}
catch (SocketException e)
{
Console.WriteLine(e.Message);
break;
}
string recvMsg = Encoding.ASCII.GetString(recvBuf);
Console.WriteLine(recvMsg);
remoteSock.Close();
}
聯(lián)系客服