zl程序教程

您现在的位置是:首页 >  后端

当前栏目

C# socket通信实现两个控制台之间聊天详解编程语言

c#通信编程语言 实现 详解 两个 之间 socket
2023-06-13 09:20:30 时间

C# socket通信实现两个控制台之间聊天详解编程语言

图1 启动服务端

C# socket通信实现两个控制台之间聊天详解编程语言

图2 启动客户端

C# socket通信实现两个控制台之间聊天详解编程语言

图3 客户发消息

C# socket通信实现两个控制台之间聊天详解编程语言

图4 服务端发消息

C# socket通信实现两个控制台之间聊天详解编程语言

图5 客户主动关闭,服务段打印异常详情

2、服务器端源码

服务端和客户端都要添加一下namespace:

using System.Net;

using System.Net.Sockets;

using System.Threading;

源码:

 class Program 

 { 

 private static string serverIP = "192.168.3.42";//本机ip地址 

 private static int serverPort = 8888; 

 private static int bufferSize = 1024; 

 private static int count = 0;//表示对话序号 

 static void Main(string[] args) 

 { 

 IPAddress ip = IPAddress.Parse(serverIP); 

 IPEndPoint ipe = new IPEndPoint(ip, serverPort); 

 Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 

 try 

 { 

 s.Bind(ipe); 

 s.Listen(10); 

 Console.WriteLine("等待连接……"); 

 } 

 catch (Exception ex) 

 { 

 Console.WriteLine(ex); 

 } 

 Thread mainTrd = new Thread(Run); 

 mainTrd.Start(s); 

 } 

 ///  summary 

 /// 启动服务器的socket。 

 /// 此处要想修改为多用户连接,对每个新用户都new一个RecMsg线程,并且Dictionary T1,T2 存储每一对ipe和socket即可 

 ///  /summary 

 ///  param name="o" 传入的socket对象 /param 

 private static void Run(object o) 

 { 

 Socket socket = o as Socket; 

 try 

 {  

 Socket connSocket = socket.Accept(); 

 //客户和服务器连接成功。 

 Console.WriteLine("{0}成功连接到本机。", connSocket.RemoteEndPoint); 

 //接下来的事情交给会话线程 

 Thread recTh = new Thread(RecMsg); 

 recTh.Start(connSocket); 

 Thread sendTh = new Thread(SendMsg); 

 sendTh.Start(connSocket); 

 } 

 catch (Exception ex) 

 { 

 Console.WriteLine(ex); 

 throw; 

 } 

 } 

 private static void RecMsg(object o) 

 { 

 Socket connSocket = o as Socket; 

 while (true) 

 { 

 byte[] buffer = new Byte[bufferSize]; 

 try 

 { 

 int length = connSocket.Receive(buffer); 

 byte[] realBuffer = new Byte[length]; 

 Array.Copy(buffer, 0, realBuffer, 0, length); 

 string str = System.Text.Encoding.Default.GetString(realBuffer); 

 Console.Write("[{0}] ", count++); 

 Console.WriteLine("{0}说:{1}.", connSocket.RemoteEndPoint, str); 

 } 

 catch (Exception ex) 

 { 

 Console.WriteLine(ex); 

 Console.ReadKey(); 

 break; 

 }  

 } 

 } 

 private static void SendMsg(object o)  

 { 

 Socket connSocket = o as Socket; 

 while (true) 

 { 

 string str = Console.ReadLine(); 

 if (str != string.Empty) 

 { 

 byte[] buffer = Encoding.Default.GetBytes(str); 

 connSocket.Send(buffer, buffer.Length, SocketFlags.None); 

 }  

 } 

 } 

 }

3、客户端源码
class Program 

 { 

 private static string host = "192.168.3.42"; 

 private static int port = 8888; 

 private static int bufferSize = 1024; 

 static IPAddress ip = IPAddress.Parse(host); 

 static IPEndPoint ipe = new IPEndPoint(ip, port); 

 private static int count = 0;//表示对话序号 

 static void Main(string[] args) 

 {  

 Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 

 try 

 { 

 s.Connect(ipe); 

 Console.WriteLine("成功连接到{0}。", s.RemoteEndPoint); 

 Console.WriteLine("请输入要发送给服务器的话,按Enter发送。"); 

 } 

 catch (Exception ex) 

 { 

 Debug.WriteLine(ex); 

 throw; 

 } 

 Thread clientTh = new Thread(SendToServer); 

 clientTh.Start(s); 

 Thread recTh = new Thread(RecMsg); 

 recTh.Start(s);  

 } 

 private static void RecMsg(object o) 

 { 

 Socket connSocket = o as Socket; 

 while (true) 

 { 

 byte[] buffer = new Byte[bufferSize]; 

 try 

 { 

 int length = connSocket.Receive(buffer); 

 byte[] realBuffer = new Byte[length]; 

 Array.Copy(buffer, 0, realBuffer, 0, length); 

 string str = System.Text.Encoding.Default.GetString(realBuffer); 

 Console.Write("[{0}] ", count++); 

 Console.WriteLine("{0}说:{1}.", connSocket.RemoteEndPoint, str); 

 } 

 catch (Exception ex) 

 { 

 Console.WriteLine(ex); 

 Console.ReadKey(); 

 break; 

 } 

 } 

 } 

 private static void SendToServer(object o) 

 {  

 Socket socket = o as Socket;  

 while (true) 

 { 

 try 

 { 

 string str = Console.ReadLine();  

 if (str != string.Empty) 

 { 

 byte[] bt = Encoding.Default.GetBytes(str); 

 socket.Send(bt, bt.Length, 0); 

 } 

 } 

 catch (Exception ex) 

 { 

 Console.WriteLine("发送失败。"); 

 Debug.WriteLine(ex); 

 throw; 

 } 

 }  

 } 

 }

来自:http://my.oschina.net/SnifferApache/blog/406563

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/11103.html

c