我需要制作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();
}
我面临的问题是,一旦我实现了沟通,第二个响应就会崩溃:
通常只允许使用每个套接字地址(协议/网络地址/端口)
那么,如何修复此错误以后再允许发送文件? (后来有序列化等)
答案 0 :(得分:1)
除插座外的任何东西。你会浪费很多时间。
答案 1 :(得分:1)
您确定没有尝试多次启动服务器吗?与客户端不同,服务器永不退出,Console.ReadLine
阻止您在按Enter键之前接收另一个客户端。我假设当您尝试启动新服务器时,旧服务器仍然挂在后台,这必然会失败。摆脱ReadLine
,添加正确的方法退出服务器,不要同时运行多个服务器,你应该没事。
编写自定义TCP客户端/服务器应用程序非常棘手。 TCP仍然是一个非常低级别的协议,它可能不会像你期望的那样工作。如果您选择遵循此路径,请确保首先了解TCP的工作原理,并了解如何正确处理所有通信状态和错误。