欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C#簡單聊天室雛形

 更新時(shí)間:2022年02月11日 11:14:39   作者:52unity  
這篇文章主要為大家詳細(xì)介紹了C#簡單聊天室雛形,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

本文實(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ì)列的示例代碼

    這篇文章主要介紹了C#調(diào)用RabbitMQ實(shí)現(xiàn)消息隊(duì)列的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • C#中Clone一個(gè)對(duì)象的值到另一個(gè)對(duì)象案例

    C#中Clone一個(gè)對(duì)象的值到另一個(gè)對(duì)象案例

    這篇文章主要介紹了C#中Clone一個(gè)對(duì)象的值到另一個(gè)對(duì)象案例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • Unity3d 使用Gizmos畫一個(gè)圓圈

    Unity3d 使用Gizmos畫一個(gè)圓圈

    這篇文章主要介紹了Unity3d 使用Gizmos畫一個(gè)圓圈的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • c# Thread類線程常用操作詳解

    c# Thread類線程常用操作詳解

    這篇文章主要介紹了c# Thread類線程常用操作詳解的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)使用c#,感興趣的朋友可以了解下
    2021-03-03
  • C#利用TreeView控件實(shí)現(xiàn)目錄跳轉(zhuǎn)

    C#利用TreeView控件實(shí)現(xiàn)目錄跳轉(zhuǎn)

    這篇文章主要為大家詳細(xì)介紹了C#潤滑利用TreeView控件實(shí)現(xiàn)目錄跳轉(zhuǎn)功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以動(dòng)手嘗試一下
    2022-07-07
  • C#實(shí)現(xiàn)動(dòng)態(tài)加載dll的方法

    C#實(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-12
  • C#操作DataTable的實(shí)現(xiàn)步驟

    C#操作DataTable的實(shí)現(xiàn)步驟

    本文主要介紹了C#操作DataTable的實(shí)現(xiàn)步驟,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • C#實(shí)現(xiàn)驗(yàn)證字符串的長度的方法詳解

    C#實(shí)現(xiàn)驗(yàn)證字符串的長度的方法詳解

    這篇文章主要為大家詳細(xì)介紹了C#如何使用正則表達(dá)或者計(jì)算字符數(shù)組長度或字符串的長度來驗(yàn)證驗(yàn)證字符串的長度,感興趣的小伙伴可以學(xué)習(xí)一下
    2024-02-02
  • C#實(shí)現(xiàn)在啟動(dòng)目錄創(chuàng)建快捷方式的方法

    C#實(shí)現(xiàn)在啟動(dòng)目錄創(chuàng)建快捷方式的方法

    這篇文章主要介紹了C#實(shí)現(xiàn)在啟動(dòng)目錄創(chuàng)建快捷方式的方法,涉及C#快捷方式的創(chuàng)建技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-09-09
  • C#?Razor語法規(guī)則

    C#?Razor語法規(guī)則

    這篇文章介紹了C#?Razor的語法規(guī)則,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-01-01

最新評(píng)論