我不能保持客户端与服务器的连接,也不能在客户端发出第一个请求后发送任何东西

本文关键字:客户端 第一个 请求 任何东 不能 服务器 连接 也不能 | 更新日期: 2023-09-27 18:08:22

我不能保持客户端连接到服务器或发送任何在客户端发出的第一个请求之后。我知道这是因为我在'SendCallback'方法关闭和关闭我的套接字,但否则它会向客户端发送垃圾邮件,直到客户端拒绝连接。我能做些什么来解决这个问题?希望我的解释足够清楚。

public class StateObject
{
// Client  socket.
public Socket workSocket = null;
// Size of receive buffer.
public const int BufferSize = 1024;
// Receive buffer.
public byte[] buffer = new byte[BufferSize];
// Received data string.
public StringBuilder sb = new StringBuilder();
}
public class AsynchronousSocketListener
{
// Thread signal.
public static ManualResetEvent allDone = new ManualResetEvent(false);
public static ArrayList terminal = new ArrayList();
private List<StateObject> clients;
public AsynchronousSocketListener()
{
}
public static void StartListening()
{
    // Data buffer for incoming data.
    byte[] bytes = new Byte[1024];
    // Establish the local endpoint for the socket.
    IPHostEntry ipHostInfo = Dns.Resolve("192.168.1.75");
    IPAddress ipAddress = ipHostInfo.AddressList[0];
    IPEndPoint localEndPoint = new IPEndPoint(ipAddress, 10008);
    // Create a TCP/IP socket.
    Socket listener = new Socket(AddressFamily.InterNetwork,
        SocketType.Stream, ProtocolType.Tcp);
    // Bind the socket to the local endpoint and listen for incoming connections.
    try
    {
        listener.Bind(localEndPoint);
        listener.Listen(100);
        while (true)
        {
            // Set the event to nonsignaled state.
            allDone.Reset();
            // Start an asynchronous socket to listen for connections.
            Console.WriteLine("Waiting for a connection...");
            listener.BeginAccept(
                new AsyncCallback(AcceptCallback),
                listener);
            // Wait until a connection is made before continuing.
            allDone.WaitOne();
            Console.WriteLine("Terminal Connected");
        }
    }
    catch (Exception e)
    {
        Console.WriteLine(e.ToString());
    }
    Console.WriteLine("Press ENTER to continue...");
    Console.Read();
}
public static void AcceptCallback(IAsyncResult ar)
{
    // Signal the main thread to continue.
    allDone.Set();
    // Get the socket that handles the client request.
    Socket listener = (Socket)ar.AsyncState;
    Socket handler = listener.EndAccept(ar);
    // Create the state object.
    StateObject state = new StateObject();
    state.workSocket = handler;
    handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0,
        new AsyncCallback(ReadCallback), state);
}
public static void ReadCallback(IAsyncResult ar)
{
    String content = String.Empty;
    // Retrieve the state object and the handler socket
    // from the asynchronous state object.
    StateObject state = (StateObject)ar.AsyncState;
    Socket handler = state.workSocket;
    // Read data from the client socket. 
    int bytesRead = handler.EndReceive(ar);
    if (bytesRead > 0)
    {
        // There  might be more data, so store the data received so far.
        state.sb.Append(Encoding.ASCII.GetString(
            state.buffer, 0, bytesRead));
        content = state.sb.ToString();
        Console.WriteLine( content );
        Send(handler);
     }
     else
     {
         Console.WriteLine("Failed to collect data.");
            // Not all data received. Get more.
            // Code would loop, leaving the server without answer.
            /*handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0,
            new AsyncCallback(ReadCallback), state);*/
     }
}
private static void Send(Socket handler)
{
    String data = String.Empty;
    Console.WriteLine("Sent Back:");
    data = ("002BSLL01V01000     DF02V0110");
    Console.WriteLine(data);
    // Convert the string data to byte data using ASCII encoding.
    byte[] byteData = Encoding.ASCII.GetBytes(data);
    // Begin sending the data to the remote device.
    handler.BeginSend(byteData, 0, byteData.Length, 0,
        new AsyncCallback(SendCallback), handler);
}
private static void SendCallback(IAsyncResult ar)
{
    try
    {
        // Retrieve the socket from the state object.
        Socket handler = (Socket)ar.AsyncState;
        // Complete sending the data to the remote device.
        int bytesSent = handler.EndSend(ar);
        Console.WriteLine("Sent {0} bytes to client.", bytesSent);
        Send(handler);
        handler.Shutdown(SocketShutdown.Both);
        handler.Close();
    }
    catch (Exception e)
    {
        Console.WriteLine(e.ToString());
    }
}

public static int Main(String[] args)
{
    StartListening();
    return 0;
}
}

我不能保持客户端与服务器的连接,也不能在客户端发出第一个请求后发送任何东西

我知道这是因为我关闭和关闭我的套接字在'SendCallback'方法

当然是。

,否则它将向客户端发送垃圾邮件

定义"发送给客户端的垃圾邮件"。

直到客户端拒绝连接。

您的意思是客户端关闭连接?连接已经存在,不能被"拒绝"。

我能做些什么来解决这个问题?

不要关闭插座;不要关闭它;并修复问题描述为'spam messages to client',不管这是什么意思。

希望我的解释足够清楚。

一点也不

当你收到ReadCallback中的数据时,你然后(即使你没有收到你所期望的所有数据)调用Send(),然后做异步发送,在发送回调中你然后再次调用Send(),这,我认为,就是你的意思是垃圾邮件客户端,因为这将只是循环发送相同的东西给客户端一遍又一遍。

我建议你首先检查一下你收到了什么,完全有可能的是,接收的调用不会一次返回你期望的所有数据。如果你不想再次将数据发送到客户端,那么不要在SendCallback中调用Send。

哦,删除shutdown和close socket的调用…