关于socket发送数据需要注意的问题

 更新时间:2024年08月10日 09:07:59   作者:Soulic  
这篇文章主要介绍了关于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();
    }
}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • java字符串常用操作方法(查找、截取、分割)

    java字符串常用操作方法(查找、截取、分割)

    今天小编就为大家分享一篇java字符串常用操作方法(查找、截取、分割),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-07-07
  • Java从零编写吃货联盟订餐系统全程讲解

    Java从零编写吃货联盟订餐系统全程讲解

    这篇文章主要介绍了Java订餐系统,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-12-12
  • 详解Spring Boot Mysql 版本驱动连接池方案选择

    详解Spring Boot Mysql 版本驱动连接池方案选择

    这篇文章主要介绍了详解Spring Boot Mysql 版本驱动连接池方案选择,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-08-08
  • Java 程序员容易犯的10个SQL错误

    Java 程序员容易犯的10个SQL错误

    本文介绍了Java 程序员容易犯的10个SQL错误。具有很好的参考价值,下面跟着小编一起来看下吧
    2017-01-01
  • Java中的ReadWriteLock高效处理并发读写操作实例探究

    Java中的ReadWriteLock高效处理并发读写操作实例探究

    这篇文章主要为大家介绍了Java中的ReadWriteLock高效处理并发读写操作实例探究,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2024-01-01
  • springboot实现配置多环境yml方式

    springboot实现配置多环境yml方式

    在SpringBoot项目中,通过创建不同的YAML配置文件来实现多环境配置是一种常见且有效的方法,这些配置文件包括application.yml、application-dev.yml、application-prod.yml等,分别对应不同的开发环境,如开发环境、生产环境
    2024-11-11
  • java中用数组实现环形队列的示例代码

    java中用数组实现环形队列的示例代码

    这篇文章主要介绍了java中用数组实现环形队列的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • Springboot之自定义全局异常处理的实现

    Springboot之自定义全局异常处理的实现

    这篇文章主要介绍了Springboot之自定义全局异常处理的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-08-08
  • 登陆验证码kaptcha结合spring boot的用法详解

    登陆验证码kaptcha结合spring boot的用法详解

    在一个web应用中验证码是一个常见的元素。不管是防止机器人还是爬虫都有一定的作用,下面这篇文章主要给大家介绍了登陆验证码kaptcha结合spring boot用法的相关资料,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-06-06
  • Spring Boot基于 JWT 优化 Spring Security 无状态登录实战指南

    Spring Boot基于 JWT 优化 Spring Security 无状态登录实战指南

    本文介绍如何使用JWT优化SpringSecurity实现无状态登录,提高接口安全性,并通过实际操作步骤展示了如何配置JWT参数、实现JWT登录接口、认证过滤器等,感兴趣的朋友跟随小编一起看看吧
    2025-11-11

最新评论