用戶端:
/// <summary> /// socket發送位元組數組 /// </summary> /// <param name="sendData">要發送的byte[]</param> /// <param name="ip">伺服器IP</param> /// <param name="port">伺服器連接埠</param> /// <returns>接收的byte[]</returns> public static byte[] SendBySocket(byte[] sendData, string ip, int port) { byte[] byteReceive = null; try { IPEndPoint remoteEndPoint = new IPEndPoint(IPAddress.Parse(ip), port); Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); socket.Connect(IPAddress.Parse(ip), port); socket.Send(sendData); int count, size = 512; byte[] data = new byte[size]; MemoryStream ms = new MemoryStream(); while (0 != (count = socket.Receive(data, size, SocketFlags.None))) ms.Write(data, 0, count); byteReceive = ms.ToArray(); ms.Close(); //方法2 //int bytes = 0; //MemoryStream ms = new MemoryStream(); //while (true) //{ // byte[] byteMessage = new byte[10]; // bytes = socket.Receive(byteMessage, byteMessage.Length, 0); // if (bytes <= 0) // break; // ms.Write(byteMessage, 0, bytes); //} //byteReceive = ms.ToArray(); //ms.Close(); socket.Shutdown(SocketShutdown.Both); socket.Close(); } catch { return null; } return byteReceive; }
服務端:
bool btnstatu = true; //開始停止服務狀態 Socket listener; //開始停止服務按鈕 private void btnStart_Click(object sender, EventArgs e) { CancellationTokenSource cts = new CancellationTokenSource(); Task task = new Task(() => Listen(cts.Token), cts.Token); if (btnstatu) { task.Start(); statuBar.Text = "服務已啟動,等待用戶端串連"; btnstatu = false; btnStart.Text = "停止服務"; } else { if (listener != null) { listener.Close(); listener = null; } cts.Cancel(); statuBar.Text = "服務端已停止服務"; btnstatu = true; btnStart.Text = "開始服務"; statuBar.Text = "服務已停止"; } } //監聽函數 private void Listen(CancellationToken cts) { cts.ThrowIfCancellationRequested(); listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); listener.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); IPEndPoint iep = new IPEndPoint(IPAddress.Any, ServerConfig.ServerPort); try { listener.Bind(iep); listener.Listen(10); while (true) { Socket accept = listener.Accept(); byte[] byteMessage = new byte[1024]; accept.Receive(byteMessage); string recvMsg = Encoding.Default.GetString(byteMessage).Replace("\0", ""); ShowText(DateTime.Now.ToString("[HH:mm:ss]") + accept.RemoteEndPoint.ToString() + "說:" + recvMsg); string sendMsg = "已收到訊息"; accept.Send(Encoding.Default.GetBytes(sendMsg)); accept.Shutdown(SocketShutdown.Both); accept.Close(); } } catch { } } private void ShowText(string msg) { richTextBox1.SafeCall(() => { richTextBox1.AppendText(msg); richTextBox1.AppendText(System.Environment.NewLine); }); }