如何修复 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 的工作原理,并了解如何正确处理所有通信状态和错误。
我需要制作 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 的工作原理,并了解如何正确处理所有通信状态和错误。