Ich mache ein Spiel in C# und ich möchte den Fortschritt (Bewegungen und so weiter) des Gegners anzeigen. Also sende ich Ereignisse im Spiel per TCP-Protokoll an den Gegner.Wie behebe ich "einen Verbindungsversuch fehlgeschlagen, weil der angeschlossene Teilnehmer nach einer gewissen Zeit nicht richtig reagiert ..." Fehler?
Ich habe bereits versucht, meine Anwendung auf localhost und es funktioniert, aber wenn ich versuche, meine externe Adresse zu verwenden, um das Internet zu kommunizieren ich die Fehlermeldung unten in der Klasse TcpInformer.Connect get():
ein Verbindungsversuch ist fehlgeschlagen, da die verbundene Partei nicht richtig nach einer Zeit reagiert hat, oder die hergestellte Verbindung war fehlerhaft, da der verbundene Host respond (meine externe IP-Adresse) :(Port)
ich dachte, fehlgeschlagen Das Problem war, dass ich Beh war ind NAT. Aber ich habe bereits Portforwarding für Port 49731 auf IP 10.0.0.1 eingerichtet und nichts geändert.
Meine zweite Vermutung war Windows-Firewall, aber selbst wenn ich die Firewall gestoppt habe, begann meine App nicht zu arbeiten.
Mein Code zum Verbinden der beiden PCs ist:
TcpInformer peer;
TcpHost server;
public void PrepareConnection() // for server (host)
{
playerType = PlayerType.One;
server = new TcpHost(form, this);
server.Start("10.0.0.1", 49731);
}
public void PrepareConnection2() // for client
{
playerType = PlayerType.Two;
peer = new TcpInformer(form, this);
peer.Connect("MY EXTERNAL IP", 49731);
}
// classes TcpHost and TcpInformer
public interface ITcpCommunication
{
#region Operations (3)
void ReadData();
void SendData(byte[] message);
void SendData(byte[] message, int size);
#endregion Operations
}
public class TcpInformer : ITcpCommunication
{
#region Fields (9)
private NetworkStream con_ns;
private TcpClient con_server;
private bool connected;
private Fmain form;
private SecondPlayer player;
private int port;
private string server;
private string stringData;
#endregion Fields
#region Delegates and Events (1)
// Events (1)
public event SimulationEventHandler ReadEvent;
#endregion Delegates and Events
#region Constructors (1)
public TcpInformer(Fmain form, SecondPlayer player)
{
this.form = form;
connected = false;
this.player = player;
}
#endregion Constructors
#region Methods (6)
// Public Methods (5)
///
///
///
/// e.g., server = "127.0.0.1"
/// e.g., port = 9050
public void Connect(string server, int port)
{
this.port = port;
this.server = server;
connected = true;
try
{
con_server = new TcpClient(this.server, this.port);
}
catch (SocketException ex)
{
connected = false;
MessageBox.Show("Unable to connect to server" + ex.Message);
return;
}
con_ns = con_server.GetStream();
}
public void Disconnect()
{
form.Debug("Disconnecting from server...", "Player2Net");
con_ns.Close();
con_server.Close();
}
public void ReadData()
{
if (con_ns != null)
{
if (con_ns.DataAvailable)
{
byte[] data = new byte[1200];
int received = con_ns.Read(data, 0, data.Length);
player.ProcessReceivedData(data, received);
}
}
else
{
form.Debug("Warning: con_ns is not inicialized.","player2");
}
}
public void SendData(byte[] message)
{
con_ns.Write(message, 0, message.Length);
con_ns.Flush();
}
public void SendData(byte[] message, int size)
{
if (con_ns != null)
{
con_ns.Write(message, 0, size);
}
}
// Private Methods (1)
private void Debug(string message)
{
form.Debug("Connected to: " + server + "port: " + port.ToString() + ": " + message, "Player2Net");
}
#endregion Methods
}
public class TcpHost : ITcpCommunication
{
#region Fields (9)
private ASCIIEncoding enc;
private Fmain form;
private TcpListener listener;
private SecondPlayer player;
private int port;
private Socket s;
private string server;
private bool state;
#endregion Fields
#region Delegates and Events (1)
// Events (1)
public event SimulationEventHandler ReadEvent;
#endregion Delegates and Events
#region Constructors (1)
public TcpHost(Fmain form, SecondPlayer player)
{
this.player = player;
this.form = form;
state = false;
enc = new ASCIIEncoding();
}
#endregion Constructors
#region Methods (5)
// Public Methods (5)
public void Close()
{
state = false;
s.Close();
listener.Stop();
}
public void ReadData()
{
if (state == true)
{
if (s.Available > 0) // if there's any data
{
byte[] data = new byte[1200];
int received = s.Receive(data);
player.ProcessReceivedData(data, received);
}
}
}
public void SendData(byte[] message)
{
if (state == true)
{
s.Send(message);
}
}
public void SendData(byte[] message, int size)
{
if (state == true)
{
s.Send(message, size, SocketFlags.None);
}
}
public void Start(string p_ipAddress, int listenPort)
{
//IPAddress ipAddress = IPAddress.Loopback
IPAddress ipAddress = IPAddress.Parse(p_ipAddress);
IPEndPoint ipLocalEndPoint = new IPEndPoint(ipAddress, listenPort);
//listener = new TcpListener(ipAddress, listenPort);
listener = new TcpListener(ipLocalEndPoint);
server = "[provider]";
port = listenPort;
listener.Start();
form.Debug("Server is running", "Player1Net");
form.Debug("Listening on port " + listenPort, "Player1Net");
form.Debug("Waiting for connections...", "Player1Net");
s = listener.AcceptSocket();
form.Debug("Connection accepted from " + s.RemoteEndPoint, "Player1Net");
state = true;
}
#endregion Methods
}
Gibt es eine Möglichkeit, wie Sie zu überprüfen, was falsch ist? Hilfe wird sehr geschätzt!
Ich fand heraus, was das Problem war. Ich habe auf 10.0.0.1 zugehört und versucht, meine externe IP (zweite Instanz meines Programms) zu erreichen, was auf einem Computer mit einer Verbindung zum Internet unmöglich ist. Sollte ich diesen Beitrag löschen? –
Fügen Sie Ihre eigene Antwort hinzu und erklären Sie die Lösung und markieren Sie sie als akzeptiert. – Richard
diesen Beitrag verlassen. Es war hilfreich für mich. –