zoukankan      html  css  js  c++  java
  • Socket编程

    TCP协议

    以下只是进行了一次的收发例子。

    客户端和服务器端是两个解决方案。

    服务器端
    static void main(string[] args){
    //1.创建Socket对象
    Socket tcpServer=new Socket(AddressFamily.InterNetworl,SocketType.Stream,ProtocolType.Tcp);
     //2.绑定IP和端口号(软件的端口号唯一)
    IPAddress ipaddress=new IPAddress(new byte[]{192,168,0,112});
    EndPoint point=new EndPoint(ipaddress,7788);
    tcpServer.Bind(point);//向操作系统申请一个可用的ip和端口号用来做通信
    //3.开始监听(等待客户端连接)
    tcpServer.Listen(100);//最大连接数
    Socket clientSocket=tcpServer.Accept();//暂停当前线程,直到有一个客户端连接过来,之后进行下面的代码
    //使用返回的Socke跟客户端做通信
    string message="hello 欢迎你";
    byte[] data=Encodeing.UTF8.GetBytes(message);//对字符串做编码,得到一个字符串的字节数组
    clientSocket.Send(data):
    byte[]data2= new byte[1024];//创建一个字节数组接收客户端发过来的数据
    int length=clientSocket.Receive(data2);
    string message2=Encoding.UTF8.GetString(data2,0,length);
    Console.WriteLine(message2);
    }
    
    客户端
    static void main(string[] args){
    //1.创建Socket对象
    Socket tcpClient=new Socket(AddressFamily.InterNetworl,SocketType.Stream,ProtocolType.Tcp);
    //2.发起建立连接的请求
    IPAddress ipaddress=IPAddress.Parse("192.168.0.112")//可以把一个字符串的ip地址转换成一个ipaddress的对象
    EndPoint point=new IPEndPoint(ipaddress,7788);//端口号保持一致
    tcpClient.Connect();//通过IP和端口号来定位一个要连接到的服务器端
    byte[] data = new byte[1024];
    int length=tcpClient.Receive(data);//这里传递一个byte数组,实际上这个data数组用来接收数据
    //Length表示返回值接收了多少字节的数据
    string message=Encoding.UTF8.GetString(data,0,length);//只把接收到的数据做个转化
    Console.WriteLine(message);
    //向服务器端发送消息
    string message2=Console.ReadLine();//读取用户的输入,把输入的信息发送到服务器端
    tcpClient.Send(Encoding.UTF8.GetBytes(message2));//把字符串变为字节。
    }

     TCP一直收发

    Client完成对服务器端的操作 客户端类似

     class Client
        {
    
            private Socket clientSocket;
            Thread t;
            private byte[] data = new byte[1024];//字节数据容器
            public Client(Socket s)
            {
                clientSocket = s;
                //启动一个线程 处理客户端的数据接收
                 t = new Thread(ReceiveMessage);
                 t.Start();
            }
    
            public void ReceiveMessage()
            { 
                //一直接受客户端的数据
                while (true)
                {
                    //在接收数据之前 判断一下socket连接是否断开
                    if(clientSocket.Poll(10,SelectMode.SelectRead))//第一个参数响应时间,第二个参数选择模式,返回true 则断开连接
                    {
                        clientSocket.Close();
                        break;//终止
                    }
                    int length= clientSocket.Receive(data);
                    string message = Encoding.UTF8.GetString(data, 0, length);
                    //服务器端接受到数据要把这个数据分发到客户端
                    Program.BroadcastMessage(message);
                }
            }
            /// <summary>
            /// 发送消息
            /// </summary>
            /// <param name="message"></param>
            public void SendMessage(string message)
            {
                byte[] data = Encoding.UTF8.GetBytes(message);
                clientSocket.Send(data);
            }
    
        }
    static List<Client> clientlist = new List<Client>(); 
    static void Main(string[] args)
            {
    Socket tcpServer = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//创建Socket
                tcpServer.Bind(new IPEndPoint(IPAddress.Parse("10.85.30.167"), 7788));//绑定IP和端口
                tcpServer.Listen(100);//监听
                Console.WriteLine("server runing...");
                while (true)
                {
                    Socket clientSocket = tcpServer.Accept();//等待客户端连接
                    Console.WriteLine("a client is connected!!");
                    Client client = new Client(clientSocket);//把客户端通信逻辑放到class Clinet里面处理
                    clientlist.Add(client);
                }}
     /// <summary>
            /// 广播消息
            /// </summary>
            /// <param name="message"></param>
            public static void BroadcastMessage(string message)
            {
                foreach (var client in clientlist)
                {
                    client.SendMessage(message);
                }
            }
     

    UDP 协议

                 //服务器端
                //1.创建socket
                Socket udpServer = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);//创建Socket udp 
                //2.绑定IP和端口号
                udpServer.Bind(new IPEndPoint(IPAddress.Parse("10.85.30.167"), 7788));//绑定IP和端口 IPEndPoint为包含IP和端口的节点
                //3.接受数据
                EndPoint remoteEndPoint = new IPEndPoint(IPAddress.Any, 0);
                byte[] data = new byte[1024];
                int length = udpServer.ReceiveFrom(data, ref remoteEndPoint);//这个方法把数据来源放在第二个参数上
                string message = Encoding.UTF8.GetString(data, 0, length);
                //客户端
                //1.创建socket
                Socket udpClient = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);//创建Socket udp 
                //2.发送数据
                EndPoint serverPoint= new IPEndPoint(IPAddress.Parse("10.85.30.167"),7788);
                string messagesend = Console.ReadLine();
                byte[] dataudp = Encoding.UTF8.GetBytes(messagesend);
                udpClient.SendTo(dataudp, serverPoint);
                //udp无所谓连接是不是关闭,如果需要一直的接收发,只需要while(true)循环的发送和接收消息 用一个线程执行发送和接收方法

    两者区别:  UDP不需要建立连接,TCP需要建立连接。

                     UDP对资源要求少,TCP对资源要求多

                     UDP程序结构简单

                     UDP数据报模式,TCP是流模式

                     TCP保证数据正确性,UDP可能丢包,TCP保证数据顺序,UDP不保证。

  • 相关阅读:
    Const is faster than static const
    创新点子:博客图文混编工具
    Performance Optimization Articles
    Notes on distributed rendering
    Tested distancebased sorting and axisbased sorting
    How do exes/dlls generated with the /platform:x switch interact?
    SQL中判断字符串中包含字符的方法
    C#获取指定IP的主机名
    将ArrayList设为wpf的数据源
    WPF的DataGrid中DataGridHyperlinkColumn的用法
  • 原文地址:https://www.cnblogs.com/cdjbolg/p/11930795.html
Copyright © 2011-2022 走看看