C#_Socket

一、基本语法

服务器端示例

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

namespace Socket服务器端
{
    class Program
    {
        static void Main(string[] args)
        {
            Socket TcpServer = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            IPAddress ipaddress = new IPAddress(new byte[]{ 192,168,0,113});
            EndPoint endPoint = new IPEndPoint(ipaddress, 230);
            TcpServer.Bind(endPoint);//向操作系统申请一个可用的ip和端口号 用来通信
            TcpServer.Listen(100);//参数是最大连接数
            Socket clientSocket = TcpServer.Accept();//暂停当前线程,直到有一个客户端连接进来,之后进行下面的代码
            //下面使用返回的Socket做通信。
            Console.WriteLine( clientSocket.RemoteEndPoint.ToString());//输出客户端ip和端口
            byte[] sendbyte = new byte[1024];
            byte[] recebyte = new byte[1024];
            string sendString = "你好啊";
            sendbyte = Encoding.UTF8.GetBytes(sendString);//对字符串做编码,得到一个字符串的字节数组。
            clientSocket.Send(sendbyte);
            int length = clientSocket.Receive(recebyte);
            Console.WriteLine(Encoding.UTF8.GetString(recebyte, 0, length));
            Console.ReadKey();
        }
    }
}

客户端示例

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

namespace Socket客户端
{
    class Program
    {
        static void Main(string[] args)
        {
            Socket TcpClient = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
            IPAddress ipAddress = IPAddress.Parse("192.168.0.113");
            EndPoint EP = new IPEndPoint(ipAddress, 230);
            TcpClient.Connect(EP);
            byte[] data = new byte[1024];
            int length = TcpClient.Receive(data);
            string message = Encoding.UTF8.GetString(data, 0, length);
            Console.WriteLine(message);
            message = Console.ReadLine();
            data = Encoding.UTF8.GetBytes(message);
            TcpClient.Send(data);
            Console.ReadKey();
        }
    }
}

二、一主多从,接受多个客户端信息示例

    class Program
    {
        static List<Client> ClientMange = new List<Client>();
        public static void BordCastMessage(string message)
        {
            var UnConntct = new List<Client>();
            foreach(var i in ClientMange)
            {
                if(i.isConnect == true)
                {
                    i.SendMassage(message);
                }
                else
                {
                    UnConntct.Add(i);
                }
            }
            foreach(var i in UnConntct)
            {
                ClientMange.Remove(i);
            }
        }
        static void Main(string[] args)
        {
            Socket TcpServer = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            TcpServer.Bind(new IPEndPoint(IPAddress.Parse("192.168.0.113"), 2233));
            TcpServer.Listen(100);
            Console.WriteLine("连接监听开始");
            while (true)
            {
                Socket Client_Socket = TcpServer.Accept();
                Console.WriteLine("有一个客户端进入");
                Client client = new Client(Client_Socket);
                ClientMange.Add(client);
            }
            Console.ReadKey();
            Console.ReadKey();

        }
    }
    class Client
    {
        Socket Client_Socket;
        Thread T;
        byte[] ReceData;
        byte[] SendData;
        public bool isConnect;
        int length;
        public Client(Socket s)
        {
            ReceData = new byte[1024];
            SendData = new byte[1024];
            Client_Socket = s;
            isConnect = true;
            
            T = new Thread(Message_Dispose);
            T.Start();
        }
        void Message_Dispose()
        {
            while (true)
            {
                try
                {
                    length = Client_Socket.Receive(ReceData);
                }
                catch(System.Net.Sockets.SocketException e)
                {
                    Console.WriteLine(e.ToString());
                    break;
                }
                //if (Client_Socket.Poll(10,SelectMode.SelectRead)) break;

                if (length != 0)
                {
                    Console.WriteLine("有消息" + "|" + Encoding.UTF8.GetString(ReceData, 0, length) + "|" + length.ToString());
                    Program.BordCastMessage(Encoding.UTF8.GetString(ReceData));
                }
                else
                {
                    isConnect = false;
                    break;
                } 
            }
        }
        public void SendMassage(string message)
        {
            SendData = Encoding.UTF8.GetBytes(message);
            Client_Socket.Send(SendData);
        }
    }

重点在于死循环接受客户端连接,使用客户端类包装sokect,再用集合管理客户端实列。

将客户端的消息分发给每个客户端,使用交叉调用的方式。(在客户端类的函数中调用->program类的函数,而这个program类的函数本身又调用客户端的函数).

三、TcpListener TcpClient UdpClient

TcpListener

        static void Main(string[] args)
        {
            TcpListener Listener = new TcpListener(new IPEndPoint(IPAddress.Parse("192.168.0.113"), 2333));
            Listener.Start();
            TcpClient tcpClient = Listener.AcceptTcpClient();
            Console.WriteLine("有一个客户端连接");
            NetworkStream stream = tcpClient.GetStream();
            byte[] data = new byte[1024];
            int length;
            while (true)
            {

                try
                {
                    length = stream.Read(data, 0, 1024);
                }
                catch
                {
                    Console.WriteLine("客户中断了连接");
                    break;
                }
                Console.WriteLine(Encoding.UTF8.GetString(data,0 ,length)); 
            }
            stream.Close();
            tcpClient.Close();
            Listener.Stop();
            Console.WriteLine("资源释放完成");
            Console.ReadKey();
            
        }
    }

TcpClient

    class Program
    {
        static void Main(string[] args)
        {
            string message;
            byte[] data = new byte[1024];
            TcpClient tcpClient = new TcpClient();
            tcpClient.Connect(new IPEndPoint(IPAddress.Parse("192.168.0.113"), 2333));
            NetworkStream stream = tcpClient.GetStream();
            while (true)
            {
                message = Console.ReadLine();
                data = Encoding.UTF8.GetBytes(message);
                stream.Write(data, 0, data.Length);
            }
            tcpClient.Close();
            stream.Close();

        }
    }

UdpClient

            UdpClient server = new UdpClient(new IPEndPoint(IPAddress.Parse("192.168.0.113"), 2333));
            IPEndPoint client = new IPEndPoint(IPAddress.Any, 0);
            byte[] data = server.Receive(ref client);
            Console.WriteLine(Encoding.UTF8.GetString(data));
            UdpClient client = new UdpClient();
            IPEndPoint server = new IPEndPoint(IPAddress.Parse("192.168.0.113"), 2333);
            byte[] data = Encoding.UTF8.GetBytes(Console.ReadLine());
            client.Send(data, data.Length, server);

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值