C Socket編寫區域網聊天室(伺服器端)

2021-09-26 15:05:04 字數 2599 閱讀 3536

需要的引用包括:

using system.net;

using system.net.sockets;

using system.threading;

首先要建立socket,將其繫結到本機的ip位址,給它乙個埠號。然後開始監聽

什麼是ip位址和埠號?

每乙個計算機都有乙個ip位址。通過ip位址可以在網路中訪問到計算機。

注:計算機通過不同的連線方式上網會獲得不同的ip,這是因為計算機的每乙個網絡卡都有乙個ip,插網線和連線wifi以及藍芽連線網路都會使用不同的網絡卡,因此也會有不同的ip。

但是僅僅通過ip找到指定的計算機還不行,還需要和指定的程式進行通訊,這是就需要用到埠號。埠號就像是每個程式的門牌號。埠號有65,536個,一般選用乙個較大的四位數來避免和其他程式的埠號發生衝突。

socket tcpserver = new socket(addressfamily.internetwork, sockettype.stream, protocoltype.tcp);

tcpserver.bind(new ipendpoint(ipaddress.parse(getip()), 8099));//人為設定乙個埠號

tcpserver.listen(100);//最大連線數為100

console.writeline("waiting for connection...");

其中有乙個getip()函式,用來獲取本機ip

static public string getip()

}return "";

}catch (exception ex)

}

通過呼叫socket.accept()函式來接收乙個來自客戶端的連線請求,若沒有連線請求,則程式會暫停在這裡,直到有客戶端連過來。socket.accept()函式會返回乙個socket物件,用來表示那個連過來的客戶端。我們用乙個while死迴圈來不斷處理連線請求。並建立乙個類client來方便處理客戶端的一些其他操作。由於會有多個客戶端連線過來,建立乙個list來管理折現client物件。

while(true)

建立客戶端物件鍊錶

static private listclientlist = new list();
客戶端類client

class client

private void receivemsg()//接收來自客戶端的訊息

catch(exception e)

}csocket.close();

}public void sendmsg(string msg)//向客戶端傳送訊息

public bool isconnected

}}

在client的建構函式裡我們開啟乙個執行緒,用來不斷接收來自客戶端發來的訊息。

使用函式receivemsg()函式來開啟這個執行緒。這個函式中包括乙個while迴圈,只要連線沒有斷開,就接收來自客戶端的訊息。

socket.receive(…)函式和socket.accept()一樣,如果客戶端沒有發來訊息就會卡在那裡,知道客戶端發來訊息。

這裡使用socket.poll(10, selectmode.selectread)來判斷有沒有斷開連線。它的意思是:如果連續10ms都無法讀取就返回true。

客戶端傳過來的訊息我們要用乙個byte陣列去接。然後將其轉碼成string以便輸出檢視。如果不檢視的話這裡是沒必要轉碼成string的,因為我們馬上就要把這個客戶端發來的訊息再廣播出去。我們要把乙個客戶端發來的訊息再傳遞給所有客戶端,包括它自己。這裡需要我們在主類裡寫乙個靜態成員函式broadcastmsg(string msg)

static public void broadcastmsg(string msg)

else//若沒有連線則將它放入乙個臨時佇列準備剔除

unconnected.add(c);

}foreach(var u in unconnected)//剔除斷開連線的客戶端

}

在broadcastmsg(string msg)函式中我們遍歷客戶端物件鍊錶中的每乙個物件,呼叫他們的client.sendmsg(string msg)函式。如果不需要測試的話,這裡傳乙個byte陣列就好了。在client.sendmsg(string msg)函式中我們會呼叫socket.send(byte data)函式,將訊息傳送給客戶端。

自此,伺服器端大功告成。

總結,其實總體的流程就是

1.建立乙個socket物件serversocket

2.將server繫結乙個ip和埠號

3.呼叫serversocket.listen(…)函式開始監聽

4.呼叫serversocket.accept()函式接收乙個客戶端的連線請求,建立連線,獲得客戶端socket物件clientsocket

5.呼叫clientsocket.receive(byte)函式接收客戶端發來的訊息

6.呼叫clientsocket.send(byte)函式向客戶端傳送訊息。

Qt編寫的區域網聊天程式

這個程式足足用了乙個月的時間,也怪小生內功不強,但此番修煉著實受益良多。整體程式不建議大家觀摩,主要是太亂了。在這裡我會將其中的幾個重要部分剝離出來和大家分享。該程式介面靈感 於網路,小生不才,又加了一部分自己的愚見,還望源作者能夠原諒。此程式借鑑了江湖上的各位大俠的秘籍和高招,既然 於江湖,就回歸...

C Socket 非同步 聊天室

socket 非同步通訊,執行緒池是由系統來維護執行緒的 注意 非同步呼叫時,不能使用同步呼叫的方法,會執行緒阻塞 server using system using system.collections.generic using system.text using system.net usin...

區域網聊天專案 2018 07 28

伺服器能開啟的最多檔案描述符是有限的 1024 socket的連包問題。客戶端和伺服器端進行互動。傳送端的連包問題。json包,如果兩個json包連在一起,則解析的時候只能解析第乙個包,壓根就不知道第二個json包的存在。在每乙個json包裡加乙個size選項,邊界也要加上。滑動視窗協議 1bit滑...