基于TCP传输协议,服务器一对多客户端Socket通信

服务器和客户端通信过程:

服务端:

1.创建用于监听消息的套接字(Socket);

2.将套接字绑定到本地地址和端口上(可使用Bind函数);

3.设置监听模式(可使用listen函数);

4.等待客户请求;

5.通信;

6.关闭套接字;

客户端:

1.创建套接字;

2.向服务器发送连接请求;

3.通信;

4.关闭套接字;

注意:运行时,请先启动服务器,再启动客户端。

服务器端代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.IO;

namespace Server
{
    public class Program
    {
        static void Main(string[] args)
        {                             
            Socket tcpServer = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //定义一个套接字用于监听客户端发来的信息  包含3个参数(IP4寻址协议,流式连接,TCP协议)
            EndPoint point = new IPEndPoint(IPAddress.Any, 1234); //将IP地址和端口号绑定到网络节点point上,端口号无要求4-6位即可
            tcpServer.Bind(point);//监听绑定的网络节点
            tcpServer.Listen(1000);//将套接字的监听队列长度限制为100
            Socket socConnection = null; //创建一个负责和客户端通信的套接字
            string RemoteEndPoint; //客户端网络结点号
            Dictionary<string, Socket> dic = new Dictionary<string, Socket> { };  //定义一个字典,存储客户端信息
            while (true)  //持续不断监听客户端发来的请求
            {
                try
                {
                    socConnection = tcpServer.Accept(); //暂停当前线程,直到有一个客户端连接过来
                }
                catch (Exception ex)//捕获异常
                {
                    Console.WriteLine(ex.Message);  
                    break;
                }
                IPAddress clientIP = (socConnection.RemoteEndPoint as IPEndPoint).Address;//获取客户端的IP
                int clientPort = (socConnection.RemoteEndPoint as IPEndPoint).Port; //获取客户端的端口号
                RemoteEndPoint = socConnection.RemoteEndPoint.ToString(); //客户端网络结点号   
                dic.Add(RemoteEndPoint, socConnection);  //添加客户端信息
                string message = "you have connected server!";
                socConnection.Send(Encoding.UTF8.GetBytes(message));//给客户端发送一个消息,表示客户端与服务器已建立连接
                Console.WriteLine(RemoteEndPoint);//输出客户端IP地址和端口号
            }
        }
    }
}

客户端代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;

namespace Client
{
    class Client
    {
        static void Main(string[] args)
        {
            while (true)//持续不断的监听,也可采用其他形式,如线程
            {
                try
                {
                    Socket tcpClient = null;
                    tcpClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //定义一个套字节监听  包含3个参数(IP4寻址协议,流式连接,TCP协议)
                    IPAddress ipaddress = IPAddress.Parse("10.123.456.789");//定义IP
                    EndPoint point = new IPEndPoint(ipaddress, 1234); //将IP地址和端口号绑定到网络节点point上
                    tcpClient.Connect(point); //客户端套接字连接到网络节点
                    while (true)//持续监听服务端发来的消息
                    {
                        try
                        {
                            byte[] receiveMessage = new byte[1024 * 1024];  //定义一个1M的内存缓冲区,用于临时性存储接收到的消息
                            int length = tcpClient.Receive(receiveMessage);   //将客户端套接字接收到的数据存入内存缓冲区,并获取长度               
                            string strRevMsg = Encoding.UTF8.GetString(receiveMessage, 0, length); //将套接字获取到的字符数组转换为字符串
                            Console.WriteLine(strRevMsg);//输出接收到服务器端的消息
                        }
                        catch (Exception ex)//捕获异常
                        {
                            Console.WriteLine(ex);
                        }
                    }
                }
                catch (Exception ex)//捕获异常
                {
                    Console.WriteLine(ex);
                }
            }
        }
    }
}

若有写的不够好的地方,欢迎留言,请多多指教,谢谢!

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值