2016-10-17 45 views
0

標題說已經。我有一個tcp偵聽器,你可以用ipadress.any訪問它。但是當我在其他計算機上測試它時,我的連接不起作用。這裏是我的服務器代碼:多人遊戲不適用於其他電腦。只在同一個

namespace AsyncClientServer 
{ 


public class Server 
{ 
    public TcpListener Listener; 
    private volatile bool Running; //wordt gebruikt door meerdere threads zonder lock te gebruiken (lock zorgt ervoor dat een thread niet doorgaat naar belangrijke code terwjil een andere thread nog bezig is om naar de locked code te gaan. 
    private List<BinaryWriter> writers = new List<BinaryWriter>(); 
    bool playerCount = false; 
    public Server(int port) 
    { 
     Listener = new TcpListener(IPAddress.Any, port); 
    } 

    public void Start() 
    { 
     Listener.Start(10); 
     Running = true; 

     while (Running) 
     { 
      var connection = Listener.AcceptTcpClient(); 
      ProcessConnection(connection); 
     } 
    } 


    public async Task ProcessConnection(TcpClient connection) 
    { 
     var writer = new BinaryWriter(connection.GetStream()); 

     lock (writers) 
     { 
      writers.Add(writer); 
     } 

     using (var stream = new BinaryReader(connection.GetStream())) 
     { 
      //hvlheid connectie 
      await Task.Factory.StartNew(() => { 
       byte[] data = System.Text.Encoding.UTF8.GetBytes(Convert.ToString(writers.Count)); 
       playerCount = true; 
       ProcessCommand(connection, writer, data); 
      }); 
      //loop 
      while (Running && connection.Connected) 
      { 
       await Task.Factory.StartNew(() => { 
        var count = stream.ReadInt32(); 
        var data = stream.ReadBytes(count); 
        ProcessCommand(connection, writer, data); 
       }); 
      } 
      connection.Close(); 
     } 
     lock (writers) 
     { 
      writers.Remove(writer); 
     } 
    } 


    private void ProcessCommand(TcpClient connection, BinaryWriter writer, byte[] data) 
    { 
     //var info = connection.Client.RemoteEndPoint as IPEndPoint; 
     if (playerCount) 
     { 
      playerCount = false; 
      lock (writers) 
      { 
       foreach (var w in writers) 
       { 
        if (w != null) 
        { 
         try 
         { 
          w.Write((Int32)data.Length); 
          w.Write(data); 
          w.Flush(); 
         } 
         catch 
         { 

         } 
        } 
       } 
      } 
     } 
     else 
     { 
      //var line = System.Text.Encoding.UTF8.GetString(data); 
      //var response = String.Format("{1}:{2}: {0}", line, info.Address.ToString(), info.Port); 
      //Console.WriteLine(response); 
      lock (writers) 
      { 
       foreach (var w in writers) 
       { 
        if (w != null) 
        { 
         try 
         { 
          w.Write((Int32)data.Length); 
          w.Write(data); 
          w.Flush(); 
         } 
         catch 
         { 

         } 
        } 
       } 
      } 
     } 
    } 


    public void Stop() 
    { 
     Running = false; 
     Listener.Stop(); 
    } 
    ~Server() 
    { 
     Running = false; 
     Listener.Stop(); 
    } 
} 

}

的Program.cs:

 public static class MainClass 
    { 
     public static readonly int Port = 5000; 
     public static void Main(string[] args) 
     { 
      var server = new Server(Port); 
      server.Start(); 
     } 
    } 

客戶:

 Start(5000); 
public async Task Start(int port) 
    { 

     Connection.Connect("localhost", port); 
     Console.WriteLine("Connected"); 
     Running = true; 
     Writer = new BinaryWriter(Connection.GetStream()); 

     using (var stream = new BinaryReader(Connection.GetStream())) 
     { 
      //infinite loop 
      while (Running && Connection.Connected) 
      { 
       await Task.Factory.StartNew(() => { 
        var count = stream.ReadInt32(); 
        var data = stream.ReadBytes(count); 
        ProcessCommand(data); 
       }); 
      } 
      Stop(); 
     } 
    } 
    //send player coordinates naar server 
    int[] temporary = new int[4]; 

    public async Task Coordinates() 
    { 
     if (Client1) 
     { 
      temporary[0] = (int)Player1_x; 
      temporary[1] = (int)Player1_y; 
     } 
     else 
     { 
      temporary[2] = (int)Player2_x; 
      temporary[3] = (int)Player2_y; 
     } 
      await Task.Factory.StartNew(() => 
      { 
       //send player 1 coordinates naar server 
       var player_coordinates = new byte[temporary.Length * sizeof(int) + sizeof(bool) + sizeof(bool)]; 
       //zet coordinates in de byte array 
       Buffer.BlockCopy(temporary, 0, player_coordinates, 0, temporary.Length * sizeof(int)); 
       //zet collision in de byte array 
       Buffer.BlockCopy(BitConverter.GetBytes(Collision_player1), 0, player_coordinates, temporary.Length * sizeof(int), sizeof(bool)); 
       Buffer.BlockCopy(BitConverter.GetBytes(Collision_player2), 0, player_coordinates, temporary.Length * sizeof(int) + sizeof(bool), sizeof(bool)); 
       Writer.Write((Int32)player_coordinates.Length); 
       Writer.Write(player_coordinates); 
       Writer.Flush(); 
      }); 
    } 
    //send data voor chat 
    public async Task Send(String line) 
    { 
     if (Writer == null) 
      return; 
     await Task.Factory.StartNew(() => { 
      var data = System.Text.Encoding.UTF8.GetBytes(line); 
      Writer.Write((Int32)data.Length); 
      Writer.Write(data); 
      Writer.Flush(); 
     }); 
    } 

    //krijg het aantal spelers connected 
    private void ProcessCommand(byte[] data) 
    { 
     if (players) 
     { 
      var playerCount = System.Text.Encoding.UTF8.GetString(data); 
      PlayerCountMethod(Convert.ToInt32(playerCount)); 
      if (playerCount == "1") { 
       Client1 = true; 
      } 
      else if (playerCount == "2") 
      { 
       players = false; 
      } 

     } else 
     { 
      if (Client1) 
      { 
       Player2_x = BitConverter.ToInt32(data, 2 * sizeof(int)); 
       Player2_y = BitConverter.ToInt32(data, 3 * sizeof(int)); 
      } else 
      { 
       Player1_x = BitConverter.ToInt32(data, 0); 
       Player1_y = BitConverter.ToInt32(data, sizeof(int)); 
      } 
      // 
      if (Collision_player1 == false) 
      { 
       Collision_player1 = BitConverter.ToBoolean(data, temporary.Length * sizeof(int)); 
      } 
      // 
      if (Collision_player2 == false) 
      { 
       Collision_player2 = BitConverter.ToBoolean(data, temporary.Length * sizeof(int) + sizeof(bool)); 
      } 

      //try-catch want anders argument out of range als er geen message wordt gestuurd 
      //try 
      //{ 
      // var line = BitConverter.ToString(data, temporary.Length * sizeof(int)); 
      // ////stuur data van server naar method 
      // textboxChat(line); 
      //} 
      //catch 
      //{ 

      //} 
     } 

    } 


    public void Stop() 
    { 
     Running = false; 
     Writer.Close(); 
     Writer = null; 
     Connection.Close(); 

    } 
    ~GamePlay() 
    { 
     Stop(); 
    } 

它可能是一個真的容易犯的錯誤,但我不知道爲什麼它在我的電腦上打開多個程序時有效。但是,當我在其他電腦上打開它時,它不起作用。

+0

貴電腦有防火牆運行? – DavidG

回答

1

你有下面的代碼行:

Connection.Connect("localhost", port); 

如果你嘗試到另一臺機器它會尋找請求端口在一個開放的插座在同一臺機器上執行該

+1

請不要讓這是真實的...... – DavidG

+2

像這些片刻讓我質疑我的存在。 – Mathijs

+0

我應該怎樣改變它? :P在我的防守中,我不是一名職業程序員,只是一名剛開始的學生。最初的服務器 - 客戶端連接來自github。我改變了很多,但我仍然不知道如何一切工作大聲笑 – Mathijs

相關問題