需要的引用包括:
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滑...