一、服务端
using System; using System.Collections.Generic; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading; using System.Windows.Forms; namespace WindowsFormsApp7 { public partial class Form2 : Form { //服务器套接字 private Socket socket; //客户端连接 List<Socket> sockets = new List<Socket>(); Encoding encoding = Encoding.UTF8; public Form2() { InitializeComponent(); load(); } private void Label3_Click(object sender, EventArgs e) { } /// <summary> /// 加载 /// </summary> private void load() { //1.获取本地网络分配给你的IP System.Net.IPHostEntry hostEntry = Dns.GetHostEntry(Dns.GetHostName()); //第二步: foreach (var item in hostEntry.AddressList) { //3.判断是否是协议版本V4 if (item.AddressFamily == AddressFamily.InterNetwork) { cB_IPs.Items.Add(item); } } //添加本机IP cB_IPs.Items.Add("127.0.0.1"); cB_IPs.Items.Add("192.168.110.96"); cB_IPs.SelectedIndex = 0;//默认选中0个对象 } /// <summary> /// 打开服务器 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void Button2_Click(object sender, EventArgs e) { //1.初始化 socket = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp); //2.监听 IPEndPoint iPEndPoint = new IPEndPoint(IPAddress.Parse(cB_IPs.Text) ,(int)numericUpDown1.Value); try { socket.Bind(iPEndPoint);//监听 socket.Listen(10);//一秒可以监听多少个客户端连接 //监听客户端 ThreadPool.QueueUserWorkItem((Object o) => { while (true) { Socket socket1 = socket.Accept();//客户端连接 sockets.Add(socket1); //获取客户端连接IP和端口 IPEndPoint iPEndPoint1 = (IPEndPoint)socket1.RemoteEndPoint; //显示到数据表格 dataGridView1.Invoke(new Action(() => { dataGridView1.Rows.Add(iPEndPoint1.Address, iPEndPoint1.Port); })); } }); } catch (Exception ex) { MessageBox.Show($"服务端开始失败:{ex}"); } } /// <summary> /// 发送 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void Button3_Click(object sender, EventArgs e) { try { //判断是否群发 int index = dataGridView1.CurrentCell.RowIndex; //判断是否群发 if (checkBox1.Checked) { foreach (Socket item in sockets) { item.Send(encoding.GetBytes(textBox3.Text)); } } else { //获取客户端socket Socket socket = sockets[index]; //发送 socket.Send(encoding.GetBytes(textBox3.Text)); } } catch (Exception ex) { MessageBox.Show($"发送失败:{ex}"); } } } }View Code
二、客户端
using System; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading; using System.Windows.Forms; namespace WindowsFormsApp7 { public partial class Form1 : Form { private Socket socket; Encoding encoding = Encoding.Unicode; public Form1() { InitializeComponent(); load(); } /// <summary> /// 加载 /// </summary> private void load() { //1.获取本地网络分配给你的IP IPHostEntry hostEntry = Dns.GetHostEntry(Dns.GetHostName()); //第二步: foreach (var item in hostEntry.AddressList) { //3.判断是否是协议版本V4 if (item.AddressFamily == AddressFamily.InterNetwork) { cB_IPs.Items.Add(item); } } //添加本机IP cB_IPs.Items.Add("127.0.0.1"); cB_IPs.Items.Add("192.168.110.96"); cB_IPs.SelectedIndex = 0;//默认选中0个对象 } /// <summary> /// 连接 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void Button2_Click(object sender, EventArgs e) { //第一步:初始化套接字对象 socket = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp); try { //第二步:连接 socket.Connect(cB_IPs.Text,(int)numericUpDown1.Value); ThreadPool.QueueUserWorkItem(Reception); MessageBox.Show("连接成功!"); button1.Enabled = true; button3.Enabled = true; button2.Enabled = false; cB_IPs.Enabled = false; numericUpDown1.Enabled = false; } catch(Exception ex) { //连接失败 MessageBox.Show($"连接失败:{ex}"); } } /// <summary> /// 断开 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void Button1_Click(object sender, EventArgs e) { if (socket != null && socket.Connected) { socket.Close(); MessageBox.Show("断开连接"); button1.Enabled = false; button2.Enabled = true; cB_IPs.Enabled = true; numericUpDown1.Enabled = true; button3.Enabled = false; } } /// <summary> /// 发送 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void Button3_Click(object sender, EventArgs e) { //1.判断连接状态 if (socket != null && socket.Connected) { //2.字符串转换二进制 byte[] data = encoding.GetBytes(textBox3.Text); try { //3.发送 socket.Send(data); } catch (Exception ex) { MessageBox.Show($"发送失败:{ex}"); } } } /// <summary> /// 接收数据 /// </summary> public void Reception(Object o) { byte[] data = new byte[1024*2]; try { //接收 int length = socket.Receive(data); //判断是否有发送字节 if (length > 0) { textBox2.Invoke(new Action(() => { textBox2.Text += $"RX [{DateTime.Now.ToString("HH:mm:ss")}]:{encoding.GetString(data, 0, length)}"; })); } } catch (Exception ex) { MessageBox.Show($"接收失败:{ex}"); } } } }View Code
标签:socket,C#,cB,System,TCP,通信,IPs,ex,using From: https://www.cnblogs.com/zeussbook/p/18325935