java中通过socket发送数据需先获取outputstream,将字符串转为utf-8字节数组后write写入,再显式flush或close触发实际发送;推荐用bufferedwriter或dataoutputstream封装提升效率与语义清晰度,并务必用try-with-resources处理异常和资源释放。

Java 中通过 Socket 的 getOutputStream() 发送数据,核心是获取输出流后写入字节,再确保刷新或关闭以触发实际网络发送。
拿到输出流并写入字节
Socket 建立连接后,调用 socket.getOutputStream() 获取 OutputStream 实例。它本质是面向字节的流,不能直接写字符串,需转为字节数组:
- 用
String.getBytes(StandardCharsets.UTF_8)转编码,避免平台默认编码不一致 - 调用
write(byte[])或write(int)写入数据 - 例如:
out.write("HELLO".getBytes(StandardCharsets.UTF_8));
必须 flush 或 close 才真正发出
OutputStream 可能带缓冲(尤其是包装成 BufferedOutputStream 时),不刷新数据可能卡在本地缓存中,对方收不到:
- 显式调用
out.flush()强制清空缓冲区、推送数据到网卡 - 如果后续不再写,可调用
out.close()(同时也会 flush) - 注意:
Socket.close()会自动关闭其关联的输入/输出流,但主动 flush 更可控
推荐配合 BufferedWriter 或 DataOutputStream 使用
直接操作原始 OutputStream 写文本较繁琐,常用装饰器提升效率和语义清晰度:
- 写文本行:用
new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), StandardCharsets.UTF_8)),然后调用write()+newLine()+flush() - 写结构化数据(如 int、double):用
DataOutputStream,支持writeInt()、writeUTF()等,对方用对应DataInputStream读取 - 无论哪种包装,底层仍依赖原始
OutputStream和最终的flush()
别忘了异常处理和资源释放
网络 I/O 易抛出 IOException,且流和 Socket 必须及时释放:
- 用 try-with-resources 自动关闭:
try (OutputStream out = socket.getOutputStream()) { ... } - 捕获
IOException并记录或重试,不要静默吞掉 - 服务端响应未读完就关流,可能导致连接异常中断;客户端发完也建议等响应再关
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











