服务器启动方法抛出异常,端口已被使用?

Server start method throws exception, port already in use?

我正在创建一个服务器-客户端应用程序,服务器和客户端可以在其中相互通信。 当我在服务器上调用 start 方法时,我收到一条错误消息:

Only one usage of each socket address (protocol/network address/port) is normally permitted

这里是Program.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net;
using System.Net.Sockets;

namespace NetworkingTest {
    class Program {
        static void Main(string[] args) {

            bool readLine = true;
            string input = "";

            while (true) {
                if (readLine == true) {
                    input = Console.ReadLine();
                }

                if (input == "server") {
                    Server server = new Server(IPAddress.Any, 12346);
                    readLine = false;
                }

                if (input == "client") {
                    Client client = new Client(IPAddress.Parse("myipv4"), 12346);
                    readLine = false;
                }
            }

        }
    }
}

这里是Server.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net;
using System.Net.Sockets;
using System.Threading;

namespace NetworkingTest {
    class Server {
        public TcpListener server;

        public Server (IPAddress ip, int port) {
            server = new TcpListener(ip, port);
            server.Start();

            Thread serverRunThread = new Thread(new ThreadStart(RunServer));

            serverRunThread.Start();
        }

        void RunServer () {
            while (true) {
                TcpClient client = server.AcceptTcpClient();
                Console.WriteLine("Client connected!");

                Thread serverHandlerThread = new Thread(new ParameterizedThreadStart(HandleClient));
                serverHandlerThread.Start(client);
            }
        }

        void HandleClient(object c) {
            TcpClient client = (TcpClient)c;
            NetworkStream stream = client.GetStream();

            int i;
            string data = null;
            byte[] bytes = new byte[256];

            while((i = stream.Read(bytes, 0, bytes.Length)) != 0)  {   
              data = Encoding.ASCII.GetString(bytes, 0, i);
              Console.WriteLine("Received: " + data);       
            }

            stream.Close();
            client.Close();
        }
    }
}

这里是 Client.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net;
using System.Net.Sockets;
using System.Threading;

namespace NetworkingTest {
    class Client {
        public TcpClient client;

        public Client (IPAddress ip, int port) {
            client = new TcpClient();
            client.Connect(ip, port);

            Thread thread = new Thread(new ThreadStart(ConnectToServer));
            thread.Start();
        }

        void ConnectToServer () {
            while (true) {
                string input = Console.ReadLine();

                if (input == "exit" || input == "quit" || input == "close") {
                    break;
                } else {
                    SendMessageToServer(input);
                }
            }
        }

        void SendMessageToServer (string message) {
            NetworkStream stream = client.GetStream();
            byte[] bytes = Encoding.ASCII.GetBytes(message);
            stream.Write(bytes, 0, bytes.Length);
            stream.Close();
        }
    }
}

编辑: Program.cs 中出现问题,修复了 while 循环:

        while (readLine == true) {
            input = Console.ReadLine();

            if (input == "server") {
                Server server = new Server(IPAddress.Any, 12346);
                readLine = false;
            }

            if (input == "client") {
                Client client = new Client(IPAddress.Parse("10.0.0.5"), 12346);
                readLine = false;
            }
        }

发生这种情况是因为 while(true) 循环中的错误。首先,您要求用户提供带有 Console.ReadLine() 的行。如果 input 是 "server" 你启动你的服务器,但是然后你去你的 while 循环的开始并且你的 readLine 变量是假的,并且 input 仍然是 "server",所以它创建了第二个服务器(基本上你有无限循环)。由于您在此端口上已经有一台服务器 - 第二次尝试失败并出现您看到的错误。

要修复、删除 while 循环,或更正确地执行此操作,如下所示:

static void Main(string[] args) {
    while (true) {
        Console.WriteLine("Type \"server\" to start server, type \"client\" to start client, type \"exit\" to exit");
        string input = Console.ReadLine();

        if (input == "server") {
            Server server = new Server(IPAddress.Any, 12346);
        }
        else if (input == "client") {
            Client client = new Client(IPAddress.Parse("myipv4"), 12346);
        }
        else if (input == "exit")
            return;
    }
}