关于socket发送数据需要注意的问题
socket发送数据需要注意的问题
这两天在写socket通信的时候遇到一个问题,在服务器端使用BufferedWriter.write()和BufferedWriter.flush()向客户端发送信息后,客户端使用BufferedReader.readLine()怎么也读不到数据。
后来发现是因为没有在write之后创建新的行,所以客户端的readLine()不能判断行结束,一直在等待服务器发送行结束符,就出现客户端接收不到数据的现象。
解决的方法
是在write()后newLine(),再flush()客户端就可以了。
ServerSocket server = null;
try {
server = new ServerSocket(AppProvider.PORT, 0);
BufferedReader in;
BufferedWriter out;
while (true) {
Socket client = server.accept();
in = new BufferedReader(new InputStreamReader(client.getInputStream()));
out = new BufferedWriter(new OutputStreamWriter(client.getOutputStream()));
out.flush();
try {
String request = in.readLine();
String response = processMessage(request);
if (response != null) {
out.write(response);
out.newLine();
out.flush();
}
} catch (Exception e) {
e.printStackTrace();
}
in.close();
out.close();
client.close();
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (server != null && !server.isClosed()) {
try {
server.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}Java-socket上传 / 接收文件
Socket上传文件
//测试示例
public void upSocket(){
//Java中使用Socket进行文件上传的基本流程如下所示:
//创建客户端Socket对象并连接到服务器。可以通过指定IP地址和端口号来完成连接操作。
String serverIp = "服务器IP"; // 设置服务器IP地址
int port = 8080; // 设置服务器监听的端口号
Socket clientSocket = null;
InputStream inputStream = null;
OutputStream outputStream = null;
try {
clientSocket = new Socket(serverIp, port);
//获取输入/输出流对象,分别用于读取要发送的文件内容和写入从服务器返回的数据。
String filePath = "要上传的文件路径";
File fileToSend = new File(filePath);
if (!fileToSend.exists()) {
throw new IllegalArgumentException("指定的文件不存在!");
}
inputStream = new FileInputStream(filePath); // 设置要上传的文件路径
outputStream = clientSocket.getOutputStream();
//将文件内容逐段读取后写入输出流,直到文件结尾。
byte[] buffer = new byte[4096]; // 设置每次读取的字节大小
int bytesRead;
while ((bytesRead = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, bytesRead);
}
outputStream.flush(); // 确保数据被全部写入输出流
} catch (IOException e) {
e.printStackTrace();
}finally {
//关闭输入/输出流和Socket连接。
try {
inputStream.close();
outputStream.close();
clientSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
Socket接收文件
public static void main(String[] args) throws IOException {
int portNumber = 8080;
ServerSocket serverSocket = null;
InputStream inputStream = null;
FileOutputStream fileOutputStream = null;
try {
serverSocket = new ServerSocket(portNumber);
System.out.println("正在监听端口" + portNumber + "...");
Socket clientSocket = serverSocket.accept();
System.out.println("客户端已连接!");
inputStream = clientSocket.getInputStream();
fileOutputStream = new FileOutputStream("D:\\test\\received_file.txt");
byte[] buffer = new byte[4096];
int bytesRead;
while ((bytesRead = inputStream.read(buffer)) != -1) {
fileOutputStream.write(buffer, 0, bytesRead);
}
} catch (IOException e) {
e.printStackTrace();
}finally {
fileOutputStream.close();
inputStream.close();
serverSocket.close();
serverSocket.close();
}
}
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
相关文章
详解Spring Boot Mysql 版本驱动连接池方案选择
这篇文章主要介绍了详解Spring Boot Mysql 版本驱动连接池方案选择,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2019-08-08
Java中的ReadWriteLock高效处理并发读写操作实例探究
这篇文章主要为大家介绍了Java中的ReadWriteLock高效处理并发读写操作实例探究,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪2024-01-01
登陆验证码kaptcha结合spring boot的用法详解
在一个web应用中验证码是一个常见的元素。不管是防止机器人还是爬虫都有一定的作用,下面这篇文章主要给大家介绍了登陆验证码kaptcha结合spring boot用法的相关资料,需要的朋友可以参考借鉴,下面来一起看看吧。2017-06-06
Spring Boot基于 JWT 优化 Spring Security 无状态登录实战指南
本文介绍如何使用JWT优化SpringSecurity实现无状态登录,提高接口安全性,并通过实际操作步骤展示了如何配置JWT参数、实现JWT登录接口、认证过滤器等,感兴趣的朋友跟随小编一起看看吧2025-11-11


最新评论