1、对于TCP协议下的Socket通信并不难,只要静下心来去理解服务端和客户端的连接机制即可,最重要的是沉下心体会
客户端相对简单,写好Receive()和Send()方法即可:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; namespace Socket客户端 { public partial class Client : Form { public Client() { InitializeComponent(); } Socket socket; private void Client_Load(object sender, EventArgs e) { Control.CheckForIllegalCrossThreadCalls = false; } private void btnConnect_Click(object sender, EventArgs e) { socket=new Socket(AddressFamily.InterNetwork,SocketType.Stream, ProtocolType.Tcp); socket.Connect(new IPEndPoint(IPAddress.Parse("192.168.1.3"), 80)); AppendMsg("连接成功"); //接收消息,使用线程池 ThreadPool.UnsafeQueueUserWorkItem(new WaitCallback(ReceiveMsg), socket); } public void ReceiveMsg(object o) { Socket serverSocket = o as Socket; byte[] data = new byte[1024 * 1024]; while (true) { int len = serverSocket.Receive(data,0,data.Length,SocketFlags.None); //接收服务端消息 string str = Encoding.UTF8.GetString(data,0,len); AppendMsg(str); } } public void AppendMsg(string str) { txtMsg.AppendText(">>>" + str + "\r\n"); } private void btnSend_Click(object sender, EventArgs e) { if (socket.Connected) { byte[] data = Encoding.UTF8.GetBytes(this.txtSend.Text); socket.Send(data, 0, data.Length,SocketFlags.None); //发送消息 AppendMsg(txtSend.Text); txtSend.Text = ""; } } private void txtSend_KeyPress(object sender, KeyPressEventArgs e) { if (e.KeyChar == '\r') { btnSend_Click(sender, e); e.Handled= true; } } } }
2、IP地址可以设置自动获取

3、附上原始版代码
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.Net.Sockets; using System.Net; using System.Threading; namespace socket通信客户端 { public partial class CLIENT : Form { public CLIENT() { InitializeComponent(); } Socket socketSend; /// <summary> /// //获取本机IP地址 /// </summary> /// <returns></returns> private string GetIpAdress() { try { string HostName = Dns.GetHostName(); //得到主机名 IPHostEntry IpEntry = Dns.GetHostEntry(HostName); for (int i = 0; i < IpEntry.AddressList.Length; i++) { //从IP地址列表中筛选出IPv4类型的IP地址 //AddressFamily.InterNetwork表示此IP为IPv4, //AddressFamily.InterNetworkV6表示此地址为IPv6类型 if (IpEntry.AddressList[i].AddressFamily == AddressFamily.InterNetwork) { return IpEntry.AddressList[i].ToString(); } } return ""; } catch (Exception ex) { return ex.Message; } } private void Form1_Load(object sender, EventArgs e) { //txtlocalip.Text = GetIpAdress(); //txtport.Text = "8080"; Control.CheckForIllegalCrossThreadCalls = false; this.ActiveControl = this.btnConnection; } private void btnConnection_Click(object sender, EventArgs e) { try { //创建一个socket用来连接服务器 socketSend = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); IPAddress ip = IPAddress.Parse(txtaidip.Text.Trim()); //获取IP地址 IPEndPoint ipep = new IPEndPoint(ip, Convert.ToInt32(txtport.Text.Trim())); //获得要连接的远程服务器的IP地址和端口号 socketSend.Connect(ipep); showMSG("连接成功"); //创建一个线程,用来不断接收服务器端发送的信息 Thread th = new Thread(ReceiveMessage); th.IsBackground = true; //后台线程 th.Start(socketSend); //socketSend是Start()的参数 } catch { } } /// <summary> /// 不停地接收服务器端发送来的信息 /// </summary> /// <param name="o"></param> private void ReceiveMessage(Object o) { Socket socketSend = o as Socket; try { while (true) { byte[] buffer = new byte[1024 * 1024 * 1]; int r = socketSend.Receive(buffer); if (r == 0) { break; } string str = Encoding.UTF8.GetString(buffer, 0, r); showMSG(socketSend.RemoteEndPoint.ToString() + ":" + str); } } catch { } } private void showMSG(string str) { txtReceMsg.AppendText(str + "\r\n"); } private void btnSendMsg_Click(object sender, EventArgs e) { string str = txtSendMsg.Text.Trim(); byte[] buffer = System.Text.Encoding.UTF8.GetBytes(str); socketSend.Send(buffer); txtReceMsg.AppendText(GetIpAdress() + ">>" + txtSendMsg.Text.Trim() + "\r\n"); txtSendMsg.Text = ""; } private void txtMsg_KeyPress(object sender, KeyPressEventArgs e) { if (e.KeyChar == '\r') { this.btnSendMsg_Click(sender, e); } } } }
浙公网安备 33010602011771号