Java C#套接字编程,接收的套接字长度为';不正确

Java C#套接字编程,接收的套接字长度为';不正确,java,c#,sockets,asynchronous,byte,Java,C#,Sockets,Asynchronous,Byte,我正在做一个C#clients和java服务器之间的聊天应用程序 当他连接时,我需要从服务器向客户端发送大量套接字。我想寄当天的日志。因此,我将所有日志保存在一个file.txt文件中,并将它们发送到新连接的客户端 对于发送它们,我有一个For循环,直到发送所有日志。以下是循环: for (String item : Logs) { client.send("log:" + item); } 对于发送方法: public void send(String tex

我正在做一个C#clients和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#client接收所有套接字,但是将2或3个套接字粘贴到一个

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

插座将在末端: (客户端)

如果我在服务器端检查套接字长度,我会得到这样的结果

20
12
15
17
20
但是在客户端

32
15
37
    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) { }
    }
    //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);
        }
    }
多个套接字加在一起的总和。(有时是3个套接字加在一起,有时是2个,有时是4个…)我不明白为什么

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

32
15
37
    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) { }
    }
    //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);
        }
    }
其中int'size'包含接收到的字节[]的大小,这就是问题所在。如何获得从服务器发送的正确套接字

如果我在服务器端延迟发送每个套接字(如15毫秒),则客户机可以逐个获取套接字。但是只有当你有一个良好的关系时。如果您的连接有200毫秒的延迟,那么您将对套接字进行分组所以问题出在客户端(我想…)。服务器(java)端工作正常,flush方法始终发送套接字

更新:

这是我的插座

32
15
37
    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) { }
    }
    //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);
        }
    }

首先,(几年前)你可以在Linux服务器上安装一个C#应用程序。第二,您不发送/接收套接字,而是使用它们来发送/接收数据。是的,我发送数据而不是套接字,这是我写作中的一个错误,但您没有回答我的问题。您能否演示如何声明
sck
?听起来像是通过UDP而不是TCP进行通信。我在线程上添加了套接字声明。但如果我只发送一个数据,它就工作了。因此,我认为问题不在于套接字连接,而在于如何从服务器接收数据。可能异步结果比发送数据的服务器慢,所以他溢出了,需要在相同的结果中放入一些数据??因为稍有延迟,它就部分工作了,“PrintWriter”类做什么?