Java基础-网络编程Server-Client通信(3)
package com.hspedu.net_; import org.junit.Test; import java.io.*; import java.net.ServerSocket; import java.net.Socket; public class MyServer { @Test public void startMyServer() throws IOException { ServerSocket serverSocket = new ServerSocket(8080); System.out.println("服务器server正在监听8080端口..."); Socket socket = serverSocket.accept(); // 1.server使用转换流InputStreamReader接收client发送的消息 InputStream inputStream = socket.getInputStream(); BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); String lineData; while ((lineData = bufferedReader.readLine()) != null) { System.out.println(lineData); } // 2.server使用转换流OutputStreamWriter回复消息给client OutputStream outputStream = socket.getOutputStream(); BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream)); bufferedWriter.write("服务器 >>> 客户端:hello, client."); bufferedWriter.newLine(); bufferedWriter.write("哈哈哈hhh"); bufferedWriter.newLine(); bufferedWriter.flush(); socket.shutdownOutput(); bufferedReader.close(); bufferedWriter.close(); socket.close(); serverSocket.close(); } }
1、使用bufferedWriter输出流必须手动调用flush方法刷新,使数据可以进入传输通道;
2、服务器server使用io回复消息必须使用socket.shutdownOutput写入结束标记,否则服务器server会认为还有数据要输出,客户端client会认为还有数据要读取,server和client都会阻塞;
package com.hspedu.net_; import org.junit.Test; import java.io.*; import java.net.InetAddress; import java.net.Socket; import java.net.UnknownHostException; /** * 转换流OutputStreamWriter、InputStreamReader实现server和client通信 */ public class MyClient { @Test public void startMyClient() throws IOException { Socket socket = new Socket(InetAddress.getLocalHost(), 8080); // 输出流 OutputStream outputStream = socket.getOutputStream(); BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream)); bufferedWriter.write("客户端 >>> 服务器:hello, server。"); bufferedWriter.newLine(); bufferedWriter.write("这是一条信息abc。"); bufferedWriter.newLine(); bufferedWriter.write("这是另一条信息123。"); bufferedWriter.newLine(); bufferedWriter.flush(); socket.shutdownOutput(); // 输入流:接收server回复的消息 InputStream inputStream = socket.getInputStream(); BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); String lineData; while ((lineData = bufferedReader.readLine()) != null) { System.out.println(lineData); } // 关闭资源 bufferedWriter.close(); bufferedReader.close(); socket.close(); } }
1、client同理也需要手动调用刷新flush方法;
2、关闭socket的输出流的标记。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用