可以在传输文件之前首先传输文件的长度
例如以下代码 客户端建立一次连接,首先发送了一个字符串,然后发送一个图片。如果直接发送会出现边界问题导致乱码。
可以先发送 message.getBytes().length 再发送message自身。
socket = new Socket(serverIP, port);
//4.发送消息
os = socket.getOutputStream();
String message = "连接成功";
os.write(message.getBytes().length);
os.write(message.getBytes());
//上传文件
fis = new FileInputStream(new File("net/beautiful.jpg"));
byte[] buffer = new byte[1024];
int len;
while ((len = fis.read(buffer)) != -1) {
os.write(buffer, 0, len);
}
服务器端
首先接收一个len表示接下来要接收的长度,然后就可以用is.read(buffer, 0, len)来接收客户端传来的这个字符串。
然后再接收图片就不会有乱码了
socket = serverSocket.accept();
//3.读取信息
is = socket.getInputStream();
//4.管道流!
baos = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len;
len = is.read();
is.read(buffer, 0, len);
baos.write(buffer);
System.out.println(baos.toString());
//接收文件
fos = new FileOutputStream(new File("net/receive.jpg"));
while ((len = is.read(buffer)) != -1) {
fos.write(buffer, 0, len);
}
该博客介绍了在TCP网络编程中如何避免传输字符串和文件时出现乱码和边界问题。通过首先发送文件长度,然后发送内容,确保服务器能正确接收和解析消息。在示例代码中,客户端先发送字符串长度,再发送字符串,接着上传文件;服务器端则先读取长度,按长度接收字符串,然后接收文件,有效解决了乱码和文件边界问题。
2068

被折叠的 条评论
为什么被折叠?



