好久沒有寫過博客了,最近因項目需求,需要用到Socket來進行通信,簡單寫了幾個例子,記錄一下,代碼很簡單,無非就是接收與發送,以及接收到數據後返回一個自定義信息,也可以定義為發送。 接收端因為需求要監聽某個埠,則在一開始判斷一下,要使用的埠是否被占用,定義一個處理方法,以下為處理代碼: 定義接 ...
好久沒有寫過博客了,最近因項目需求,需要用到Socket來進行通信,簡單寫了幾個例子,記錄一下,代碼很簡單,無非就是接收與發送,以及接收到數據後返回一個自定義信息,也可以定義為發送。
接收端因為需求要監聽某個埠,則在一開始判斷一下,要使用的埠是否被占用,定義一個處理方法,以下為處理代碼:
1 public static bool PortIsUse(int port) 2 { 3 bool isUse = false; 5 IPGlobalProperties ipProperties = IPGlobalProperties.GetIPGlobalProperties(); 6 IPEndPoint[] ipEndPoints = ipProperties.GetActiveTcpListeners();//找到已用埠 8 foreach (IPEndPoint endPoint in ipEndPoints) 9 { 10 if (endPoint.Port == port)//判斷是否存在 11 { 12 isUse= true; 13 break; 14 } 15 } 16 return isUse; 17 }
定義接收端:
1 TcpListener tcpl = new TcpListener(new IPAddress(new byte[] { 127, 0, 0, 1 }), 1111);//定義一個TcpListener對象監聽本地的1111埠 2 tcpl.Start();//監聽開始 3 while (true) 4 { 6 Socket s = tcpl.AcceptSocket();//掛起一個Socket對象 7 string remote = s.RemoteEndPoint.ToString();//獲取發送端的IP及埠轉為String備用 8 Byte[] stream = new Byte[1024]; 9 s.Receive(stream);//接收發送端發過來的數據,寫入位元組數組 10 //BGW_Handle.ReportProgress(1, "接收來自[" + remote + "]信息"); 11 string _data = Encoding.UTF8.GetString(stream);//將位元組數據數組轉為String 12 s.Send(stream);//將接收到的內容,直接返回接收端 13 s.Shutdown(SocketShutdown.Both); 14 } 15 tcpl.Stop();//停止監聽
定義發送端代碼:
IPAddress ip = IPAddress.Parse("127.0.0.1");//接收端所在IP 3 IPEndPoint ipEnd = new IPEndPoint(ip, 1111);//接收端所監聽的介面 4 Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//初始化一個Socket對象 5 try 6 { 7 socket.Connect(ipEnd);//連接指定IP&埠 8 } 9 catch (SocketException e) 10 { 11 Console.WriteLine("連接失敗"); 12 Console.WriteLine(e.ToString());
14 return; 15 } 16 socket.Send(Encoding.UTF8.GetBytes("1234567890"));//發送數據 17 while (true)//定義一個迴圈接收返回數據 18 { 19 byte[] data = new byte[1024]; 20 socket.Receive(data);//接收返回數據 21 string stringData = Encoding.UTF8.GetString(data); 22 if (!string.IsNullOrWhiteSpace(stringData)) 23 { 24 Console.Write(stringData); 25 break; 26 } 27 }29 socket.Shutdown(SocketShutdown.Both); 30 socket.Close();//關閉Socket
從上面代碼來看,還是很簡單的,這也要歸功於微軟所做的工作,以上代碼若有錯誤之處可在評論里提出來。