用socket來寫一個聊天軟件吧(一)


首先看網絡通信的前提:

  網絡通信還是要基於協議的規范,從一個通信軟件到另一個通信軟件,要從應用層、傳輸層、網絡層、物理層。IIS服務器上運用到了應用層上http協議,傳輸層上的tcp協議。聊天軟件上以QQ和FQ為代表類型,QQ是一種廣域網的聊天軟件,它是一種基於面象連接的TCP協議,FQ(飛秋)局域網聊天軟件應用到了基於非連接的UDP(登陸廣播)和TCP(消息單播文件單傳)。

  網絡連接的宗旨無非要resqust(請求)和response(響應)。連接到哪兒,誰接收?那就要靠IP地址來找到對應的主機(host),發送或請求通信的軟件在哪里?那就要看我們的端口來找到它了。

     在傳輸層,遵循那種規范?ipv4,ipv6,傳輸方式,面象連接TCP還是非連接UDP。

   好了,現在不多說了,那就做個簡單的類似QQ聊天軟件來理解socket內部原理吧。

  QQ聊天軟件是一個面象連接的軟件,它有一個服務器中轉站,我們都是用它的客戶端。客戶端發送消息到服務器,服務器記錄下聊天記錄並轉發給另一個客戶端。

  首先來理一個思路:

第一步,先實現客戶給服務器發消息:

  1、創建一個服務端 Server

  1.1、在服務器上用一個socket綁定一個端點IPEndPoint(它包含ip地址和商品號)。

  1.2、用這個socket在服務器端不斷的監聽來自客戶端的請求,如果接到一個請求就創建一個負責通信的socket 。

  1.3、用這個連接的socket收發消息。

  2、客戶端 Client

2.1、在客戶端用一個socket負責和服務器端握手並建立連接連接。

來寫代碼吧:

  

           //構建一個負責監聽的socket,它有三個枚舉類型的參數,分別定義了連接方式、傳輸流、傳輸協議,我這里是(ipv4,字節流,面象連接)
            Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            IPAddress ip = IPAddress.Parse(txtServer.Text);
            IPEndPoint point = new IPEndPoint(ip, Convert.ToInt32(txtPort.Text));
            //把一個IP地址和對應的商品綁定到一個socket,監聽……
            socket.Bind(point);
            //這里的Listen方法來開始監聽,一個規定只能處理一個請求的隊列
            socket.Listen(10);

           ShowMsg("開始監聽");
//由於服務器端要不斷的要接收來自客戶端請求( socket.Accept()),所以要創建一個線程來執行它 Thread th = new Thread(ResMsg); th.IsBackground = true; //start方法只能傳一個object th.Start(socket); //這個方法ResMsg   //監聽用戶 void ResMsg(object o) { //由於要接收多個用戶的請求,每來一個用戶就創建一個負責連接的socket while (true) { Socket socket = o as Socket; Socket consocket = socket.Accept(); string conneip = consocket.RemoteEndPoint.ToString(); ShowMsg("\r\n" + conneip + "連接成功"); } }

  

客戶端

   

 Thread th; Socket socket;
        private void List_Load(object sender, EventArgs e)
        {
            //創建連接的socket
            socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            //指定服務器的ip和端口號
            IPAddress ip = IPAddress.Parse("192.168.1.102");
            IPEndPoint point = new IPEndPoint(ip, Convert.ToInt32(50000));
            //連接
            socket.Connect(point);

       }

  

好了,現在客戶端就可以連上服務器了,好了,今天就寫到這里了,准備睡覺了,明天繼續……


免責聲明!

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



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