我发送的字符串已使用DataOutput流转换为字节
// creates a client socket which connects to the first successor's server.
Socket clientSocket = new Socket(host, succ1_port);
// send the output_string to the first successor.
DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream());
outToServer.writeBytes(output_string);
然后通过SocketChannel接收它们:
// accept connection
SocketChannel connectionSocket = tcpserver.accept(); // tcpserver is a ServerSocketChannel
ByteBuffer buf = ByteBuffer.allocate(48);
// store and print no. of bytes read
int bytes_read = connectionSocket.read(buf);
System.out.println("bytes read = " +bytes_read);
String from_client_string = new String(buf.array(), Charset.forName("UTF-8"));
收到的邮件总是格式为“XXXX XXX”,其中X是0-9之间的任何数字。
然后我尝试将这些消息分成两部分:
Pattern p = Pattern.compile("([0-9]{4}) ([0-9]{3})");
Matcher m = p.matcher(from_client_string);
if (m.matches()){
int filename = Integer.parseInt(m.group(1));
int hash = Integer.parseInt(m.group(2));
System.out.println("filename = " +filename);
System.out.println("hash = " +hash);
else
System.out.println("no match");
问题是,有时当我打印出从bytebuffer转换的字符串时,其值会发生变化......通常它是正确的,如“1234 210”,但在其他情况下它可能会删除一个数字并显示“1234 21” 。然而即使它是正确的,我也没有匹配? 我还发现正在读取的字节数总是会改变...
有人知道这里的问题是什么吗?
感谢您的帮助。
答案 0 :(得分:1)
你应该继续读取套接字,直到它被关闭。如果没有可用的字节,则读取将被阻止,因此请确保您正在关闭另一端的连接。
所以在客户端
// creates a client socket which connects to the first successor's server.
Socket clientSocket = new Socket(host, succ1_port);
// send the output_string to the first successor.
DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream());
outToServer.writeBytes(output_string);
outToServer.close();
clientSocket.close();
在服务器端:
// accept connection
SocketChannel connectionSocket = tcpserver.accept(); // tcpserver is a ServerSocketChannel
ByteBuffer buf = ByteBuffer.allocate(48);
// store and print no. of bytes read
String result="";
while(connectionSocket.isOpen()){
int bytes_read = connectionSocket.read(buf);
System.out.println("bytes read = " +bytes_read);
String from_client_string = new String(buf.array(),0,bytes_read Charset.forName("UTF-8"));
reulst+= from_client_string;
} }
答案 1 :(得分:1)
当您使用ByteBuffer读取时,您将获得可用的字节数,这可能不是您编写的所有字节。 DataInputStream.readUTF()所做的是等待解码长度所需的字节数(16位无符号值)。
我建议您使用DataOutputStream.writeUTF(String)
和String DataInputStream.readUTF()
。我建议你也考虑使用缓冲。
答案 2 :(得分:0)
谢谢彼得!你的建议似乎正在起作用:)我会投票给你,但我没有足够的声誉。
发送数据:
// creates a client socket which connects to the first successor's server.
Socket clientSocket = new Socket(host, succ1_port);
// send the output_string to the first successor.
DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream());
outToServer.writeUTF(output_string);
outToServer.close();
clientSocket.close();
服务器端(接收数据)
// accept connection
SocketChannel connectionSocket = tcpserver.accept(); // tcpserver is a ServerSocketChannel
DataInputStream inToServer = new DataInputStream(connectionSocket.socket().getInputStream());
String from_client_string = inToServer.readUTF();
模式匹配的东西与OP中的相同......除了现在它实际上似乎有效:)