首页 > 解决方案 > C# 套接字编程,接收到的套接字长度不正确

问题描述

我正在 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[] 的大小,这就是问题所在。如何获得从服务器发送的正确套接字?

如果我在服务器端延迟发送每个套接字(如 15 毫秒),则客户端可以一个接一个地获取套接字。但前提是你有一个良好的连接。如果您的连接确实有 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);
        }
    }

标签: javac#socketsasynchronousbyte

解决方案


推荐阅读