zoukankan      html  css  js  c++  java
  • TCP UDP基本编程(一)

    tcp udp均可以用来网络通信,在使用之前建议先搜索一下相关网络连接的基本知识,可以更好的理解和使用,tcp建议看下如下文章:https://blog.csdn.net/chuangsun/article/details/67640242,建议多搜一下多看看。

    直接上正文。。。。。。。。。。。。。。。

    (1)socket类

    采用socket类,使用最基本的同步方法

    tcp服务端

    using System;
    using System.Net;
    using System.Net.Sockets;
    using System.Text;
    using System.Threading;
    
    namespace net
    {
        class Program
        {
            static void Main(string[] args)
            {
                string host = "127.0.0.1";
                IPAddress ip = IPAddress.Parse(host);
    
                //定义侦听端口
                //IPEndPoint ipEnd = new IPEndPoint(IPAddress.Any, 8889);
                IPEndPoint ipEnd = new IPEndPoint(IPAddress.Any, 8889);
                Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                socket.Bind(ipEnd);
                socket.Listen(10);
                Console.Write("Waiting for a client
    ");
    
                //一旦接受连接,创建一个客户端
                Socket client = socket.Accept();
                IPEndPoint ipEndClient = (IPEndPoint)client.RemoteEndPoint;
                Console.Write("已连接:IP: {0}  端口: {1}
    ", ipEndClient.Address, ipEndClient.Port);
    
                while(true)
                {
                    //接收数据
                    byte[] recv1 = new byte[1024];
                    int count1 = client.Receive(recv1);
                    string str = Encoding.ASCII.GetString(recv1, 0, count1);
                    Console.WriteLine("Client:" + Encoding.ASCII.GetString(recv1, 0, count1));
    
                    if(str=="exit")
                    {
                        break;
                    }
    
                    //发送数据
                    string welcome = "Server received:"+ str;
                    byte[] data = new byte[1024];
                    data = Encoding.ASCII.GetBytes(welcome);
                    client.Send(data, data.Length, SocketFlags.None);
                }
    
                Thread.Sleep(10000);
                Console.Write("
    断开连接: {0}", ipEndClient.Address);
                client.Close();
                socket.Close();
                Console.ReadKey();
            }
        }
    }

    tcp客户端

    using System;
    using System.Net;
    using System.Net.Sockets;
    using System.Collections.Generic;
    using System.Text;
    using System.Threading;
    
    
    namespace client
    {
        class Program
        {
            static void Main(string[] args)
            {
                //定义主机的IP及端口
                IPAddress ip = IPAddress.Parse("127.0.0.1");
                IPEndPoint ipEnd = new IPEndPoint(ip, 8889);
                Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                socket.Connect(ipEnd);
    
                while(true)
                {
                    //发送数据
                    string msg = Console.ReadLine();
                    byte[] msgBytes = new byte[1024];
                    msgBytes = Encoding.ASCII.GetBytes(msg);
                    socket.Send(msgBytes, msgBytes.Length, SocketFlags.None);
    
                    //接收数据
                    byte[] recvMsg = new byte[1024];
                    int count = socket.Receive(recvMsg);
                    string recvStr = Encoding.ASCII.GetString(recvMsg, 0, count);
                    Console.WriteLine(recvStr);
    
                    if(msg=="exit")
                    {
                        break;
                    }
                }
    
                Thread.Sleep(10000);
                Console.Write("断开连接"); 
                socket.Shutdown(SocketShutdown.Both);
                socket.Close();
                Console.ReadKey();
            }
    
        }
    }

     udp服务端:

    using System;
    using System.Text;
    using System.Net;
    using System.Net.Sockets;
    
    namespace UDP
    {
        class Program
        {
            static void Main(string[] args)
            {
                int recv;
                byte[] data = new byte[2048];
           
                IPEndPoint ip = new IPEndPoint(IPAddress.Any, 8001);
                Socket Server = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
                Server.Bind(ip);
                Console.WriteLine("Server ready!");
    
                //得到客户机IP
                //IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);
                //EndPoint Remote = (EndPoint)(sender);
                //recv = Server.ReceiveFrom(data, ref Remote);
                //Console.Write("Message from "+Remote.ToString()+":");
                //Console.WriteLine(Encoding.ASCII.GetString(data, 0, recv));
    
                ////客户机连接成功后,发送信息
                //string welcome = "Hello ! ";
                //data = Encoding.ASCII.GetBytes(welcome);
                //Server.SendTo(data, data.Length, SocketFlags.None, Remote);
    
                while(true)
                {
                    //得到客户机IP
                    IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);
                    EndPoint Remote =sender;
                    recv = Server.ReceiveFrom(data, ref Remote);
                    string recvStr = Encoding.ASCII.GetString(data, 0, recv);
                    Console.Write("Message from " + Remote.ToString() + ":");
                    Console.WriteLine(recvStr);
    
                    //客户机连接成功后,发送信息
                    string welcome = "Server received: "+ recvStr;
                    data = Encoding.ASCII.GetBytes(welcome);
                    Server.SendTo(data, data.Length, SocketFlags.None, Remote);
                }
                //while (true)
                //{
                //    data = new byte[1024];
                //    //发送接收信息
                //    recv = Server.ReceiveFrom(data, ref Remote);
                //    Console.Write("Message from " + Remote.ToString() + ":");       
                //    Console.WriteLine(Encoding.ASCII.GetString(data, 0, recv));
    
                //    if (Encoding.ASCII.GetString(data, 0, recv) == "exit")
                //        break;
    
                //    Server.SendTo(data, recv, SocketFlags.None, Remote);
                //}
                //Console.WriteLine("停止");
                Server.Close();
                Console.ReadKey();
            }
        }
    }

     udp客户端:

    using System;
    using System.Text;
    using System.Net;
    using System.Net.Sockets;
    
    namespace UDPClient
    {
        class Program
        {
            static void Main(string[] args)
            {
                byte[] data = new byte[1024];         
                IPEndPoint ip = new IPEndPoint(IPAddress.Parse("192.168.8.15"), 8001);
                Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
                Console.WriteLine("Client ready:");
    
    
                //string welcome = "Server hello!";
                //data = Encoding.ASCII.GetBytes(welcome);
                //server.SendTo(data, data.Length, SocketFlags.None, ip);
    
                //IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);
                //EndPoint Remote = (EndPoint)sender;
                //data = new byte[1024];
                //int recv = server.ReceiveFrom(data, ref Remote);
                //Console.Write("Message from "+Remote.ToString()+":");
                //Console.WriteLine(Encoding.ASCII.GetString(data, 0, recv));
    
                while(true)
                {
                    string welcome = Console.ReadLine();
                    data = Encoding.ASCII.GetBytes(welcome);
                    server.SendTo(data, data.Length, SocketFlags.None, ip);
    
                    IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);
                    EndPoint Remote = sender;
                    data = new byte[1024];
                    int recv = server.ReceiveFrom(data, ref Remote);
                    Console.Write("Message from " + Remote.ToString() + ":");
                    Console.WriteLine(Encoding.ASCII.GetString(data, 0, recv));
                }
                //while (true)
                //{
                //    input = Console.ReadLine();
                //    server.SendTo(Encoding.ASCII.GetBytes(input), Remote);
    
                //    if (input == "exit")
                //        break;
    
                //    data = new byte[1024];
                //    recv = server.ReceiveFrom(data, ref Remote);
                //    stringData = Encoding.ASCII.GetString(data, 0, recv);
                //    Console.Write("Message from " + Remote.ToString() + ":");
                //    Console.WriteLine(stringData);
                //}
                Console.WriteLine("停止");
                server.Close();
                Console.ReadKey();
            }
        }
    }

    (2)TcpClient UdpClient TcpListener类

    上述连个类为.NET自封装两个类。

    tcp服务端:

    using System;
    using System.Net;
    using System.Net.Sockets;
    using System.Text;
    
    namespace TcpServerT
    {
        class Program
        {
            static void Main(string[] args)
            {
                //IPAddress IP = IPAddress.Parse("127.0.0.1");
                TcpListener listener = new TcpListener(IPAddress.Any, 1234);
                listener.Start();
                Console.WriteLine("开始监听:");
    
                //此处也可以采用socket 接收,可以方便进行socket操作
                //Socket s = listener.AcceptSocket();
                TcpClient client = listener.AcceptTcpClient();//接受一个Client  
                Console.WriteLine("已连接:");
                NetworkStream stream = client.GetStream();//获取网络流 
                Console.WriteLine("获取连接流:");
                string receiveString = "";
    
                while (true)
                {
                    byte[] buffer = new byte[client.ReceiveBufferSize];
                    stream.Read(buffer, 0, buffer.Length);//读取网络流中的数据 
                    receiveString = Encoding.Default.GetString(buffer).Trim('');//转换成字符串  
                    //StreamReader sr = new StreamReader(stream);
                    //receiveString = sr.ReadToEnd();
                   
                    string sendMsg = "Server received:" + receiveString;
                    byte[] sendBytes = Encoding.Default.GetBytes(sendMsg);
                    stream.Write(sendBytes, 0, sendBytes.Length);
                    stream.Flush();
    
                    Console.WriteLine(receiveString);
                    //Console.WriteLine("While++");
                    if (receiveString == "exit")
                    {
                        stream.Close();//关闭流
                        client.Close();//关闭Client    
                        break;
                    }                    
                }
                listener.Stop();
            }
        }
    }

    tcp客户端:

    using System;
    using System.Net;
    using System.Net.Sockets;
    using System.Text;
    
    namespace TcpClientT
    {
        class Program
        {
            static void Main(string[] args)
            {
                //IPAddress IP = IPAddress.Parse("192.168.8.15");
                //IPEndPoint ip = new IPEndPoint(IP, 1234);
                //TcpClient client = new TcpClient("192.168.8.15",1234);
                IPEndPoint ip = new IPEndPoint(IPAddress.Any, 1234);
                TcpClient client = new TcpClient("127.0.0.1", 1234);
                
                NetworkStream sendStream = client.GetStream();
    
                while (true)
                {
                    string msg = Console.ReadLine();
                    Byte[] sendBytes = Encoding.Default.GetBytes(msg);
                    sendStream.Write(sendBytes, 0, sendBytes.Length);
                    sendStream.Flush();
                    //StreamWriter sw = new StreamWriter(sendStream);
                    //sw.WriteLine(msg);
                    //sw.Flush();
    
                    byte[] buffer = new byte[client.ReceiveBufferSize];
                    sendStream.Read(buffer, 0, buffer.Length);//读取网络流中的数据 
                    string receiveMsg = Encoding.Default.GetString(buffer).Trim('');//转换成字符串  
                  
                    Console.WriteLine(receiveMsg);
    
                    if (msg == "exit")
                    {
                        sendStream.Close();//关闭网络流
                        break;
                    }
                }
                client.Close();//关闭客户端  
            }
        }
    }

    udp服务端

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Net;
    using System.Net.Sockets;
    using System.Text;
    
    namespace UdpServer
    {
        class Program
        {
            static void Main(string[] args)
            {
                UdpClient udpServer = new UdpClient(11000);
    
                while (true)
                {
                    var remoteEP = new IPEndPoint(IPAddress.Any, 11000);
                    byte[] recvData = udpServer.Receive(ref remoteEP); // listen on port 11000
                    string recvString = Encoding.Default.GetString(recvData);
                    Console.Write("Source from" + remoteEP.ToString()+":"+ recvString);
    
                    if(recvString=="exit")
                    {
                        break;
                    }
    
                    string sendString = "Server received:" + recvString;
                    byte[] sendData = Encoding.Default.GetBytes(sendString);
                    udpServer.Send(sendData, sendData.Length, remoteEP); // reply back
                }
                udpServer.Close();
            }
        }
    }

    udp客户端:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Net;
    using System.Net.Sockets;
    using System.Text;
    
    namespace UdpClientT
    {
        class Program
        {
            static void Main(string[] args)
            {
                UdpClient client = new UdpClient();
                IPEndPoint ep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 11000); // endpoint where server is listening
                client.Connect(ep);
    
                while(true)
                {
                    string sendString = Console.ReadLine();
                    byte[] sendData = Encoding.Default.GetBytes(sendString);
                    client.Send(sendData, sendData.Length);
    
                    byte[] recvData = client.Receive(ref ep);
                    string recvString = Encoding.Default.GetString(recvData);
                    Console.WriteLine(recvString);
    
                    if (sendString == "exit") break;
                }
                client.Close();       
            }
        }
    }

    PS:最基本的同步方法为阻塞线程模式,即在接受消息或者服务端等待连接过程中,主程序在此位置属于阻塞(卡住)状态,只有这一步执行完毕(收到消息或者建立连接)才会进行下一步。所以可以通过死循环来实现循环接受消息。

             udp不存在严格意义上的客户端服务端,只是要确定消息发送的目标主机

    如            Socket client = socket.Accept();

                    int count1 = client.Receive(recv1);

  • 相关阅读:
    cookie.js插件
    cookie.js插件的案例
    解决mysqli的中文乱码问题
    mysqli字符编码
    小人行走的动画案例
    原生js中用Ajax进行get传参
    php操作数据库
    数据库的信息处理
    数据库的dos命令
    面向对象php 接口 抽象类
  • 原文地址:https://www.cnblogs.com/llstart-new0201/p/9204142.html
Copyright © 2011-2022 走看看