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

时间:2014-07-31 22:32:17

标签: c# sockets

我的服务器每隔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);
            }
        }

    }

    }

1 个答案:

答案 0 :(得分:0)

在这些情况下,您应该有一个专用的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);
     }
}