C#簡單聊天室雛形
本文實(shí)例為大家分享了C#簡單聊天室雛形的具體代碼,供大家參考,具體內(nè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ù)器啟動成功");
? ? ? ? }?
? ? }主程序:
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()
? ? ? ? {
? ? ? ? ? ? //接收客戶端方法,會掛起當(dāng)前線程
? ? ? ? ? ? Socket client = serverSocket.Accept();
? ? ? ? ? ? IPEndPoint point = client.RemoteEndPoint as IPEndPoint;
? ? ? ? ? ? Console.WriteLine(point.Address + "[" + point.Port + "]連接成功");
? ? ? ? ? ? Accept(); ? //尾遞歸
? ? ? ? }因?yàn)橐诜?wù)器啟動就要去檢測有沒有連接到服務(wù)器的ip,所以需要在start方法中開辟一個(gè)新的線程來調(diào)用Accept方法
Thread threadAccept = new Thread(Accept); ?//接收一個(gè)委托方法 ? ? ? ? ? ? threadAccept.IsBackground = true; ?//設(shè)置為后臺線程 ? ? ? ? ? ? threadAccept.Start();
下一步就是客戶端要往服務(wù)器發(fā)送消息
客戶端的ClientControl類代碼:
public void Send(string msg) ?
? ? ? ? {
? ? ? ? ? ?clientSocket.Send(Encoding.UTF8.GetBytes(msg));
? ? ? ? }客戶端主程序調(diào)用代碼:
Console.WriteLine("請輸入要發(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í)行同樣會掛起線程,所以要開辟一個(gè)新的線程,因?yàn)檫@是接收客戶端的消息,所以這個(gè)新線程要寫在剛才寫的Accept方法里面
Thread threadReceive = new Thread(Receive); ? ? ? ? ? ? threadReceive.IsBackground = true; ? ? ? ? ? ? threadReceive.Start(client);
附加:
剛才不是寫了一個(gè)服務(wù)器接收到消息,會給客戶端返回一個(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)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C#使用Socket發(fā)送和接收TCP數(shù)據(jù)實(shí)例
這篇文章主要介紹了C#使用Socket發(fā)送和接收TCP數(shù)據(jù)的實(shí)現(xiàn)方法,以實(shí)例的形式詳細(xì)講述了C#實(shí)現(xiàn)socket通信的完整實(shí)現(xiàn)過程,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2014-10-10
c#之圓形無標(biāo)題欄橢圓窗體的實(shí)現(xiàn)詳解
本篇文章是對c#中圓形無標(biāo)題欄橢圓窗體的實(shí)現(xiàn)方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06
C#實(shí)現(xiàn)文件讀寫到SQLite數(shù)據(jù)庫
這篇文章主要為大家詳細(xì)介紹了使用?C#?將文件讀寫到?SQLite?數(shù)據(jù)庫的幾種方法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以參考一下2025-01-01
Unity UGUI實(shí)現(xiàn)卡片橢圓方向滾動
這篇文章主要為大家詳細(xì)介紹了UGUI實(shí)現(xiàn)卡片橢圓方向滾動效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-03-03
C#實(shí)現(xiàn)自定義Dictionary類實(shí)例
這篇文章主要介紹了C#實(shí)現(xiàn)自定義Dictionary類,較為詳細(xì)的分析了Dictionary類的功能、定義及用法,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-08-08

