C#簡單聊天室雛形
本文實(shí)例為大家分享了C#簡單聊天室雛形的具體代碼,供大家參考,具體內(nèi)容如下
程序使用的控制臺(tái)的黑窗口模擬程序,第一次涉及網(wǎng)絡(luò)編程,寫出來方便以后查閱,代碼很簡單
首先是服務(wù)器端的代碼:
public class ServerControl ? ? { ? ? ? ? private Socket serverSocket; ? ? ? ? public ServerControl() ? ? ? ? { ? ? ? ? ? ? serverSocket = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp); ? ? ? ? } ? ? ? ? public void Start() ? ? ? ? { ? ? ? ? ? ? serverSocket.Bind(new IPEndPoint(IPAddress.Any, 12312)); ?//設(shè)置接收任何ip ? ? ? ? ? ? serverSocket.Listen(10); ?//最大掛起數(shù) ? ? ? ? ? ? Console.WriteLine("服務(wù)器啟動(dòng)成功"); ? ? ? ? }? ? ? }
主程序:
static void Main(string[] args) ? ? ? ? { ? ? ? ? ? ? ServerControl server = new ServerControl(); ? ? ? ? ? ? server.Start(); ? ? ? ? ? ? Console.ReadKey(); ? ? ? ? }
下面是客戶端代碼:
public class ClientControl ? ? { ? ? ? ? Socket clientSocket; ? ? ? ? public ClientControl() ? ? ? ? { ? ? ? ? ? ? clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); ? ? ? ? } ? ? ? ? public void Connect(string ip, int port) ? ? ? ? { ? ? ? ? ? ? clientSocket.Connect(ip, port); ? ? ? ? ? ? Console.WriteLine("連接服務(wù)器成功"); ? ? ? ? } ? ? }
客戶端的調(diào)用代碼:
static void Main(string[] args) ? ? ? ? { ? ? ? ? ? ? ClientControl client = new ClientControl(); ? ? ? ? ? ? client.Connect("127.0.0.1",12312); ? ? ? ? ? ? Console.ReadKey(); ? ? ? ? }
此時(shí)客戶端就可以順利連接到服務(wù)器,下一步是在服務(wù)器上顯示是誰連接到服務(wù)器了很簡單只需要在服務(wù)器端加一個(gè)方法來檢測:
?private void Accept() ? ? ? ? { ? ? ? ? ? ? //接收客戶端方法,會(huì)掛起當(dāng)前線程 ? ? ? ? ? ? Socket client = serverSocket.Accept(); ? ? ? ? ? ? IPEndPoint point = client.RemoteEndPoint as IPEndPoint; ? ? ? ? ? ? Console.WriteLine(point.Address + "[" + point.Port + "]連接成功"); ? ? ? ? ? ? Accept(); ? //尾遞歸 ? ? ? ? }
因?yàn)橐诜?wù)器啟動(dòng)就要去檢測有沒有連接到服務(wù)器的ip,所以需要在start方法中開辟一個(gè)新的線程來調(diào)用Accept方法
Thread threadAccept = new Thread(Accept); ?//接收一個(gè)委托方法 ? ? ? ? ? ? threadAccept.IsBackground = true; ?//設(shè)置為后臺(tái)線程 ? ? ? ? ? ? threadAccept.Start();
下一步就是客戶端要往服務(wù)器發(fā)送消息
客戶端的ClientControl類代碼:
public void Send(string msg) ? ? ? ? ? { ? ? ? ? ? ?clientSocket.Send(Encoding.UTF8.GetBytes(msg)); ? ? ? ? }
客戶端主程序調(diào)用代碼:
Console.WriteLine("請(qǐng)輸入要發(fā)送的內(nèi)容, 輸入exit退出:"); ? ? ? ? ? ? string msg = Console.ReadLine(); ? ? ? ? ? ? while (msg != "exit") ? ? ? ? ? ? { ? ? ? ? ? ? ? ? client.Send(msg); ? ? ? ? ? ? ? ? msg = Console.ReadLine(); ? ? ? ? ? ? }
下一步就是要在服務(wù)器接收客戶端的輸入內(nèi)容
private void Receive(object obj) ? ? ? ? { ? ? ? ? ? ? Socket client = obj as Socket; ? ? ? ? ? ? IPEndPoint point = client.RemoteEndPoint as IPEndPoint; ? ? ? ? ? ? try ? //防止客戶端異常斷開拋異常 ? ? ? ? ? ? { ? ? ? ? ? ? ? ? byte[] msg = new byte[1024]; ? ? ? ? ? ? ? ? int msglen = client.Receive(msg); ? ? ? ? ? ? ? ? Console.WriteLine(point.Address + "[" + point.Port + "]:" + Encoding.UTF8.GetString(msg, 0, msglen)); ? ? ? ? ? ?client.Send(Encoding.UTF8.GetBytes(Encoding.UTF8.GetString(msg, 0, msglen))); ? //這個(gè)地方加了個(gè)小功能,就是客戶端來一個(gè)消息 服務(wù)器給他發(fā)回去同樣的,可以去掉 ? ? ? ? ? ? ? ? Receive(client); ? //尾遞歸 ? ? ? ? ? ? } ? ? ? ? ? ? catch ? ? ? ? ? ? { ? ? ? ? ? ? ? ? Console.WriteLine(point.Address + "[" + point.Port + "]:" + "已經(jīng)斷開"); ? ? ? ? ? ? }
這個(gè)方法執(zhí)行同樣會(huì)掛起線程,所以要開辟一個(gè)新的線程,因?yàn)檫@是接收客戶端的消息,所以這個(gè)新線程要寫在剛才寫的Accept方法里面
Thread threadReceive = new Thread(Receive); ? ? ? ? ? ? threadReceive.IsBackground = true; ? ? ? ? ? ? threadReceive.Start(client);
附加:
剛才不是寫了一個(gè)服務(wù)器接收到消息,會(huì)給客戶端返回一個(gè)相同的消息,所以還要在客戶端接收服務(wù)器的消息,方法和在服務(wù)器端接收大同小異
private void Receive() ? ? ? ? { ? ? ? ? ? ? try ? ? ? ? ? ? { ? ? ? ? ? ? ? ? byte[] msg = new byte[1024]; ? ? ? ? ? ? ? ? int msglen = clientSocket.Receive(msg); ? ? ? ? ? ? ? ? Console.WriteLine("服務(wù)器說:" + Encoding.UTF8.GetString(msg)); ? ? ? ? ? ? ? ? Receive(); ? ? ? ? ? ? } ? ? ? ? ? ? catch ? ? ? ? ? ? { ? ? ? ? ? ? ? ? Console.WriteLine("服務(wù)器已經(jīng)斷開"); ? ? ? ? ? ? }? }
以為一連上就要去檢測服務(wù)器有沒有消息,所以開辟一個(gè)線程 寫在客戶端的 connect方法中
Thread threadReceive = new Thread(Receive); ? ? ? ? ? ? threadReceive.IsBackground = true; ? ? ? ? ? ? threadReceive.Start();
好了 ,一個(gè)最簡單的聊天室就算寫完了
想多人登陸 就在vs中找到客戶端的debug文件夾 找到exe文件運(yùn)行
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C#調(diào)用RabbitMQ實(shí)現(xiàn)消息隊(duì)列的示例代碼
這篇文章主要介紹了C#調(diào)用RabbitMQ實(shí)現(xiàn)消息隊(duì)列的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12C#中Clone一個(gè)對(duì)象的值到另一個(gè)對(duì)象案例
這篇文章主要介紹了C#中Clone一個(gè)對(duì)象的值到另一個(gè)對(duì)象案例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-12-12C#利用TreeView控件實(shí)現(xiàn)目錄跳轉(zhuǎn)
這篇文章主要為大家詳細(xì)介紹了C#潤滑利用TreeView控件實(shí)現(xiàn)目錄跳轉(zhuǎn)功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以動(dòng)手嘗試一下2022-07-07C#實(shí)現(xiàn)動(dòng)態(tài)加載dll的方法
這篇文章主要介紹了C#實(shí)現(xiàn)動(dòng)態(tài)加載dll的方法,涉及針對(duì)動(dòng)態(tài)鏈接庫的靈活操作技巧,具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2014-12-12C#實(shí)現(xiàn)驗(yàn)證字符串的長度的方法詳解
這篇文章主要為大家詳細(xì)介紹了C#如何使用正則表達(dá)或者計(jì)算字符數(shù)組長度或字符串的長度來驗(yàn)證驗(yàn)證字符串的長度,感興趣的小伙伴可以學(xué)習(xí)一下2024-02-02C#實(shí)現(xiàn)在啟動(dòng)目錄創(chuàng)建快捷方式的方法
這篇文章主要介紹了C#實(shí)現(xiàn)在啟動(dòng)目錄創(chuàng)建快捷方式的方法,涉及C#快捷方式的創(chuàng)建技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-09-09