網絡通信的基本知識:
首先應該確定IP地址和端口號,端口號為了確定計算機的哪個進程,比如同一主機是微信還是qq通信
要進行通信首先應該確定一種協議,通常用TCP可靠和UDP不可靠協議,當然帶來的速度也會不同,多數游戲中采用TCP協議。
面向連接套接字通信步驟:
服務端:
先申請一個Socket,綁定一個IP地址和端口,開始接聽,等待接受連接。
客戶端:
申請一個Socket,連接服務器且指定IP和端口號
值得注意的是,服務端有兩個Socket,一個用於監聽,另一個和客戶端進行通信。
服務器端代碼:
using System.Net.Sockets; using System.Net; using System.Threading; namespace Socket套接字 { class SocketT { private Socket _ServerSocket; //服務器監聽套接字 private bool _IsListionContect; //是否在監聽 public SocketT() { //定義網絡終節點(封裝IP和端口) IPEndPoint endPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"),1000); //實例化套接字 _ServerSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //服務端綁定地址 _ServerSocket.Bind(endPoint); //開始監聽 _ServerSocket.Listen(10); //監聽的最大長度 Console.WriteLine("服務器已經啟動..."); try { while (_IsListionContect) { //Accept()方法接受客戶端的連接,這個方法會阻斷當前線程的運行 Socket sockMsgSever = _ServerSocket.Accept(); Console.WriteLine("有一個客戶端連接..."); //開啟后台線程,進行客戶端會話 Thread thClientMsg = new Thread(ClientMsg); thClientMsg.IsBackground=true; //設置為后台線程 thClientMsg.Name = "thClientMsg"; thClientMsg.Start(sockMsgSever); } } catch (Exception) { throw; } } /// <summary> /// 服務器端和客戶端通信的后天線程 /// </summary> /// <param name="?"></param> private void ClientMsg(object sokMsg) { Socket socketMsg = sokMsg as Socket; //將object類型轉換為Socket通信 while (true) { //准備一個數據緩存 byte[] msyArray = new byte[0124 * 0124]; //接受客戶端發來的請求,返回真實的數據長度 int TrueClientMsgLenth = socketMsg.Receive(msyArray); //byte數組轉字符串 string strMsg = Encoding.UTF8.GetString(msyArray, 0, TrueClientMsgLenth); //顯示客戶端數據 Console.WriteLine("客戶端數據:"+strMsg); } } static void Main(string[] args) { SocketT obj = new SocketT(); } } }
客戶端:
using System.Threading; using System.Net; using System.Net.Sockets; namespace Socket套接字_客戶端 { class Client { private Socket _ClientSocket; //客戶端通訊套接字 private IPEndPoint SeverEndPoint; //連接到服務器端IP和端口 public Client() { //服務器通信地址 SeverEndPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 1000); //建立客戶端Socket _ClientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); try { _ClientSocket.Connect(SeverEndPoint); } catch (Exception) { } Console.WriteLine("連接服務器端成功!"); } //連接服務器 public void SendMsg() { while (true) { //輸入信息 string strMsg = Console.ReadLine(); //退出 if (strMsg == "exit") { break; } //字節轉換 Byte[] byeArray = Encoding.UTF8.GetBytes(strMsg); //發送數據 _ClientSocket.Send(byeArray); Console.WriteLine("我:" + strMsg); } //關閉連接 _ClientSocket.Shutdown(SocketShutdown.Both); //清理連接資源 _ClientSocket.Close(); } static void Main(string[] args) { Client obj = new Client(); obj.SendMsg(); } } }