[英]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();
}
我面臨的問題是,一旦我實現通信,第二個響應就會崩潰:
通常每個套接字地址(協議/網絡地址/端口)只允許使用一次
那么,如何修復此錯誤並稍后允許發送文件? (稍后進行序列化等)
朋友,你似乎在這里重新發明輪子。 有了所有可用於執行此操作的技術,您沒有理由需要在“套接字”級別執行此操作。 更簡單:
除了套接字之外的任何東西。 你會浪費很多時間。
您確定您沒有嘗試多次啟動服務器嗎? 與客戶端不同,服務器永遠不會退出,並且Console.ReadLine
阻止您接收另一個客戶端,直到您按下 Enter 鍵。 我假設當您嘗試啟動新服務器時,舊服務器仍然掛在后台,這必然會失敗。 去掉ReadLine
,加上適當的退出服務器的方式,不要同時運行多台服務器,應該沒問題。
編寫自定義 TCP 客戶端/服務器應用程序非常棘手。 TCP 仍然是一個非常低級的協議,它可能不會像您期望的那樣工作。 如果您選擇遵循此路徑,請務必先了解 TCP 的工作原理,並了解如何正確處理所有通信狀態和錯誤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.