簡體   English   中英

C# Sockets TCP 客戶端/服務

[英]C# Sockets TCP client/serve

我有一個客戶端和一個服務器,我正試圖通過我的本地網絡(127.0.0.1)相互交談。

首先,我啟動“服務器”應用程序:

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,其在調試器中的消息是:

“在已連接的套接字 127.0.0.1:8269 上發出了連接請求”

我不明白這一點,因為我的服務器使用的是 TcpListener,而客戶端使用的是 TcpClient。 這應該不是問題吧?

客戶端中的這兩行是多余的:

                worldMapConnection = new TcpClient(address.ToString(), port);
                worldMapConnection.Connect(WORLDMAP_ADDRESS, WORLDMAP_PORT);

使用地址和端口構造TcpClient object 足以使其連接。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM