欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Socket基础通信程序,以及碰到的问题记录

程序员文章站 2022-03-02 15:31:07
...

实现基础的Socket通信,自己琢磨了一晚上,发现套接字还是蛮好玩的,做出了这个基础通讯程序,碰到了诸如套接字没有连接并且没有提供地址这种问题,仔细琢磨下才发现,原来是我使用Send发送消息的时候使用的是初始化时候使用的Socket对象,以至于send就找不到地址。当客户端连接上服务器的时候,原本等待的 Socket.Accept() 会得到响应,这时候就会得到新的Socket对象,这就是客户端的Socket对象了,再使用这个客户端的Socket对象的时候就可以往客户端发送消息了。

看看MSDN关于Socket.Accept()注释:public System.Net.Sockets.Socket Accept () 他是返回新建立的Socket对象的,如果开发多人聊天程序的话感觉可以从这个部分下手。

来看看代码

1.首先建立服务端Socket,并添加配置。

        //载入事件
        private void Frm_SocketCommunication_Load(object sender, EventArgs e)
        {            
            IPAddress ipD = IPAddress.Parse(host);
            IPEndPoint ipE = new IPEndPoint(ipD, port);         
            sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            sock.Bind(ipE);
            sock.Listen(10);
            this.txt_Mesge.Text += "等待连接\r\n";
            Thread thread = new Thread(AcceptCallBack);
            thread.IsBackground = true;
            thread.Start();                                     //启动Socket监听线程,等待客户端连接
        }
        //等待客户端连接
        private void AcceptCallBack()
        {
            while (true)
            {
                Socket newSoc = sock.Accept();
                this.Invoke(new Action(() =>
                {
                    this.txt_Mesge.Text += $"连接已建立,客户地址:{newSoc.RemoteEndPoint}\r\n";
                }));
                    Thread thread = new Thread(Receive);
                    thread.IsBackground = true;
                    thread.Start(newSoc);
             }
         }
        //接受客户端的消息并处理
        private void Receive(object _socket)
        {
            _clientSocket = (Socket)_socket;
            while (true)
            {
                byte[] result = new byte[1024];
                _clientSocket.Receive(result);
                string mesge = Encoding.UTF8.GetString(result);
                this.Invoke(new Action(() =>
                {
                    this.txt_Mesge.Text += $"接收到来自客户端的消息:{mesge}:{ DateTime.Now}\r\n";
                }));
            }
        }

2.客户端配置

        //客户端全局配置
        static string host = "127.0.0.1";        //注意这里的Host要和服务端的配置相同
        static int port = 11000;                 //注意这里的Port要和服务端的配置相同
        static Socket soc = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        //载入事件
        private void FrmServer_Load(object sender, EventArgs e)
        {
            IPAddress Ip = IPAddress.Parse(host);
            IPEndPoint Ipe = new IPEndPoint(Ip, port);
            soc.Connect(Ipe);           //连接服务端
            Thread thread = new Thread(new ThreadStart(Receive));
            thread.IsBackground = true;
            thread.Start();
        }
        //等待服务端发送消息
        private void Receive()
        {
            while (true)
            {
                byte[] receive = new byte[64];
                soc.Receive(receive, receive.Length, 0);
                string strInfo = Encoding.Default.GetString(receive);
                this.Invoke(new Action<string>((obj) =>
                {
                    txt_Mesge.AppendText(obj + "\r\n");
                    if (!soc.Connected)
                    {
                        txt_Mesge.AppendText("连接已断开\r\n");
                    }
                }), new object[] { strInfo });
            }
        }
        //向服务端发送信息
        private void btn_Mesge_Click(object sender, EventArgs e)
        {
            Byte[] sendByte = new byte[2048];
            string sendStr = this.txt_SendMesge.Text;
            sendByte = Encoding.UTF8.GetBytes(sendStr);
            soc.Send(sendByte, sendByte.Length, 0);
            txt_Mesge.AppendText(sendStr + "\r\n"); //向服务端发送消息
        }

 

 

相关标签: Socket