C#Socket多线程通信(聊天室)
2015-07-23 12:42
525 查看
网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket
一般有两个端,一个服务器端(ServerScoket)一个客户端(ClientSocket)
Socket是tcp\ip网络协议接口。内部定义了许多的函数和例程。可以看成是网络通信的一个端点
Socket又称"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求。
相信看这篇博客的朋友应该已经对socket通信有了初步的了解了吧,没了解的可以自行百度一下,这里不多做介绍了。
服务器与客户端是如何通信的呢,
其实就是服务器serversocket套接字,客户端clientsocket分别其本机ip地址与一个端口号绑定进行连接,连接成功后客户端就可以给服务器端发送消息了,服务器将信息存储下来,进行处理(发送给其他客户端或者发送回去)。
那么利用Socket多线程通信如何实现多人通信(聊天室)呢?
我是这样理解的,
服务器端:
1.先建立socketserver套接字,监听是否有客户端连接。
2.待某个客户端连接上时,将客户端client加入到Socket类型的数组clientsockets里,客户端数量自加socketNum++。
3.建立一个线程,和这个客户端通信(接收这个客户端发送的消息)。
4.将这个客户端发送的消息发送给全部
1.先建立socketserver套接字,监听是否有客户端连接。
2.待某个客户端连接上时,将客户端client加入到Socket类型的数组clientsockets里,客户端数量自加socketNum++。
建立Socket类型的数组clientsockets
将客户端client加入到Socket类型的数组clientsockets里,客户端数量自加socketNum++
1.建立一个线程
4.将这个客户端发送的消息发送给其他客户端
客户端
1.先建立client套接字,连接服务器端。
2.连接成功后,建立一个线程,来接收服务器发来的消息。
3.向服务器发送消息(聊天)。
1.先建立client套接字,连接服务器端。
2.连接成功后,建立一个线程,来接收服务器发来的消息。
3.向服务器发送消息(聊天)。
一般有两个端,一个服务器端(ServerScoket)一个客户端(ClientSocket)
Socket是tcp\ip网络协议接口。内部定义了许多的函数和例程。可以看成是网络通信的一个端点
Socket又称"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求。
相信看这篇博客的朋友应该已经对socket通信有了初步的了解了吧,没了解的可以自行百度一下,这里不多做介绍了。
服务器与客户端是如何通信的呢,
其实就是服务器serversocket套接字,客户端clientsocket分别其本机ip地址与一个端口号绑定进行连接,连接成功后客户端就可以给服务器端发送消息了,服务器将信息存储下来,进行处理(发送给其他客户端或者发送回去)。
那么利用Socket多线程通信如何实现多人通信(聊天室)呢?
我是这样理解的,
服务器端:
1.先建立socketserver套接字,监听是否有客户端连接。
2.待某个客户端连接上时,将客户端client加入到Socket类型的数组clientsockets里,客户端数量自加socketNum++。
3.建立一个线程,和这个客户端通信(接收这个客户端发送的消息)。
4.将这个客户端发送的消息发送给全部
1.先建立socketserver套接字,监听是否有客户端连接。
IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("172.20.0.229"), 6666); socketServer = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); socketServer.Bind(ipep); socketServer.Listen(10); Console.WriteLine("等待客户端连接");
2.待某个客户端连接上时,将客户端client加入到Socket类型的数组clientsockets里,客户端数量自加socketNum++。
建立Socket类型的数组clientsockets
private Socket[] clientsockets = new Socket[40];
将客户端client加入到Socket类型的数组clientsockets里,客户端数量自加socketNum++
Socket client = socketServer.Accept(); Console.WriteLine("连接成功"); clientsockets[socketNum++] = client;3.建立一个线程,和这个客户端通信(接收这个客户端发送的消息).
1.建立一个线程
Thread th = new Thread(new ParameterizedThreadStart (ReceiveData)); //建立一个线程,和这个客户端通信(接收客户端传来的信息) //建立了一个ParameterizedThreadStart委托,指明线程的入口方法为ReceiveData th.Start(client); //让服务器与这客户端之间的线程跑起来, //提供包含执行线程方法ReceiveData要使用的数据对象client2.和这个客户端通信(接收这个客户端发送的消息)
private void ReceiveData(object client) { Socket nowClient = (Socket)client; //不断接收客户端传来的消息,并发送给其他客户端 while (true) { int bytes = 0; byte[] data = new byte[1024]; try { bytes = nowClient.Receive(data);//接收客户端传来的消息 } catch (Exception e) { Console.WriteLine(e.ToString()); } string message = Encoding.UTF8.GetString(data, 0, bytes); data = Encoding.UTF8.GetBytes(message); SendAll(data); //将消息发送到其他客户端 } }
4.将这个客户端发送的消息发送给其他客户端
public void SendAll(byte[] data ) { //使用循环向colientsockets数组中的每一个客户端发送消息 for (int i = 0; i < socketNum ; i++) { clientsockets[i].Send(data); } }
客户端
1.先建立client套接字,连接服务器端。
2.连接成功后,建立一个线程,来接收服务器发来的消息。
3.向服务器发送消息(聊天)。
1.先建立client套接字,连接服务器端。
IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("172.20.0.229"), 6666); client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); try { client.Connect(ipep); //连接服务器成功 } catch (SocketException e) { Console.WriteLine(e.ToString()); } Console.WriteLine("连接服务器成功,请输入昵称");
2.连接成功后,建立一个线程,来接收服务器发来的消息。
Thread newthread = new Thread(new ThreadStart(ReceiveData)); newthread.Start();
3.向服务器发送消息(聊天)。
byte[] data1 = new byte[1024]; //发消息给服务器端 while (true) { string input = Console.ReadLine(); input = name + input; data1 = Encoding.UTF8.GetBytes(input); client.Send(data1); } client.Close (); Console.ReadLine ();
相关文章推荐
- .Net学习笔记----2015-07-23(C#基础复习11,字符串复习)
- c#使用正则表达式
- C#之IO读写文件方法封装代码
- C# WinForm动态调用远程Web服务
- c#高级编程第七版 学习笔记 第一章 .NET体系结构
- C#中Array.Sort() 快速排序-源码分析
- C#中Array.Sort() 快速排序-源码分析
- C# TreeView的使用以及节点的拖动
- C#OOP 之 this 和 base
- C# 6.0 编译器
- C#/.net给textbox添加回车事件
- C#读取XML文件,以及对XML文件的增删改查
- 可视化对比十多种排序算法(C#版)
- 如何使用C#操作幻灯片
- C#中将DataTable中数据导出到csv文件中
- C# 委托(delegate)使用之一二三步
- 在Visual studi C#的“///”注释内容生成XML文档
- C#异常处理
- C#汉字转十六进制
- c# 读取文件流