dw用層還是表格做網(wǎng)站快色盲圖
Socket通信基本流程
- 首先要啟動服務(wù)器創(chuàng)建Socket,然后要綁定服務(wù)器的一個端口
- 這樣客戶端通過服務(wù)器IP+端口號就能連接到服務(wù)器了
- 服務(wù)器接下來會設(shè)置監(jiān)聽隊列,監(jiān)聽并等待要連接到它的客戶端
- 客戶端在服務(wù)器啟動之后也建立自己的Socket,然后使用客戶端的Socket去連接服務(wù)器
- 連接成功之后客戶端和服務(wù)器之間就可以發(fā)送數(shù)據(jù)和接收數(shù)據(jù)
- 當(dāng)客戶端關(guān)閉的時候,服務(wù)器會捕捉到客戶端連接關(guān)閉
- 服務(wù)器會把對應(yīng)客戶端的Socket也進(jìn)行關(guān)閉
實現(xiàn)?
新建一個Unity項目新建腳本編寫客戶端
using System.Net.Sockets;
using System.Net;
using System;
using System.Text;public class Client : MonoBehaviour
{private Socket socket;//定義用來存消息的容器private byte[] buffer = new byte[1024];// Start is called before the first frame updatevoid Start(){//參數(shù): IPV4協(xié)議, 套接字的傳輸類型(流式傳輸), socket傳輸協(xié)議(TCP)socket = new Socket(AddressFamily.InterNetwork,SocketType.Stream ,ProtocolType.Tcp); //連接服務(wù)器: 服務(wù)器IP, 服務(wù)器端口號socket.Connect("127.0.0.1", 6666); //連接完成//連接成功調(diào)用接收方法異步接收消息StartReceive();//連接成功發(fā)送消息Send();}//接收消息void StartReceive(){socket.BeginReceive(buffer,0,buffer.Length,SocketFlags.None,ReceiveCallback,null);}//接收消息的回調(diào)方法(作為參數(shù)傳遞的函數(shù))void ReceiveCallback(IAsyncResult iar){//接收返回消息長度int len = socket.EndReceive(iar);//接收為0代表終止連接if (len == 0){return;}//解析bufferstring str = Encoding.UTF8.GetString(buffer, 0, len);Debug.Log(str);//解析完在執(zhí)行接收方法 StartReceive();}void Send(){socket.Send(Encoding.UTF8.GetBytes("服務(wù)器你好,我是客戶端!"));}// Update is called once per framevoid Update(){}
}
創(chuàng)建一個空物體掛載客戶端腳本
?新建一個窗體應(yīng)用編寫服務(wù)端
using System.Net.Sockets;
using System.Net;
using System;
using System.Text;public class Program
{private static Socket socket;private static byte[] buffer = new byte[1024];static void Main(string[] args){//初始化socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//綁定socket.Bind(new IPEndPoint(IPAddress.Any, 6666));//監(jiān)聽: 掛起的連接隊列最大長度 —— 同時處理連接請求的最大數(shù),超出最大數(shù)會排隊等待socket.Listen(0);StartAccept();Console.Read(); //阻塞住讓程序不會結(jié)束}//開始應(yīng)答static void StartAccept(){//開始異步應(yīng)答連接 參數(shù): 回調(diào)函數(shù),objectsocket.BeginAccept(AcceptCallback, null);}static void AcceptCallback(IAsyncResult iar){//異步接受傳入的連接嘗試,并創(chuàng)建新的 Socket 來處理遠(yuǎn)程主機通信。Socket client = socket.EndAccept(iar);//開始接收StartReceive(client);//重新開始應(yīng)答StartAccept();}//接收消息static void StartReceive(Socket client){//開始從連接的 Socket 中異步接收數(shù)據(jù)client.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, ReceiveCallback, client);}//回調(diào)函數(shù)static void ReceiveCallback(IAsyncResult iar){Socket client = iar.AsyncState as Socket;//結(jié)束接收返回消息長度int len = client.EndReceive(iar);//接收為0代表終止連接if (len == 0){return;}//解析bufferstring str = Encoding.UTF8.GetString(buffer, 0, len);Console.WriteLine(str);//解析完在執(zhí)行接收方法 StartReceive(client);}
}
先運行服務(wù)端然后運行客戶端