2011-07-16 204 views
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。当然,这不应该是一个问题?

回答

5

在客户端这两条线是冗余:

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

构建TcpClient对象与地址和端口是足以得到它进行连接。

+1

谢谢。这是问题。 – Xenoprimate