首页 文章

.NET UDPClient:错误:远程主机强制关闭现有连接

提问于
浏览
2

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

现在我需要得到该计划的回复 . 我添加了一个线程(见底部),它在端口7778上侦听消息 . 但是在开始说这个时我收到一个错误:

远程主机强行关闭现有连接

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);
            }
        }
    }
}

1 回答

  • 0

    好的,我看过一些人使用单个客户端对象发送和接收(以及相同的端口)的例子 . 但后来我看到如果他们在同一台主机上则需要一个不同的端口 . 现在我看到你需要一个单独的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);
                }
            }
        }
    }
    

相关问题