====================================
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只能監聽一個啊。那麼多個用戶端,怎麼辦呢。怎麼實現並發監聽呢。
未完待續。。。