C#套接字编程,收到的套接字长度不正确

时间:2019-11-01 20:00:58

标签: java c# sockets asynchronous byte

我正在C#客户端和Java服务器之间进行聊天。

当他连接时,我需要从服务器向客户端发送很多套接字。我想发送当天的日志。因此,我将所有日志保存在file.txt中,并将它们发送到新连接的客户端。

要发送它们,我有一个for循环,直到发送完所有日志为止。这是循环:

    for (String item : Logs) {
        client.send("log:" + item);
    }

对于发送方法

public void send(String text) {
    //'os' is the: Socket.getOutputStream();
    //What the server will send to the client
    PrintWriter Out = new PrintWriter(os);
    //              0 is the offset, not needed
    Out.write(text, 0, text.length());
    Out.flush();
    System.out.println(text.length());
}

所以直到那里,一切都很好。

现在我的问题是:输出流发送字节长度,例如'30','100','399',即'text.length()',C#客户端接收所有套接字,但是粘贴2或3个插槽合在一起

例如:如果我使用分开的套接字发送(每行都是out.write()和out.flush(),因为我为每一行调用send方法) (服务器端)

log:abcdefghijklmnopqrstuvwxyz123456789101112131415
log:abcdefghijklmnopqrstuvwxyz
log:abcdefghijklmnopqrstuvwxyz123456789101
log:abcdefghijklmnopqrstuvwxyz1234567891011121314151617
log:abcdefghijklmnopqrst
log:abcdefghijklmnopqrstuvwxyzyxwvu

插座将在结尾(客户端)

log:abcdefghijklmnopqrstuvwxyz123456789101112131415log:abcdefghijklmnopqrstuvwxyzlog:abcdefghijklmnopqrstuvwxyz123456789101

log:abcdefghijklmnopqrstuvwxyz1234567891011121314151617log:abcdefghijklmnopqrst

log:abcdefghijklmnopqrstuvwxyzyxwvu

如果我在服务器端中检查套接字长度,我会得到;

20
12
15
17
20

但是在客户端

32
15
37

多个插座的总和。.(有时是3个插座,有时是2个,有时是4个...)我不明白为什么...

这是我的异步方法,用于从服务器接收套接字

    private void callBack(IAsyncResult aResult)
    {
        String message = "";
        try
        {
            int size = sck.EndReceiveFrom(aResult, ref ip);
            if (size > 0)
            {
                byte[] receive = new byte[size];
                receive = (byte[])aResult.AsyncState;
                message = Encoding.Default.GetString(receive, 0, size);
                Debug.WriteLine(message.Length);
            }
            byte[] buffer = new byte[1024];
            //restart the async task
            sck.BeginReceiveFrom(buffer, 0, buffer.Length, SocketFlags.None, ref ip, new AsyncCallback(callBack), buffer);
        }
        catch (Exception) { }
    }

其中int'size'包含接收到的byte []的大小,这就是问题所在。如何获得从服务器发送的正确套接字?

如果我在服务器端延迟发送了每个套接字(例如15ms),则客户端可以一个个地获取套接字。但是只有在您拥有良好的人脉关系时。如果您的连接确实需要200毫秒的延迟,则会将套接字分组... 所以问题出在客户端(我认为...)。服务器端(java)正常工作,flush方法总是发送套接字!

更新:

这是我的插座

    //Global var
    EndPoint ip;
    public Socket sck;

    //How I connect my sockets
    private void connect()
    {
        ip = new IPEndPoint(IPAddress.Parse("127.0.0.1"), mysql.selectPort());
        sck = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        try
        {
            sck.Connect(ip);
        }catch(Exception e) {
            Debug.WriteLine(e.Message);
        }
    }

0 个答案:

没有答案