如何修复 TCPIP server/clinet 应用程序通信

How to fix TCPIP server/clinet apps communication

我需要制作 TCPIP 服务器和客户端应用程序,它们将进行通信并发送一些随机文件。到目前为止,我做了这个:

服务器:

static void Main(string[] args)
{
     IPAddress localIP = IPAddress.Parse("127.0.0.1");
     TcpListener tcpServerListener = new TcpListener(localIP, 1234);
     tcpServerListener.Start();
     Console.WriteLine("Service started...");
     while (true)
     {
        var serverSocket = tcpServerListener.AcceptTcpClient();
        Console.WriteLine("Request accepted!");
        if (serverSocket.Connected)
        {
            Do(serverSocket);
        }
        Console.WriteLine("Waiting for new request...");
        Console.ReadLine();
    }
}

private static void Do(TcpClient serverSocket)
{
    var serverSockStream = serverSocket.GetStream();
    var reader = new StreamReader(serverSockStream);
    var poruka = reader.ReadLine();
    var odgovor = "Hello " + poruka;
    var writer = new StreamWriter(serverSockStream);
    writer.Flush();
    reader.Close();
    writer.Close();
}

客户:

static void Main(string[] args)
{
    TcpClient tcpClient = new TcpClient("127.0.0.1", 1234);
    NetworkStream clientSockStream = tcpClient.GetStream();
    var writer = new StreamWriter(clientSockStream);
    writer.WriteLine("TCP/IP Client");
    writer.Flush();
    var reader = new StreamReader(clientSockStream);
    var odgovor = reader.ReadLine();
    Console.WriteLine("Answer received: " + odgovor);
    writer.Close();
    reader.Close();
}

我遇到的问题是一旦实现通信,第二次响应就崩溃了:

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

那么,如何解决这个错误并允许发送文件呢? (稍后连载等)

朋友,你这边好像是在重新发明轮子。有了所有可用于执行此操作的技术,您没有理由需要在 "sockets" 级别上执行此操作。更简单:

  • 在一端使用 FTP 服务器,FTP 客户端内置于 .NET
  • 使用允许调用客户端发送流的方法编写 Web 服务。

除了套接字之外的任何东西。你会浪费很多时间。

您确定您没有尝试多次启动服务器吗?与客户端不同,服务器永远不会退出,并且 Console.ReadLine 会阻止您接收另一个客户端,直到您按下回车键。我假设当您尝试启动新服务器时旧服务器仍挂在后台,这必然会失败。去掉ReadLine,增加退出服务器的正确方法,不要同时运行多个服务器,应该没问题。

编写自定义 TCP client/server 应用程序非常棘手。 TCP 仍然是一个非常低级的协议,它可能不会按照您期望的方式工作。如果您选择走这条路,请务必先了解 TCP 的工作原理,并了解如何正确处理所有通信状态和错误。