Server
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows.Forms; using System.Net.Sockets; using System.Net; using System.Threading; namespace DotnetSocketServer { /// <summary> /// 基于.netcore的SocketServer /// </summary> public partial class DotnetSocketServer : Form { public DotnetSocketServer() { InitializeComponent(); } //存储已连接的客户端的泛型集合 private static Dictionary<string, Socket> socketList = new Dictionary<string, Socket>(); /// <summary> /// 接收连接 /// </summary> /// <param name="obj"></param> public void StartServer(object obj) { string str; while (true) { //等待接收客户端连接 Accept方法返回一个用于和该客户端通信的Socket Socket recviceSocket = ((Socket)obj).Accept(); //获取客户端ip和端口号 str = recviceSocket.RemoteEndPoint.ToString(); socketList.Add(str, recviceSocket); //控件调用invoke方法 解决"从不是创建控件的线程访问它"的异常 cmb_socketlist.Invoke(new Action(() => { cmb_socketlist.Items.Add(str); })); SetMessage(str + "已连接"); //Accept()执行过后 当前线程会阻塞 只有在有客户端连接时才会继续执行 //创建新线程,监控接收新客户端的请求数据 Thread thread = new Thread(startRecive); thread.IsBackground = true; thread.Start(recviceSocket); } } /// <summary> /// 接收消息 /// </summary> /// <param name="obj">客户端socket</param> public void startRecive(object obj) { string str; string ip; while (true) { byte[] buffer = new byte[2048]; int count; try { //Receive(Byte[]) 从绑定的 Socket 套接字接收数据,将数据存入接收缓冲区。 //该方法执行过后同Accept()方法一样 当前线程会阻塞 等到客户端下一次发来数据时继续执行 count = ((Socket)obj).Receive(buffer); ip = ((Socket)obj).RemoteEndPoint.ToString(); if (count == 0) { cmb_socketlist.Invoke(new Action(() => { cmb_socketlist.Items.Remove(ip); })); SetMessage(ip + "已断开连接"); break; } else { str = Encoding.Default.GetString(buffer, 0, count); SetMessage("收到" + ip + "数据 " + str); } } catch (Exception) { } } } /// <summary> /// 开启服务器监听 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btn_StartListen_Click(object sender, EventArgs e) { //实例化一个Socket对象,确定网络类型、Socket类型、协议类型 Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); IPEndPoint IEP = new IPEndPoint(IPAddress.Parse(txt_ip.Text), int.Parse(txt_port.Text)); //绑定ip和端口 socket.Bind(IEP); //开启监听 socket.Listen(10); SetMessage("开始监听"); Thread thread = new Thread(new ParameterizedThreadStart(StartServer)); thread.IsBackground = true; thread.Start(socket); } /// <summary> /// 向对应客户端发送数据 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btn_send_Click(object sender, EventArgs e) { string str = txt_send.Text; byte[] bytes = new byte[2048]; bytes = Encoding.Default.GetBytes(str); //获取combobox的值 从泛型集合中获取对应的客户端socket 然后发送数据 if (cmb_socketlist.Items.Count != 0) { if (cmb_socketlist.SelectedItem == null) { MessageBox.Show("请选择一个客户端发送数据!"); return; } else { socketList[cmb_socketlist.SelectedItem.ToString()].Send(bytes); SetMessage("发送到客户端"+ cmb_socketlist.SelectedItem.ToString() + "数据: "+ str); } } else { SetMessage("当前无连接的客户端"); } txt_send.Clear(); } private void DotnetSocketServer_FormClosed(object sender, FormClosedEventArgs e) { System.Environment.Exit(0); } /// <summary> /// 添加信息 /// </summary> /// <param name="msg"></param> private void SetMessage(string msg) { richTextBox1.Invoke(new Action(() => { richTextBox1.AppendText(msg + "\r\n"); })); } } }
Client
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 test1 { /// <summary> /// 基于.netframework的SocketClient /// </summary> public partial class DotnetFrameworkSocketClient : Form { public DotnetFrameworkSocketClient() { InitializeComponent(); } byte[] buffer = new byte[2048]; Socket socket; Thread thread; /// <summary> /// 连接服务器 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btn_start_Click(object sender, EventArgs e) { try { //实例化socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //连接服务器 socket.Connect(new IPEndPoint(IPAddress.Parse(txt_ip.Text), int.Parse(txt_port.Text))); thread = new Thread(StartReceive); thread.IsBackground = true; thread.Start(socket); SetMessage("打开与远程服务器的连接!"); } catch (Exception ex) { SetMessage("服务器异常:" + ex.Message); } } /// <summary> /// 开启接收 /// </summary> /// <param name="obj"></param> private void StartReceive(object obj) { string str; while (true) { Socket receiveSocket = obj as Socket; try { if (receiveSocket.Connected == false) continue; int result = receiveSocket.Receive(buffer); if (result == 0) { break; } else { str = Encoding.Default.GetString(buffer, 0, result); SetMessage("接收到服务器数据: " + str); } } catch (Exception ex) { SetMessage("服务器异常:" + ex.Message); } } } /// <summary> /// 关闭连接 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btn_close_Click(object sender, EventArgs e) { try { socket.Shutdown(SocketShutdown.Both); socket.Close(); thread.Abort(); thread = null; SetMessage("关闭与远程服务器的连接!"); } catch (Exception ex) { SetMessage("异常" + ex.Message); } } private void button1_Click(object sender, EventArgs e) { socket.Send(Encoding.Default.GetBytes(txt_send.Text)); SetMessage("发送到服务器数据: " + txt_send.Text); txt_send.Clear(); } /// <summary> /// 添加信息 /// </summary> /// <param name="msg"></param> private void SetMessage(string msg) { richTextBox1.Invoke(new Action(() => { richTextBox1.AppendText(msg + "\r\n"); })); } } }