当前位置: 首页 > news >正文

Java Socket 基础教程

Java Socket 基础教程

Socket 简介

Socket 是网络通信的基础,允许不同主机之间进行数据传输。Java 提供了 java.net 包来实现 Socket 编程,支持 TCP 和 UDP 协议。

TCP Socket 编程

TCP 是一种面向连接的协议,提供可靠的数据传输。以下是 TCP Socket 的基本实现方式:

服务器端代码

import java.io.*;
import java.net.*;public class TCPServer {public static void main(String[] args) throws IOException {ServerSocket serverSocket = new ServerSocket(8080);System.out.println("Server started, waiting for client...");Socket clientSocket = serverSocket.accept();System.out.println("Client connected: " + clientSocket.getInetAddress());BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);String message = in.readLine();System.out.println("Received from client: " + message);out.println("Hello from server");clientSocket.close();serverSocket.close();}
}

客户端代码

import java.io.*;
import java.net.*;public class TCPClient {public static void main(String[] args) throws IOException {Socket socket = new Socket("localhost", 8080);PrintWriter out = new PrintWriter(socket.getOutputStream(), true);BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));out.println("Hello from client");String response = in.readLine();System.out.println("Received from server: " + response);socket.close();}
}

UDP Socket 编程

UDP 是一种无连接的协议,传输速度快但不可靠。以下是 UDP Socket 的基本实现方式:

服务器端代码

import java.net.*;public class UDPServer {public static void main(String[] args) throws Exception {DatagramSocket socket = new DatagramSocket(8080);byte[] buffer = new byte[1024];DatagramPacket packet = new DatagramPacket(buffer, buffer.length);socket.receive(packet);String message = new String(packet.getData(), 0, packet.getLength());System.out.println("Received from client: " + message);InetAddress clientAddress = packet.getAddress();int clientPort = packet.getPort();String response = "Hello from server";byte[] responseData = response.getBytes();DatagramPacket responsePacket = new DatagramPacket(responseData, responseData.length, clientAddress, clientPort);socket.send(responsePacket);socket.close();}
}

客户端代码

import java.net.*;public class UDPClient {public static void main(String[] args) throws Exception {DatagramSocket socket = new DatagramSocket();InetAddress serverAddress = InetAddress.getByName("localhost");String message = "Hello from client";byte[] sendData = message.getBytes();DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, serverAddress, 8080);socket.send(sendPacket);byte[] receiveData = new byte[1024];DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);socket.receive(receivePacket);String response = new String(receivePacket.getData(), 0, receivePacket.getLength());System.out.println("Received from server: " + response);socket.close();}
}

常见问题与注意事项
  • 端口占用:确保端口未被其他程序占用,否则会抛出 BindException
  • 资源释放:使用完毕后关闭 Socket 和流,避免资源泄漏。
  • 异常处理:网络通信可能抛出 IOException,建议使用 try-catch 块处理。
  • 多线程:服务器通常需要处理多个客户端连接,可以使用多线程或线程池。
进阶学习
  • NIO(非阻塞 IO):Java 提供了 java.nio 包,支持非阻塞 IO,适合高并发场景。
  • Netty 框架:基于 NIO 的高性能网络框架,简化了 Socket 编程的复杂性。
http://www.dtcms.com/a/330385.html

相关文章:

  • 新手入门 Makefile:FPGA 项目实战教程(一)
  • pnpm常用命令;为什么使用pnpm?
  • 古中医学习笔记专题文章导航
  • 【STM32入门教程】stm32简介
  • 基于 NVIDIA 生态的 Dynamo 风格分布式 LLM 推理架构
  • Kotlin Data Classes 快速上手
  • SwiftUI 页面弹窗操作
  • Windows批处理脚本自动合并当前目录下由You-get下载的未合并的音视频文件
  • Polyak-Ruppert 平均
  • UCLAMP3311T.TCT TVS二极管阵列 Semtech升特半导体 集成电路IC
  • tp5集成elasticsearch笔记
  • 20. 了解过尾递归优化吗
  • ASCII与Unicode:编码世界的奥秘
  • TLS 终止在真实业务中的防护价值
  • 36 C++ STL模板库5-string
  • Python网络爬虫(二) - 解析静态网页
  • IPTV系统:开启视听与管理的全新篇章
  • CMake 如何查找 Python2和Python3
  • 利用 Python 爬虫按图搜索 1688 商品(拍立淘)实战指南
  • 17. 如何判断一个对象是不是数组
  • 肖臻《区块链技术与应用》第十一讲:比特币核心概念重温:一文读懂私钥、交易、挖矿与网络现状
  • Redis7学习——Redis的十大类型String、List、Hash、Set、Zset
  • 解决:Gazebo连接模型数据库失败
  • linux 内核 - 内存管理概念
  • Apifox精准定义复杂API参数结构(oneOf/anyOf/allOf)
  • aave v3 存款与借款利息的计算方式
  • 码上爬第七题【协程+参数加密+响应解密+格式化检测】
  • C#面试题及详细答案120道(11-20)-- 面向对象编程(OOP)
  • LeetCode Day5 -- 二叉树
  • 嵌入式学习(day26)frambuffer帧缓冲