1
我有一个客户端和服务器,我试图通过我的本地网络(127.0.0.1)与对方通话。C#套接字TCP客户端/服务
首先,我启动 '服务器' 应用程序:
public override void StartListening(int port, IPAddress address) {
listenClient = new TcpListener(address, port);
listenClient.Start();
listenDelimiter = new IPEndPoint(address, port);
if (listenThread != null) listenThread.Abort();
listenThread = new Thread(new ParameterizedThreadStart(ListenThread));
listenThread.IsBackground = true;
listenThread.Start(port);
}
public void ListenThread(object o) {
while (true) {
try {
Socket incomingConnection = listenClient.AcceptSocket();
NetworkStream conStream = new NetworkStream(incomingConnection);
NetworkConnection nc = new NetworkConnection((incomingConnection.RemoteEndPoint as IPEndPoint).Port, (incomingConnection.RemoteEndPoint as IPEndPoint).Address);
Clients.Add(nc);
nc.MonitorTCPStream(conStream, this);
}
catch (Exception e) {
Console.WriteLine("Server has crashed. Networking error: " + e.Message);
Console.WriteLine("Will restart in 60 seconds...");
Thread.Sleep(60000);
StartListening(WORLDMAP_PORT, IPAddress.Any);
}
}
}
然后 '客户':
try {
if (worldMapConnection != null) worldMapConnection.Close();
worldMapConnection = new TcpClient(address.ToString(), port);
worldMapConnection.Connect(WORLDMAP_ADDRESS, WORLDMAP_PORT);
if (worldMapThread != null) worldMapThread.Abort();
worldMapThread = new Thread(new ParameterizedThreadStart(WorldMapListener));
worldMapThread.IsBackground = true;
worldMapThread.Start();
if (Engine.Renderer.GetTopMenu().GetType() == typeof(MenuContainerConnecting)) Engine.Renderer.CloseMenu();
}
catch (System.Net.Sockets.SocketException e) {
if (Engine.Renderer.GetTopMenu().GetType() == typeof(MenuContainerConnecting)) Engine.Renderer.CloseMenu();
switch (e.SocketErrorCode) {
case SocketError.AddressAlreadyInUse: {
Engine.Renderer.OpenMenu(new MenuContainerNotice("Connection Error", "You already have a copy of the game connected to the game server.", "Okay"));
} break;
case SocketError.ConnectionRefused: {
Engine.Renderer.OpenMenu(new MenuContainerNotice("Connection Error", "The connection was refused by the game server.", "Okay"));
} break;
case SocketError.HostUnreachable: {
Engine.Renderer.OpenMenu(new MenuContainerNotice("Connection Error", "Could not connect to the game server. Check your internet connection.", "Okay"));
} break;
default: {
Engine.Renderer.OpenMenu(new MenuContainerNotice("Connection Error", "Could not connect to the game server. The server may be down for maintenance.", "Okay"));
} break;
}
}
catch (Exception) {
if (Engine.Renderer.GetTopMenu().GetType() == typeof(MenuContainerConnecting)) Engine.Renderer.CloseMenu();
Engine.Renderer.OpenMenu(new MenuContainerNotice("Connection Error", "Could not connect to the game server. An unknown error has occoured.", "Okay"));
}
WORLDMAP_ADDRESS是127.0.0.1。两个应用程序使用的端口是相同的(8269)。
然而,当我运行客户机,它捕获一System.Net.Sockets.SocketException,在调试器,其信息是:
“A连接请求上的已经连接的套接字127.0.0.1制成:8269“
我不明白这一点,因为我的服务器使用的是TcpListener,而客户端是一个TcpClient。当然,这不应该是一个问题?
谢谢。这是问题。 – Xenoprimate