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) {
}
}
}