LINUX聊天室50問__LINUX

來源:互聯網
上載者:User
 ====================================
       LINUX聊天室50問
====================================


1.問題:怎麼實現多個終端。監聽。

2.一個聊天室程式,到底會分解成哪一些步驟呢。

3.開啟一個 Socket,綁定到另一個連接埠,並且一直監聽此連接埠。

4.伺服器是得有很多個SOCKET,還是一個socket,而有很多個port?
答:是有很多個socket,並用數組管理

5.伺服器(SOCKET數組):基本上是多線程:一個線程監聽,Accept之後建立一個線程處理請求

————————————————————————————————————
思路:
1:伺服器端有個Listener線程,用來監聽。
2:伺服器端再來個server   socket線程,用來和用戶端串連。
3:當監聽到客戶串連時,建立server   socket線程,獨立和用戶端串連。
4:伺服器端要有一個結構來儲存用戶端資訊。可以自己寫一個類來封裝。如使用者ip等。
——————————————————————————————————————

6.當監聽到客戶串連時,建立server   socket線程,獨立和用戶端串連。
這麼說,socket是可以動態建立的。

7.監聽listening和connect之間,是一個配對的關係。

8.那麼請問bind呢。socket和port與bind?
答:估計是將建立的socket與本地IP綁定起來。

9.想想看,QQ有幾億個使用者,他是怎麼管理的。如何回快QQ的登陸呢。
我想問一下,終端偵聽的用戶端有限制麼。是不是用戶端越多,開的線程就越多,程式處理速度就越慢

呢。我要做的至少要串連500個用戶端,進行資料的互動,會不會有問題呢。再頂下自己~~

10.ServerSocket.vb
負責監聽是否有用戶端串連,開線程接受用戶端Socket

————————————————————————————————————
        Public   Svr   As   IPEndPoint                   '伺服器位址簇
        Public   SvrListenSocket   As   Socket   '伺服器偵聽socket
        Public   SvrListener   As   Socket           '表示非同步作業的狀態
        Public   SvrListenThread   As   Thread   '伺服器偵聽線程
        Public   Done   As   New   ManualResetEvent(True)   '通知一個或多個正在等待的線程已

發生事件
Public   alsock   As   New   ArrayList       '放置socket的隊列
——————————————————————————————————————

11.  '偵聽50個用戶端   並啟動線程
 '開始一個非同步作業來接受一個傳入的串連嘗試
                                SvrListenSocket.BeginAccept(New   AsyncCallback(AddressOf  

AcceptCallback),   SvrListenSocket)

12.當發現一個串連後,建立一個線程,然後處理,當另外一個來後,重新建立。
public   sealed   class   Sockets
{
      private   Sockets()
      {
              //在這裡可以建立串連
      }

      public   static   Sockets   GetInstance(IPEndPoint   point)
      {
              //在這裡可以建立線程並串連
      }
}


13.我的那個常式是用進程還是線程實現通訊的。不知啊。是socket。但是。

14.建立多個線程就ok了 為每一個串連 建立一個線程去處理
      while (true)
            {
                // 得到包含用戶端資訊的通訊端
                Socket client = server.Accept();

                //建立Message Service線程對象
                ClientThread newclient = new ClientThread(client);

                //把ClientThread 類的ClientService方法委託給線程
                Thread newthread = new Thread(new ThreadStart(newclient.ClientService));

                // 啟動Message Service線程
                newthread.Start();
            }

15.用戶端在通訊時,需要知道伺服器的IP地址。屬於主動的一方
16.用戶端在向伺服器(系統)請求一個臨時連接埠,用完後釋放連接埠,取消連結。需要時再重新連上。
那請問,QQ開啟一個視窗時,是一直串連著嗎。(應該是的。如果沒有開啟視窗,那就沒串連。只是跟

伺服器串連著)

17.伺服器端,在通訊時一般屬於被動方,不知用戶端的IP和連接埠資訊。

18.用connect將用戶端通訊端與伺服器特定地址進行綁定串連

19.將socket串連到遠程主機(client. c)或者本地IP(server.c)

20.按要求通過socket接收和發送資料

21.連接埠地址是以進程為單位分配的。發送和接收必須使用同一連接埠。

22.為什麼在一個伺服器對多個用戶端情況下,進程會阻塞,而線程就不阻塞了呢。
每個用戶端對應兩個線程(收發各一個);而用戶端本身呢,只需要有兩個。

23.發送請求過程
1)利用gethostbyname()擷取主機資訊
2)初始化socket連接埠
3)利用connect函數將自己的ip地址等資訊發送給主機,等待主機調用accept函數來接受請求。

24.主機接收請求,進行資料通訊
1)主機用accept接收請求
2)建立子線程,顯示歡迎資訊
3)接收返回資訊,顯示串連成功
4)關閉用戶端socket
5)關閉服務端socket,結束子線程。

24.define BACKLOG 10  這個有何用。

25.那我Lisent只能監聽一個啊。那麼多個用戶端,怎麼辦呢。怎麼實現並發監聽呢。

 

未完待續。。。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.