2013-01-10 8 views
5

lindgren 네트워크 테스트에서 내 클라이언트가 내 서버에 연결하는 데 문제가 있습니다. 여러 가지 연결 방법을 시도했지만 연결하려고하면 항상 멈 춥니 다. 이것이 광범위한 질문 인 경우 죄송합니다.하지만 무엇이 잘못 되었나요? 또한Lidgren 네트워크에 연결할 수 없습니다.

class Program 
{ 
    static NetPeerConfiguration serverconfig; 
    static NetPeerConfiguration clientconfig; 
    static NetServer server; 
    static NetClient client; 

    static void Main() 
    { 
     Console.Title = "LidgrenNetworkTest"; 
     Console.ForegroundColor = ConsoleColor.Yellow; 
     Console.WriteLine("LidgrenNetworkTest console initialized."); 
     Console.ForegroundColor = ConsoleColor.Gray; 
     Console.Write("Color codes: "); 
     Console.ForegroundColor = ConsoleColor.Yellow; 
     Console.Write("System "); 
     Console.ForegroundColor = ConsoleColor.Gray; 
     Console.Write("Input "); 
     Console.ForegroundColor = ConsoleColor.Red; 
     Console.Write("Sent "); 
     Console.ForegroundColor = ConsoleColor.Cyan; 
     Console.Write("Received"); 
     Console.ForegroundColor = ConsoleColor.Yellow; 
     Console.WriteLine("\n"); 

     Console.WriteLine("Configuring server..."); 
     serverconfig = new NetPeerConfiguration("LidgrenNetworkTest"); 
     serverconfig.EnableMessageType(NetIncomingMessageType.ConnectionApproval); 
     serverconfig.EnableMessageType(NetIncomingMessageType.DiscoveryRequest); 
     serverconfig.LocalAddress = NetUtility.Resolve("localhost"); 
     serverconfig.Port = 8080; 
     Console.WriteLine("Server configured."); 

     Console.WriteLine("Configuring client..."); 
     clientconfig = new NetPeerConfiguration("LidgrenNetworkTest"); 
     clientconfig.EnableMessageType(NetIncomingMessageType.DiscoveryResponse); 
     Console.WriteLine("Client configured."); 

     Console.WriteLine("Initializing server..."); 
     server = new NetServer(serverconfig); 
     server.Start(); 
     Console.WriteLine("Server initialized."); 

     Console.WriteLine("Initializing client..."); 
     client = new NetClient(clientconfig); 
     client.Start(); 
     Console.WriteLine("Client initialized."); 

     Thread serverthread = new Thread(StartServer); 
     serverthread.Start(); 

     StartClient(); 

     Console.ForegroundColor = ConsoleColor.Yellow; 
     Console.WriteLine("Connecting client to server..."); 
     //client.Connect(new IPEndPoint(NetUtility.Resolve("localhost"), 8080)); 
     client.DiscoverLocalPeers(8080); 

     AcceptConsoleInput(); 
    } 

    static void StartServer() 
    { 
     NetIncomingMessage message; 

     while ((message = server.ReadMessage()) != null) 
     { 
      switch (message.MessageType) 
      { 
       case NetIncomingMessageType.DiscoveryRequest: 
        Console.ForegroundColor = ConsoleColor.Cyan; 
        Console.WriteLine("(Server) Got request from client."); 
        NetOutgoingMessage response = server.CreateMessage(); 
        response.Write((byte)1); // Do I need to do this? 
        server.SendDiscoveryResponse(response, message.SenderEndPoint); 
        break; 
       case NetIncomingMessageType.ConnectionApproval: 
        Console.ForegroundColor = ConsoleColor.Cyan; 
        Console.WriteLine("(Server) Connection accepted."); 
        message.SenderConnection.Approve(); 
        break; 
       case NetIncomingMessageType.DebugMessage: 
        Console.ForegroundColor = ConsoleColor.Cyan; 
        Console.WriteLine("(Server) Debug: " + message.ReadString()); 
        break; 
       default: 
        Console.ForegroundColor = ConsoleColor.Cyan; 
        Console.WriteLine("(Server) Unrecognized message type! (" + message.MessageType + ")"); 
        break; 
      } 
      server.Recycle(message); 
     } 
    } 

    static void StartClient() 
    { 
     NetIncomingMessage message; 

     while ((message = server.ReadMessage()) != null) 
     { 
      switch (message.MessageType) 
      { 
       case NetIncomingMessageType.DiscoveryResponse: 
        Console.ForegroundColor = ConsoleColor.Cyan; 
        Console.WriteLine("(Client) Got response from server."); 
        client.Connect(message.SenderEndPoint); 
        Console.WriteLine("(Client) Attempting to connect to server..."); 
        break; 
       case NetIncomingMessageType.DebugMessage: 
        Console.ForegroundColor = ConsoleColor.Cyan; 
        Console.WriteLine("(Client) Debug: " + message.ReadString()); 
        break; 
       default: 
        Console.ForegroundColor = ConsoleColor.Cyan; 
        Console.WriteLine("(Client) Unrecognized message type! (" + message.MessageType + ")"); 
        break; 
      } 
      client.Recycle(message); 
     } 
    } 

    static void AcceptConsoleInput() 
    { 
     string input = Console.ReadLine(); 

     if (!string.IsNullOrWhiteSpace(input)) 
     { 
      // Send input from client to server. 
     } 

     AcceptConsoleInput(); 
    } 
} 

,이 걸리면 : 당신이 당신의 while 루프에서 message = server.ReadMessage()을 설정하고, 당신의 void StartClient()에서

: The console

+0

제공되는 샘플이 효과가 있습니까? –

+0

그래, 방금 채팅 샘플을 컴파일하고 완벽하게 작동합니다. – user1438378

+0

serverconfig.LocalAddress = NetUtility.Resolve ("localhost");를 제거해보십시오. ? –

답변

2

내가 당신의 오류를 발견 다음은 내 코드입니다.

실제로는 message = client.ReadMessage()이어야합니다.

늦게 응답 해 주셔서 감사합니다. 나는 각 부분을 테스트 할 수 있도록

0

솔루션은

using System; 
using System.Threading; 
using System.Collections.Generic; 
using Lidgren.Network; 
using System.Net; 

namespace ChatClient 
{ 
    class Program 
    { 
    static NetPeerConfiguration serverconfig; 
    static NetPeerConfiguration clientconfig; 
    static NetServer server; 
    static NetClient client; 

    static void Main() 
    { 
     NetPeerConfiguration serverconfig = new NetPeerConfiguration("chat"); 
     serverconfig.Port = 8081; 
     serverconfig.MaximumConnections = 100; 
     server = new NetServer(serverconfig); 
     Thread serverthread = new Thread(StartServer); 
     serverthread.Start(); 





     NetPeerConfiguration clientconfig = new NetPeerConfiguration("chat"); 
     clientconfig.AutoFlushSendQueue = false; 
     client = new NetClient(clientconfig); 
     Thread clientthread = new Thread(StartClient); 
     clientthread.Start(); 
     AcceptConsoleInput(); 

    } 

    static void StartServer() 
    { 
     server.Start(); 
     NetIncomingMessage message; 

     while (true) 
     { 
     message = server.WaitMessage(500); 
     if (message != null) 
     { 
      switch (message.MessageType) 
      { 
      case NetIncomingMessageType.DiscoveryRequest: 
       NetOutgoingMessage response = server.CreateMessage(); 
       response.Write((byte)1); // Do I need to do this? 
       server.SendDiscoveryResponse(response, message.SenderEndPoint); 
       break; 
      case NetIncomingMessageType.DebugMessage: 
       Console.ForegroundColor = ConsoleColor.Cyan; 
       Console.WriteLine("(Server) Debug: " + message.ReadString()); 
       break; 
      case NetIncomingMessageType.StatusChanged: 
       NetConnectionStatus status = (NetConnectionStatus)message.ReadByte(); 

       string reason = message.ReadString(); 
       Console.WriteLine(NetUtility.ToHexString(message.SenderConnection.RemoteUniqueIdentifier) + " " + status + ": " + reason); 

       if (status == NetConnectionStatus.Connected) 
       Console.WriteLine("Remote hail: " + message.SenderConnection.RemoteHailMessage.ReadString()); 
       break; 
      case NetIncomingMessageType.Data: 
       // incoming chat message from a client 
       string chat = message.ReadString(); 


       // broadcast this to all connections, except sender 
       List<NetConnection> all = server.Connections; // get copy 
                  //all.Remove(message.SenderConnection); 
       Console.WriteLine(all + "hello "); 

       NetOutgoingMessage om = server.CreateMessage(); 
       server.SendMessage(om, all, NetDeliveryMethod.ReliableOrdered, 0); 

       break; 
      default: 
       Console.ForegroundColor = ConsoleColor.Cyan; 
       Console.WriteLine("(Server) Unrecognized message type! (" + message.MessageType + ")"); 
       break; 
      } 
     } 
     server.Recycle(message); 
     } 
     Thread.Sleep(1); 
    } 

    static void StartClient() 
    { 
     client.Start(); 
     client.DiscoverLocalPeers(8081); 
     NetOutgoingMessage hail = client.CreateMessage("This is the hail message"); 


     NetIncomingMessage message; 

     while (true) 
     { 
     message = client.WaitMessage(500); 
     if (message != null) { 
     switch (message.MessageType) 
     { 
      case NetIncomingMessageType.DiscoveryResponse: 
       Console.WriteLine("(Client) Got response from server."); 
       client.Connect(message.SenderEndPoint, hail); 
       Console.WriteLine("(Client) Attempting to connect to server..."); 
       break; 

      case NetIncomingMessageType.DebugMessage: 
      Console.WriteLine(message.ReadString()); 
      break; 
      case NetIncomingMessageType.ErrorMessage: 
      Console.WriteLine(message.ReadString()); 
      break; 
      case NetIncomingMessageType.WarningMessage: 
      Console.WriteLine(message.ReadString()); 
      break; 
      case NetIncomingMessageType.VerboseDebugMessage: 
      Console.WriteLine(message.ReadString()); 
      break; 
      case NetIncomingMessageType.Data: 
      string chat = message.ReadString(); 
      break; 
      case NetIncomingMessageType.StatusChanged: 
      NetConnectionStatus status = (NetConnectionStatus)message.ReadByte(); 
      Console.WriteLine(status.ToString()); 
      break; 
      default: 
      Console.ForegroundColor = ConsoleColor.Cyan; 
      Console.WriteLine("(Client) Unrecognized message type! (" + message.MessageType + ")"); 
      break; 
     } 
     } 
     client.Recycle(message); 
     } 
    } 


    static void AcceptConsoleInput() 
    { 
     string input = Console.ReadLine(); 

     if (!string.IsNullOrWhiteSpace(input)) 
     { 
     NetOutgoingMessage om = client.CreateMessage(input); 
     client.SendMessage(om, NetDeliveryMethod.ReliableSequenced); 
     client.FlushSendQueue(); 
     } 

     AcceptConsoleInput(); 
    } 
    } 
} 

나는 꽤 바뀌었다. 거의 즉각적으로 메시지가 null이된다는 문제점을 발견했습니다. 계속 확인하고 null 인 경우에도 계속 확인하도록 변경했습니다.

관련 문제