通过套接字同时发送或接收文件或数据

本文关键字:文件 数据 套接字 | 更新日期: 2023-09-27 18:15:57

我的服务器每10秒发送一次ping,如果超过20秒没有回复就断开与客户端的连接

如果我要从服务器向客户端发送一个非常大的文件,或者反之亦然,send()或receive()方法可能会阻塞足够长的时间,以至于客户端在发送完成后立即超时。

另外,当发送方法正在运行时,我不能使用其他线程通过相同的套接字发送其他数据,否则我可能会损坏我正在发送的流和文件(或者我可以不损坏文件吗?)

我是否应该让客户端制作另一个套接字并连接到服务器的不同端口以进行长时间的发送/接收操作?

编辑:例如,服务器如何发送消息

    public void SendTo(System.Net.EndPoint toclient, byte[] data)
    { 
    foreach(ClientData client in clientlist)
    {
        if(client.s.RemoteEndPoint == toclient)
        {
            lock(client.sendlock)
            {
                int size = data.Length;
                byte[] sizebytes = new byte[4];
                sizebytes = BitConverter.GetBytes(size);
                client.s.Send(sizebytes);
                client.s.Send(data);
            }
        }
    }
    }

通过套接字同时发送或接收文件或数据

在这些情况下,您应该有一个专用的ping端口和另一个用于数据传输的端口。

当然,您需要为每个客户端维护两个打开的连接,但据我所知,一个连接的生命周期较短,而另一个(对于ping)的生命周期与客户端想要(或能够)连接的时间一样长。

关于你的代码,你可以稍微重构一下,让它更清晰:

var client = clients.FirstOrDefault(c => c.s.RemoteEndPoint == toclient);
if(client != null) 
{
     lock(client.sendlock)
     {
        int size = data.Length;
        byte[] sizebytes = new byte[4];
        sizebytes = BitConverter.GetBytes(size);
        client.s.Send(sizebytes);
        client.s.Send(data);
     }
}