(C#)TCP與UDP通訊流程、Tcplistener和Tcpclient進行通訊、UdpClient進行通訊
1.基於Tcp協議的Socket通訊類似於B/S架構,面向連線,不同的是伺服器端可以向客戶端主動的推送訊息
流程順序。可靠性高
(1)建立一個套接字(Socket)
(2)繫結伺服器端IP地址及埠號-伺服器端
(3)利用Listen()方法開啟監聽-伺服器端
(4)利用Accept()方法等待客戶端連線-伺服器端
(5)Connect()方法與伺服器端建立連線-客戶端
(6)Send()方法向建立連線的主機發送訊息
(7)Recive()方法接收來自建立連線的主機的訊息
(8)closesocket關閉套接字
2.基於Udp的協議是無連線的。佔用資源少,響應速度快,延遲低。(不可靠連線)。資料報模式
流程順序
(1)建立一個套接字(Socket)
(2)繫結伺服器端IP地址及埠號-伺服器端
(3)通過SendTo()方法向制定的主機發送訊息
(4)通過ReciveFrom()方法接收指定主機發送的訊息
3.Tcplistener和Tcpclient進行通訊
通過listener來建立socket,與客戶端進行通訊。
Tcplistener和Tcpclient利用NetWorkStream類表示網路。使用GetStream方法返回網路流,
然後呼叫該流的Read和Write方法,對資料進行讀取和寫入。
Tcplistener和Tcpclient中維護了一個Socket物件。
伺服器
TcpListener建立傳入IP和Port,start開始監聽,AccptTcpClient方法得到客戶端的連線返回一個TcpClientduixiang
呼叫這個TcpClient物件中的GetStream方法得到一個NetworkStream,一個網路流。使用這個網路流的Read方法
得到byte型別的資料。
class Program { static void Main(string[] args) { //1.TcpListener對socket進行了一層封裝,在這個類中自己會去建立socket物件 TcpListener listener = new TcpListener(IPAddress.Parse("192.168.1.103"), 7788); //2.開始監聽 listener.Start(); //3.等待客戶端連線過來 TcpClient client = listener.AcceptTcpClient(); //4.取得客戶端傳送過來的資料 NetworkStream stream = client.GetStream();//得到了一個網路流,從這個網路流可以取得客戶端傳送過來的資料 byte[] data = new byte[1024]; while (true) { int length = stream.Read(data, 0, 1024);//讀取資料.引數:0是從哪個索引開始存放資料,1024最大讀取的位元組數。返回值為實際讀取的資料 string message = Encoding.UTF8.GetString(data, 0, length); Console.WriteLine("Get message:" + message); } //5.釋放資源 stream.Close(); client.Close(); listener.Stop(); Console.ReadKey(); } }
客戶端
通過建立TcpClient建立跟伺服器的連線,通過GetStream方法,獲得stream流,呼叫Write方法寫入資料,傳送資訊給伺服器
class Program
{
static void Main(string[] args)
{
//當我們建立tcpclient物件的時候,就會跟server去建立連線
TcpClient client = new TcpClient("192.168.1.103", 7788);
NetworkStream stream = client.GetStream();
//read讀取資料,write寫入資料
//利用一個死迴圈,重複向伺服器端傳送資料
while (true)
{
string message = Console.ReadLine();
byte[] data = Encoding.UTF8.GetBytes(message);
stream.Write(data, 0, data.Length);
}
stream.Close();
client.Close();
Console.ReadKey();
}
}
4.udpclient
udp只有一個類
Server端
建立UdpClient繫結ip和port
建立一個IPEndPoint儲存接收到的資料來自什麼ip和port
class Program
{
static void Main(string[] args)
{
//建立udpclient繫結ip跟埠號
UdpClient udpClient = new UdpClient
(new IPEndPoint(IPAddress.Parse("192.168.1.103"), 7788));
while (true)
{
//接收資料
IPEndPoint point = new IPEndPoint(IPAddress.Any, 0);
byte[] data = udpClient.Receive(ref point);//通過point確定資料來自哪個ip的哪個埠號
string message = Encoding.UTF8.GetString(data);
Console.WriteLine("Get Msg:" + message);
}
udpClient.Close();
Console.ReadKey();
}
}
客戶端
建立UdpClient,使用Send方法將資料傳輸給制定的IP和Port
class Program
{
static void Main(string[] args)
{
UdpClient client = new UdpClient();
while (true)
{
string message = Console.ReadLine();
byte[] data = Encoding.UTF8.GetBytes(message);
client.Send(data, data.Length, new IPEndPoint(IPAddress.Parse("192.168.1.103"), 7788));
}
client.Close();
Console.ReadKey();
}
}