如何在收到请求/数据后使服务器回复

本文关键字:数据 服务器 回复 请求 | 更新日期: 2023-09-27 18:35:49

>我正在尝试在客户端程序和服务器程序之间建立连接。将数据从客户端发送到服务器工作正常,但我不知道如何立即从服务器向客户端发送回回复。例如,在这种情况下,我有一个用于存储所有预订的酒店程序(服务器)和一个客户端程序,用于人们可以查找他们的预订。客户端程序将客户端的 ID 发送到服务器,并需要发送该客户端保留的序列化哈希表。

我的客户端代码如下所示:

Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
const int POORT = 4001;
IPAddress ipaddress = IPAddress.Parse("127.0.0.1");
socket.Connect(new IPEndPoint(ipaddress, POORT));
using (NetworkStream ns = new NetworkStream(socket)) {
     using (StreamWriter sw = new StreamWriter(ns)) {
           sw.WriteLine(klantId);
           sw.Flush();                 
     }
}
socket.Shutdown(SocketShutdown.Both);
socket.Close();

我的服务器代码:

IPAddress ipaddress = IPAddress.Parse("127.0.0.1");
IPEndPoint ep = new IPEndPoint(ipaddress, 4001);
Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream,                               ProtocolType.Tcp);
serverSocket.Bind(ep);
serverSocket.Listen(50);
try {
     string klantid;
     while (true) {
          using (Socket clientSocket = serverSocket.Accept()) {
              using (NetworkStream ns = new NetworkStream(clientSocket)) {
                  using (StreamReader sr = new StreamReader(ns)) {
                      klantid = sr.ReadLine();
                      // Searches the reservations
                      Hashtable reservaties = hotel.ReservatiesZoeken(int.Parse(klantid));
                      // Tried this to send the data. Doesn't seem to work.
                      using (MemoryStream stream = new MemoryStream()) {
                          BinaryFormatter formatter = new BinaryFormatter();
                             formatter.Serialize(stream, reservaties);
                             stream.Flush();
                          }
                      }
                  }
               }
          }
    }
    finally {
         serverSocket.Shutdown(SocketShutdown.Both);
         serverSocket.Close();
    } 

我想我可以在客户端中实现一个侦听器,并从服务器到客户端建立新的连接,但我忍不住觉得应该可以通过与请求相同的连接发送回复。

如何在收到请求/数据后使服务器回复

发送 ID 后立即关闭客户端上的套接字。您需要保持打开状态并等待服务器发送其数据,例如:

Socket socket = new Socket(AddressFamily.InterNetwork, ...);
// open and send ID
int dataAvailable = 0;
while (dataAvailable == 0 || dataAvailable != socket.Available)
{
    dataAvailable = socket.Available;
    Thread.Sleep(100); // if no new data after 100ms assume transmission finished
}
var data = new byte[dataAvailable];
socket.Receive(data);
socket.Shutdown(SocketShutdown.Both);
socket.Close();

免责声明:这不是"生产就绪代码",应该只是给你一个提示,你可以如何解决你的问题。特别是"等待 100ms"部分不应该在生产代码中使用......