Android 区分从socket.getInputStream()接收的消息

Android 区分从socket.getInputStream()接收的消息,android,ios,sockets,Android,Ios,Sockets,我遇到位问题,问题如下: 在服务器套接字上,服务器接收数据类型为字节数组: this.receiveStream = new DataInputStream(this.clientSocket.getInputStream()); byte[] receiveBuffer = new byte[bufferSize]; while (this.receiveStream.read(receiveBuffer, 0, receiveBuffer.length) > -1) { String

我遇到位问题,问题如下:

在服务器套接字上,服务器接收数据类型为字节数组:

this.receiveStream = new DataInputStream(this.clientSocket.getInputStream());
byte[] receiveBuffer = new byte[bufferSize];
while (this.receiveStream.read(receiveBuffer, 0, receiveBuffer.length) > -1) {
String dataReceive = new String(receiveBuffer, StandardCharsets.UTF_8).trim();
}
如果客户端在一个线程中发送文本消息,则服务器运行良好,但如果客户端在服务器上并发运行>=2个线程来发送文本消息,则消息是混合的,这意味着客户端AD1发送ABC,客户端AD2发送XYZ=>服务器接收AXBC或AXYZ,=>这不是预期的消息。 如何解决这个问题

p/S:我已经使用服务器以文本形式接收消息进行了测试,它运行良好:

while (true) {
String dataReceive = this.receiveStream.readUTF().trim();
}
但我不能使用它,因为服务器服务于多平台客户端,所以我希望服务器使用字节数组来接收数据

谢谢大家

更新: 我不能发布完整的代码,因为它是非常长的字符


这是链接所有代码客户端+服务器:

您使用TCP还是UDP?重要的是,插座不会隐藏差异

对于TCP, 客户端线程不得重用同一连接

每个客户端线程都必须打开自己的连接,就像它是不同设备上的应用程序一样

服务器必须在每次接收作业时启动一个新线程。该线程将使用自己的连接;服务于不同客户机的线程是独立的,就像它是不同设备上的应用程序一样

我想你看到了逻辑:一个客户端线程一个服务线程

我想您知道侦听套接字不接收数据,它创建了一个数据套接字

对于UDP,在服务器端,您必须自己区分客户端。
如果发送的是单个字节,则不可能,但数据包不是单个字节,UDP数据包包含辅助信息。您有发送方的IP和端口,因此如果客户端不是两个线程,并且在同一IP上使用同一端口,则可以区分它们。

使用子线程从套接字读取数据,并使用主线程接受请求并将其移交给子线程

服务器

客户


这只是一个示例实现,您可以包装这个概念。

感谢您的回复,是的,我的系统与您相同,这里的问题是:在客户端,函数sendKeepAlive将发送消息周期以检查与服务器的连接。所以当客户端发送消息时,然后在服务器上混合消息,这不是预期的消息。请检查更新问题并帮助我了解您的回答,我使用TCP套接字,这里的问题是:在客户端,函数sendKeepAlive将发送消息周期以检查与服务器的连接。所以当客户端发送消息时,然后在服务器上混合消息,这不是预期的消息。请检查更新问题并帮助我使用gNewClientSocket是绝对错误的。只有在只有一个客户端套接字的情况下,才可以使用全局变量。此外,我在ProcessingClient中看到私有ConcurrentLinkedQueue Online客户端。这意味着您尝试了不同的方法来让代码正常工作,但没有成功,而是让事情保持原样。只需重写一切。这是服务器可以服务于多个并发客户端连接,所以我不能为一个客户端使用全局变量。所有源代码,客户端可以一起发送和接收消息。当函数sendKeepAlive和用户SendMessage同时运行时会出现错误。只有当sendKeepAlive和sendUserMessage从不同的线程运行时,才可能发生此问题。在最坏的情况下,您可以在两个线程中执行synchronizedsomeLock{do actual sending},在我的代码中,函数sendDataToServer,我已经锁定了synchronized sendStream{},但这是相同的问题……有什么理想的吗?
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;

public class Server extends Thread {

    public Server(String ip, int port) {
        try {
            ServerSocket ser = new ServerSocket(port);
            System.out.println("Listening....");
            while (true) {
                Socket soc = ser.accept();
                new Child(soc).start();
                System.out.println("Child Started...");
            }

        } catch (IOException e) {
        }
    }

    private class Child extends Thread {

        Socket cSoc;

        public Child(Socket soc) {
            this.cSoc = soc;
        }

        @Override
        public void run() {
            try {
                String data = "";
                InputStream in = cSoc.getInputStream();
                BufferedReader br = new BufferedReader(new InputStreamReader(in));
                int ch = 0, cnt = 0;
                byte[] buffer = new byte[1024];
                int length = Integer.parseInt(br.readLine());
                System.out.println("Message Length = " + length);
                while ((ch = in.read(buffer)) != -1) {
                    data += new String(buffer);
                    cnt += ch;
                    if (cnt >= length) {
                        break;
                    }
                }
                System.out.println("Message = " + data);
            } catch (IOException ex) {

            }

        }

    }

    public static void main(String[] args) {
        new Server("localhost", 1234).start();
    }
}
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.Socket;

public class Client {

    public static void main(String[] args) {
        try {
            Socket s = new Socket("localhost", 1234);
            OutputStream o = s.getOutputStream();
            PrintStream ps = new PrintStream(o);
            String data = "your data";
            ps.println(data.length());
            Thread.sleep(100);
            o.write(data.getBytes());
            ps.close();
            o.close();

        } catch (Exception e) {
        }
    }
}