2016-06-23 4 views
0

Ich hatte ein perfektes funktionierendes Konsolenprogramm, das UdpClient.send verwendet, um Nachrichten an ein anderes Programm auf dem localhost (über Port 7777) zu senden. (was merkwürdigerweise eine fast identische Version dieses C# -Skriptes ist, aber läuft in unity3d, und es hat keine Probleme, mit demselben Code zu empfangen)..NET UDPClient: Fehler: Eine bestehende Verbindung wurde vom Remote-Host zwangsweise geschlossen

Jetzt muss ich Antworten von diesem Programm bekommen. Ich habe einen Thread hinzugefügt (siehe unten), der Port 7778 nach Nachrichten abhört. Aber ich bin immer einen Fehler, wenn das zu sagen beginnen:

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

Wollen Sie das gleiche 'client' Objekt für Ihre Sende- und Empfangsoperationen verwenden? – pay

+0

haben Sie versucht, eine andere Variable 'UdpClient client2;' zu erstellen und diese in Ihrem Empfang zu verwenden ..? – MethodMan

+0

Ich hatte Beispiele von Leuten gesehen, die das mit einem Klienten machen. Aber ja, es funktioniert jetzt mit einem separaten Server. –

Antwort

0

Ok, ich hatte einige Beispiele von Leuten gesehen für ein einzelnes Client-Objekt sowohl senden als auch empfangen (wie auch die gleiche Port). Aber dann sah ich, dass ein anderer Port benötigt wurde, wenn sie auf demselben Host waren. Jetzt sehe ich, dass Sie einen separaten udpClient benötigen.

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