您的位置:首页 > 编程语言 > C#

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套接字,监听是否有客户端连接。
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要使用的数据对象client
2.和这个客户端通信(接收这个客户端发送的消息)
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 ();
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: