C# socket通信实现两个控制台之间聊天详解编程语言
2023-06-13 09:20:30 时间
图1 启动服务端
图2 启动客户端
图3 客户发消息
图4 服务端发消息
图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相关文章
- C# 项目没有.sln文件的解决办法:
- C#验证二代身份证号码
- c# mysql executenonquery_C#与数据库访问技术总结(八)之ExecuteNonQuery方法
- 详解C# WinForm如何实现自动更新程序的案例分享
- c# 多线程并发-金三银四面试:C#.NET面试题高级篇2-多线程
- C与MSSQL数据库连接实现快速数据操作(c# mssql 连接)
- C#操作符之二算数操作符
- C#委托(delegate)的小例子
- c#使用linq技术创建xml文件的小例子
- C#合并GriewView相同列的小例子
- 关于C#TabPage如何隐藏的问题
- C#DataTable转换为实体类对象实例
- C#正则表达式分解和转换IP地址实例(C#正则表达式大全c#正则表达式语法)
- C#简单的通用基础字典实现方法
- C#中ref和out的区别浅析
- java和c#使用hessian通信的方法