• Socket


      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"); }));
            }
        }
    }
    

      

  • 相关阅读:
    Hadoop安装配置(ubuntu-12.04.2-server-amd64)
    初识hadoop
    mybatis多表关联配置
    mybatis的详解
    SpringMVC学习笔记
    spring注解
    web filter用spring注入对象
    luence全文检索(数据库检索)
    C++ inline 函数
    Ubuntu16.04 QT5编译出现cannot find -lGL和collect2:error:ld r
  • 原文地址:https://www.cnblogs.com/lhlong/p/15842217.html
Copyright © 2020-2023  润新知