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();

 

  

由於代碼比較多,這里就不一一貼上所有代碼

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM