首页 文章

C#使用tcp和udp协议

提问于
浏览
4

我需要在我的应用程序中使用udp和tcp连接, TcpClient/TcpListener 很少会处于活动状态,但udp将是主要用途 .

这是服务器代码:

static void Main(string[] args)
    {
        TcpListener  listener = new TcpListener(IPAddress.Any, 25655);
        listener.Start();
        Socket  sck = listener.AcceptTcpClient().Client;
        UdpClient udpServer = new UdpClient(1100);
        IPEndPoint remoteEP = new IPEndPoint(IPAddress.Any, 0);
        var data = udpServer.Receive(ref remoteEP);
        string result = Encoding.UTF8.GetString(data);
        Console.WriteLine(result);
        Console.Read();
    }

这是客户:

static void Main(string[] args)
    {
       TcpClient client = new TcpClient("127.0.0.1", 25655);
       Socket sck = client.Client;
       UdpClient udpclient = new UdpClient();
       IPEndPoint ep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 1100); // endpoint where server is listening
       udpclient.Connect(ep);
       byte[] data = UTF8Encoding.UTF8.GetBytes("Hello");
       udpclient.Send(data,data.Length);       
    }

我'm establishing the Tcp connection at first,then i'm尝试连接并将数据从客户端发送到服务器 . 从断点我加入,我可以看到,技术合作计划的一部分工作正常,客户端完成的程序,但在服务器,它是在接收部分 var data = udpServer.Receive(ref remoteEP); 挂起一样,没有数据arrived..when我删除TCP代码部分(第2来自服务器和客户端的行)它工作得很好,显示结果消息 .

有谁知道为什么我无法从客户端获取数据?

提前致谢 .

3 回答

  • 1

    UDP和TCP之间的主要区别在于TCP将尝试重新发送消息,直到服务器告知客户端已收到消息 . 即使数据包永远不会到达或主机根本不存在,UDP也会发送并忘记它

    这是您的代码流程

    服务器启动TCP
    客户端发送TCP
    服务器接收TCP
    客户端发送UDP(服务器尚未监听,数据包丢失但UDP不关心)
    服务器开始侦听UDP
    等待UDP到来的服务器<---挂起

    在尝试从客户端发送消息之前,您希望执行一些多线程编程并同时启动它们 .

  • 1

    问题是在创建Tcp连接之前,未 Build 服务器端的 listener.AcceptTcpClient() blocks your current thread和UdpClient . 实际上,您的服务器正在等待Tcp连接,并且只有在开始侦听Udp连接之后,您的客户端才会逐个创建2个连接 . 我的建议是 - 您的服务器在客户端实际发送数据之后开始侦听Udp端口 . 检查我的建议的最简单方法 - 客户端代码在通过UDP发送数据之前添加 Thread.Sleep(1000) . 为了使其工作,你可能需要修改你的代码而不是阻塞主线程但是以类似于这样的方式分离Tcp和Udp:

    static void Main(string[] args)
    {
        Task.Factory.StartNew(() => 
        {
            TcpListener listener = new TcpListener(IPAddress.Any, 25655);
            listener.Start();
            Socket sck = listener.AcceptTcpClient().Client;
    
            // ToDo: further actions related to TCP client
        }, TaskCreationOptions.LongRunning);
    
        UdpClient udpServer = new UdpClient(1100);
        IPEndPoint remoteEP = new IPEndPoint(IPAddress.Any, 0);
        var data = udpServer.Receive(ref remoteEP);
        string result = Encoding.UTF8.GetString(data);
        Console.WriteLine(result);
        Console.Read();
    }
    

    客户端代码可能保持原样,但对于实际项目,我建议将其分开,因为您确实希望通过Tcp从服务器获取一些数据 .

  • 0

    如果您首先在服务器端启动UDP客户端然后在客户端和服务器之间 Build TCP连接怎么办?

    服务器

    static void Main(string[] args)
        {
            UdpClient udpServer = new UdpClient(1100);
            IPEndPoint remoteEP = new IPEndPoint(IPAddress.Any, 0);
    
            TcpListener listener = new TcpListener(IPAddress.Any, 25655);
            listener.Start();
            Socket sck = listener.AcceptTcpClient().Client;
    
            var data = udpServer.Receive(ref remoteEP);
            string result = Encoding.UTF8.GetString(data);
            Console.WriteLine(result);
            Console.Read();
        }
    

    客户

    static void Main(string[] args)
    {
        TcpClient client = new TcpClient();
        client.Connect("127.0.0.1", 25655);
    
        UdpClient udpclient = new UdpClient();
        IPEndPoint ep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 1100); // endpoint where server is listening
        udpclient.Connect(ep);
        byte[] data = UTF8Encoding.UTF8.GetBytes("Hello");
        udpclient.Send(data, data.Length);
    }
    

相关问题