Socket通信

简单的Socket通信

Socket-TcpClient,TcpListener,UdpClient

应用程序可以通过TcpClient、TcpListener和UdpClient类使用传输控制协议(Tcp)和用户数据报协议(Udp)服务。这些协议类建立在System.Net.Sockets.Socket类的基础之上,负责数据传送的细节。(也就是说TcpClient、TcpListener和UdpClient类是用来简化Socket)
TcpClient和TcpListener使用NetWork类表示网络。使用GetStream方法返回网络流,然后调用该流的Read和Write方法。NetWorkStream不拥有协议类的基础套接字,因此关闭它并不影响套接字。
UdpClient类使用字节数组保存Udp数据文报,使用send方法网络发送数据,使用Receive方法接收传入的数据文报。

ClientSocket

class ClientTest
    {
        private Socket clientsocket;
        public ClientTest()
        {
        	//可启动多个客户端与服务器建立连接
            clientsocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        }
        public void Connect(string ip,int port)
        {
            clientsocket.Connect(ip,port);
            Console.WriteLine("客户端连接成功!");
            Thread threadReceive = new Thread(Receive);
            threadReceive.IsBackground = true;
            threadReceive.Start();
        }
        public void send(string msg)
        {
        	//客户端向服务器发送数据
            clientsocket.Send(Encoding.UTF8.GetBytes(msg));
        }
        //接收服务器发送的数据
        public void Receive()
        {
            while (true)
            {
                try
                {
                    byte[] msg = new byte[1024];
                    int msgLength = clientsocket.Receive(msg);
                    Console.WriteLine("服务器说:"+Encoding.UTF8.GetString(msg,0,msgLength));
                }
                catch (Exception)
                {
                    Console.WriteLine("服务器已断开!");
                    break;
                }
            }
        }
    }
class Program
    {
        static void Main(string[] args)
        {
            ClientTest clientsocket = new ClientTest();
            //连接服务器设置的ip地址和端口号
            clientsocket.Connect("169.254.83.38", 12321);
            Console.WriteLine("请输入向服务器发送的消息,输入quit表示退出!");
            string msg = Console.ReadLine();
            while (msg != "quit")
            {
                clientsocket.send(msg);
                msg = Console.ReadLine();
            }
            Console.ReadKey();
        }
    }

ServerTest

class ServerTest
    {
        private Socket serversocket;
        //客户端列表
        private List<Socket> clientList;
        public ServerTest()
        {
            serversocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            clientList = new List<Socket>();
        }
        public void start()
        {
            serversocket.Bind(new IPEndPoint(IPAddress.Any, 12321));
            serversocket.Listen(10);
            Console.WriteLine("服务器启动成功");
            Thread threadaccept = new Thread(Accept);
            threadaccept.IsBackground = true;
            threadaccept.Start();
        }
        private void Accept()
        {
        	//服务器监听到的客户端Socket
            Socket client = serversocket.Accept();
            IPEndPoint ip = client.RemoteEndPoint as IPEndPoint;
            Console.WriteLine(ip.Address+"["+ip.Port+"]:客户端连接成功!");
            //将连接成功的客户端添加到客户端列表中
            clientList.Add(client);
            Thread threadreceive = new Thread(Receive);
            threadreceive.IsBackground = true;
            threadreceive.Start(client);
            Accept();
        }
        private void Receive(object obj)
        {
            Socket client = obj as Socket;
            IPEndPoint point = client.RemoteEndPoint as IPEndPoint;
            try
            {
                byte[] msg = new byte[1024];
                int msgLength = client.Receive(msg);
                //服务器界面显示客户端发送过来的数据
                string msgBroad = point.Address + "[" + point.Port + "]" + Encoding.UTF8.GetString(msg, 0, msgLength);
                Console.WriteLine(msgBroad);
                //服务器将接收到的数据广播到其他的客户端
                BroadCast(client, msgBroad);
                Receive(client);
            }
            catch (Exception)
            {
                Console.WriteLine(point.Address + "[" + point.Port + "]:已断开!");
                clientList.Remove(client);
                throw;
            }
        }
        //将数据发送给其他的客户端
        private void BroadCast(Socket clientOther, string msg)
        {
            foreach (var client in clientList)
            {
                if (client != clientOther)
                {
                    client.Send(Encoding.UTF8.GetBytes(msg));
                }
            }
        }
    }
class Program
    {
        static void Main(string[] args)
        {
            ServerTest server = new ServerTest();
            server.start();
            //Console.WriteLine("本地端口号:" + GetLocalIp());
            Console.ReadKey();
        }
        public static string GetLocalIp()
        {
        	//用于获取本地端口号
            IPAddress local_ip;
            try
            {
                IPAddress[] ips;
                ips = Dns.GetHostAddresses(Dns.GetHostName());
                local_ip = ips.First(ip => ip.AddressFamily == AddressFamily.InterNetwork);
                return local_ip.ToString();
            }
            catch (Exception)
            {
                Console.WriteLine("====本地ip获取失败!====");
                return null; ;
            }
        }
    }

运行结果

在这里插入图片描述在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值