【问题标题】:Lidgren network, can't get it to connectLidgren 网络,无法连接
【发布时间】:2013-01-10 01:44:35
【问题描述】:

在我的 lindgren 网络测试中,我无法让我的客户端连接到我的服务器。 我尝试了多种连接方式,但是当我尝试连接时它总是停止。 抱歉,如果这是一个广泛的问题,但我做错了什么? 这是我的代码:

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();
    }
}

另外,卡住的地方:

【问题讨论】:

  • 提供的样本对您有用吗?
  • 是的,我刚刚编译了聊天示例,它运行良好。
  • 你可以尝试删除 serverconfig.LocalAddress = NetUtility.Resolve("localhost"); ?
  • 那做了一些事情,我得到了允许/禁止互联网访问程序的对话框。但它仍然没有连接。
  • 您是否尝试过禁用 Windows 防火墙?

标签: c# networking


【解决方案1】:

我发现了你的错误:

在您的void StartClient() 中,您在while 循环中设置message = server.ReadMessage()

这实际上应该是message = client.ReadMessage()

抱歉回复晚了。

【讨论】:

    【解决方案2】:

    解决方案

    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();
        }
      }
    }
    

    我改变了很多,所以我可以测试每个部分。我发现问题是消息几乎立即变为空。我将其更改为连续检查并继续检查,即使它为空。

    【讨论】:

      猜你喜欢
      • 2015-05-20
      • 1970-01-01
      • 1970-01-01
      • 2020-07-28
      • 2021-05-26
      • 2018-08-11
      • 2020-07-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多