首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Lidgren网络,无法连接

Lidgren网络,无法连接
EN

Stack Overflow用户
提问于 2013-01-10 09:44:35
回答 2查看 3.7K关注 0票数 5

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

代码语言:javascript
复制
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();
    }
}

另外,它被卡住的地方:

EN

回答 2

Stack Overflow用户

发布于 2013-03-08 08:18:51

我发现了你的错误:

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

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

很抱歉,回复晚了。

票数 2
EN

Stack Overflow用户

发布于 2016-03-25 06:33:01

解决方案

代码语言:javascript
复制
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();
    }
  }
}

我改变了很多,这样我就可以对每个部分进行测试。我发现了问题所在,那就是消息几乎立即变为空。我将其更改为连续检查,即使它为空也要继续检查。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14249567

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档