.NET UDPClient: Error: An existing connection was forcibly closed by the remote host

.NET UDPClient: Error: An existing connection was forcibly closed by the remote host

我有一个非常好的工作控制台程序,它使用 UdpClient.send 将消息发送到本地主机上的另一个程序(通过端口 7777)。 (奇怪的是,这个 C# 脚本的版本几乎相同,但在 unity3d 中 运行,并且使用相同的代码接收时没有问题)。

现在我需要得到那个程序的回复。我添加了一个线程(见底部),它在端口 7778 上侦听消息。但是当我开始说时出现错误:

An existing connection was forcibly closed by the remote host

using Newtonsoft.Json;
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;

namespace Blaster
{
    class Blaster
    {
        UdpClient client;
        IPEndPoint outPoint;
        IPEndPoint inPoint;
        public int oPort = 7777;
        public int iPort = 7778;
        public string hostName = "localhost";
        public int stepNum = 0;
        const int rate = 1000;
        public System.Timers.Timer clock;
        Thread listener;

        static void Main(string[] args)
        {
            Blaster b = new Blaster();
            b.run();
        }
        Blaster()
        {
            client = new UdpClient();
            outPoint = new IPEndPoint(Dns.GetHostAddresses(hostName)[0], oPort);
            inPoint = new IPEndPoint(Dns.GetHostAddresses(hostName)[0], iPort);
        }
        void run()
        {
            this.stepNum = 0;
            listener = new Thread(new ThreadStart(translater));
            listener.IsBackground = true;
            listener.Start();
            Console.WriteLine("Press Enter to do a send loop...\n");
            Console.ReadLine();
            Console.WriteLine("started at {0:HH:mm:ss.fff}", DateTime.Now);
            start();
            Console.WriteLine("Press Enter to stop");
            Console.ReadLine();
            stop();
            client.Close();
        }
        void stop()
        {
            clock.Stop();
            clock.Dispose();
        }
        void start()
        {
            clock = new System.Timers.Timer(rate);
            clock.Elapsed += send;
            clock.AutoReset = true;
            clock.Enabled = true;
        }
        void send(Object source, System.Timers.ElapsedEventArgs e)
        {
            Console.WriteLine("sending: {0}", stepNum);
            Byte[] sendBytes = Encoding.ASCII.GetBytes(message());
            try
            {
                client.Send(sendBytes, sendBytes.Length, outPoint);
            }
            catch (Exception err)
            {
                Console.WriteLine(err.ToString());
            }
        }
        string message()
        {
            Packet p = new Packet();
            p.id = "car";
            p.start = DateTime.Now;
            p.x = 1.2f;
            p.y = 0.4f;
            p.z = 4.5f;
            p.step = stepNum++;
            string json = JsonConvert.SerializeObject(p);
            return json;
        }
        void translater()
        {
            Byte[] data = new byte[0];
            client.Client.Bind(inPoint);
            while (true)
            {
                try
                {
                    data = client.Receive(ref inPoint);
                }
                catch (Exception err)
                {
                    Console.WriteLine("Blaster.translater: recieve data error: " + err.Message);
                    client.Close();
                    return;
                }
                string json = Encoding.ASCII.GetString(data);
                Console.WriteLine(json);
                Packet p = JsonConvert.DeserializeObject<Packet>(json);
            }
        }
    }
}

好的,我见过一些使用单个客户端对象进行发送和接收(以及相同端口)的示例。但后来我看到如果它们在同一台主机上,则需要一个不同的端口。现在我看到你需要一个单独的 udpClient。

using Newtonsoft.Json;
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;

namespace Blaster
{
    class Blaster
    {
        UdpClient client;
        IPEndPoint outPoint;
        IPEndPoint inPoint;
        public int oPort = 7777;
        public int iPort = 7778;
        public string hostName = "localhost";
        public int stepNum = 0;
        const int rate = 1000;
        public System.Timers.Timer clock;
        Thread listener;

        static void Main(string[] args)
        {
            Blaster b = new Blaster();
            b.run();
        }
        Blaster()
        {
            client = new UdpClient();
            outPoint = new IPEndPoint(Dns.GetHostAddresses(hostName)[0], oPort);
            inPoint = new IPEndPoint(Dns.GetHostAddresses(hostName)[0], iPort);
        }
        void run()
        {
            this.stepNum = 0;
            listener = new Thread(new ThreadStart(translater));
            listener.IsBackground = true;
            listener.Start();
            Console.WriteLine("Press Enter to do a send loop...\n");
            Console.ReadLine();
            Console.WriteLine("started at {0:HH:mm:ss.fff}", DateTime.Now);
            start();
            Console.WriteLine("Press Enter to stop");
            Console.ReadLine();
            stop();
            client.Close();
        }
        void stop()
        {
            clock.Stop();
            clock.Dispose();
        }
        void start()
        {
            clock = new System.Timers.Timer(rate);
            clock.Elapsed += send;
            clock.AutoReset = true;
            clock.Enabled = true;
        }
        void send(Object source, System.Timers.ElapsedEventArgs e)
        {
            Console.WriteLine("sending: {0}", stepNum);
            Byte[] sendBytes = Encoding.ASCII.GetBytes(message());
            try
            {
                client.Send(sendBytes, sendBytes.Length, outPoint);
            }
            catch (Exception err)
            {
                Console.WriteLine(err.ToString());
            }
        }
        string message()
        {
            Packet p = new Packet();
            p.id = "car";
            p.start = DateTime.Now;
            p.x = 1.2f;
            p.y = 0.4f;
            p.z = 4.5f;
            p.step = stepNum++;
            string json = JsonConvert.SerializeObject(p);
            return json;
        }
        void translater()
        {
            UdpClient server = new UdpClient();
            Byte[] data = new byte[0];
            server.Client.Bind(inPoint);
            while (true)
            {
                try
                {
                    data = server.Receive(ref inPoint);
                }
                catch (Exception err)
                {
                    Console.WriteLine("Blaster.translater: recieve data error: " + err.Message);
                    client.Close();
                    return;
                }
                string json = Encoding.ASCII.GetString(data);
                Console.WriteLine(json);
                Packet p = JsonConvert.DeserializeObject<Packet>(json);
            }
        }
    }
}