• WinForm聊天室


    前几天开始学Socket编程,跟着老师一点一点的做。最后做了一个WinForm版的小聊天室。这个聊天室的客户端和服务端都只是在本机上运行。

    这里我首先和大家谈谈我对聊天室的一点理解,聊天室其实是服务端分配一个端口,开启一个一直监听有没有客户端来连接服务器的Socket,
    如果一台客户端要去连接这台服务器,那么就会分配一个通信用的Socket并知道这台服务器的IP和端口号,去向服务器发出连接请求,
    如果服务器的监听Socket监听到有一台客户端发出连接请求,那么服务器监听Socket就会创建一个新的Socket,也称连接Socket来和
    客户端进行连接通信。

    下面上服务端开始监听Socket的代码:

            //监听Socket
            private void btnStart_Click(object sender, EventArgs e)
            {
                //ip地址
                IPAddress ip = IPAddress.Parse(txtServer.Text);
                //IP地址和端口号
                IPEndPoint point = new IPEndPoint(ip, int.Parse(txtPort.Text));
                //创建监听Socket
                Socket socket = new Socket(AddressFamily.InterNetwork,       SocketType.Stream, ProtocolType.Tcp);
                //绑定IP和端口号
                socket.Bind(point);
                ////通常每个套接字地址(协议/网络地址/端口)只允许使用一次。
                ////开启监听Socket     监听队列的长度
                socket.Listen(10);
                btnStart.Enabled = false;
                ShowMsg("开始监听...");
                //监听端口号,如果有客户端连接,创建新的Socket用于通信
                //Socket connSocket = socket.Accept();
                Thread t = new Thread(Listen);
                t.IsBackground = true;
                t.Start(socket);
            }
    

      

    服务端监听客户端连接请求代码:

    Socket socket = obj as Socket;
                //这样可以不断的监听客户端发送的连接请求
                while (true){
                    //通常每个套接字地址(协议/网络地址/端口)只允许使用一次。
                    //监听端口号,如果有客户端连接,创建新的Socket用于通信
                    //socket.Accept();会阻塞窗体的运行
                    Socket connSocket = socket.Accept();
                    //当前连接的客户端IP和端口号
                    string ipport=connSocket.RemoteEndPoint.ToString();
                    //连接的客户端IP和端口号显示在下拉框中
                    cmbClient.Items.Add(ipport);
                    //将连接的客户端IP、端口号和Socket存储Dictionary中
                    dic.Add(ipport, connSocket);
                    //本机IP和端口号
                    //connSocket.LocalEndPoint
                    ShowMsg(connSocket.RemoteEndPoint.ToString());
                    Thread t = new Thread(ReceiveMsg);
                    t.IsBackground = true;
                    t.Start(connSocket);
                }
    

      

    客户端Socket代码:

    //客户端连接服务器的IP
                IPAddress ip = IPAddress.Parse(txtServer.Text);
                //客户端连接服务器的IP和端口号
                IPEndPoint point = new IPEndPoint(ip, int.Parse(txtPort.Text));
                try { 
                    //创建通信连接的Socket
                    socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                    socket.Connect(point);
                    ShowMsg("连接成功");
                }
                catch(Exception ex) {
                    ShowMsg(ex.Message);
                }            
                //接收消息
                Thread t = new Thread(Receive);
                t.IsBackground = true;
                t.Start();
    

      

    由于代码比较多,这里就不一一贴上所有代码

  • 相关阅读:
    html 复习
    用openrowset连接远程SQL或插入数据
    查询SQL中的text类型字段内容,让其显示完整
    删除CheckBoxList未选中或选中的CheckBox选项
    RSA的加解密过程(转自CSDN,学习用)
    创建与删除SQL约束或字段约束。
    根据DataGrid绑定的列的SortException字段进行排序
    尽量避免IE拦截弹出窗口的代码,与ListBox的双击事件结合。
    比较好看的滚动条样式和按钮样式和文本框样式
    JS控制按钮10秒钟后才能正常使用
  • 原文地址:https://www.cnblogs.com/rampb/p/3393596.html
Copyright © 2020-2023  润新知