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

实现基础的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"); //向服务端发送消息
        }

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值