编程自学指南:java程序设计开发,网络编程基础,TCP编程,UDP编程,HTTP客户端开发
编程自学指南:java程序设计开发,网络编程基础
学习目标:
-
理解网络协议(TCP/IP、UDP)的核心概念
-
掌握Socket编程实现客户端与服务端通信
-
能够通过多线程处理并发网络请求
-
开发简单的网络应用(如聊天程序、文件传输工具)
一、课程引入
1.1 网络编程的应用场景
-
实时通信:聊天软件、视频会议
-
数据传输:文件下载、云存储
-
远程控制:物联网设备管理、服务器监控
1.2 核心概念
-
IP地址:设备的唯一标识(如
192.168.1.1
) -
端口号:应用程序的通信入口(0~65535)
-
TCP vs UDP:
-
TCP:可靠传输(三次握手),如网页浏览、文件传输
-
UDP:高效但不可靠,如视频流、实时游戏
-
二、TCP编程
2.1 服务端开发步骤
-
创建
ServerSocket
监听端口 -
调用
accept()
等待客户端连接 -
通过输入输出流进行数据读写
-
关闭资源
案例1:服务端回声程序(Echo Server)
public class TCPServer {
public static void main(String[] args) throws IOException {
try (ServerSocket serverSocket = new ServerSocket(8888)) {
System.out.println("服务端启动,等待连接...");
Socket clientSocket = serverSocket.accept();
BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
String inputLine;
while ((inputLine = in.readLine()) != null) {
System.out.println("收到客户端消息:" + inputLine);
out.println("【服务端响应】" + inputLine); // 回声
}
}
}
}
2.2 客户端开发步骤
-
创建
Socket
连接服务端 -
通过输入输出流通信
案例2:TCP客户端
public class TCPClient {
public static void main(String[] args) throws IOException {
try (Socket socket = new Socket("localhost", 8888)) {
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in));
String userInput;
while ((userInput = stdIn.readLine()) != null) {
out.println(userInput);
System.out.println("服务端回复:" + in.readLine());
}
}
}
}
三、UDP编程
3.1 数据报通信(DatagramSocket)
案例3:UDP消息发送与接收
// 发送端
public class UDPSender {
public static void main(String[] args) throws IOException {
DatagramSocket socket = new DatagramSocket();
byte[] data = "Hello UDP".getBytes();
DatagramPacket packet = new DatagramPacket(data, data.length, InetAddress.getByName("localhost"), 9999);
socket.send(packet);
socket.close();
}
}
// 接收端
public class UDPReceiver {
public static void main(String[] args) throws IOException {
DatagramSocket socket = new DatagramSocket(9999);
byte[] buffer = new byte[1024];
DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
socket.receive(packet);
String msg = new String(packet.getData(), 0, packet.getLength());
System.out.println("收到消息:" + msg);
socket.close();
}
}
四、HTTP客户端开发
4.1 使用HttpURLConnection
案例4:获取网页内容
public class HTTPClient {
public static void main(String[] args) throws IOException {
URL url = new URL("https://www.example.com");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
try (BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()))) {
String line;
while ((line = in.readLine()) != null) {
System.out.println(line);
}
}
}
}
五、综合案例:多线程聊天室
5.1 服务端(支持多客户端)
public class ChatServer {
private static final List<Socket> clients = new ArrayList<>();
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(8888);
System.out.println("聊天室服务端启动...");
while (true) {
Socket clientSocket = serverSocket.accept();
clients.add(clientSocket);
new Thread(() -> handleClient(clientSocket)).start();
}
}
private static void handleClient(Socket clientSocket) {
try (BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()))) {
String msg;
while ((msg = in.readLine()) != null) {
System.out.println("广播消息:" + msg);
broadcast(msg, clientSocket);
}
} catch (IOException e) {
e.printStackTrace();
}
}
private static void broadcast(String msg, Socket sender) {
for (Socket client : clients) {
if (client != sender) {
try {
PrintWriter out = new PrintWriter(client.getOutputStream(), true);
out.println(msg);
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
5.2 客户端代码(参考案例2修改)
-
每个客户端独立线程接收服务端广播消息
六、常见错误与最佳实践
6.1 常见错误
-
错误1:端口被占用
new ServerSocket(8888); // 若端口已被占用,抛出BindException
错误2:未处理Socket超时
socket.setSoTimeout(5000); // 设置读取超时时间,避免无限等待
6.2 最佳实践
-
使用try-with-resources自动关闭Socket和流
-
TCP场景选择:
-
需可靠传输 → TCP(如文件传输)
-
需低延迟 → UDP(如实时游戏)
-
-
多线程优化:使用线程池(如
ExecutorService
)管理客户端连接
七、总结与练习
7.1 总结
-
TCP编程:可靠传输,需建立连接(三次握手)
-
UDP编程:高效但不可靠,适合实时场景
-
HTTP客户端:通过URLConnection访问Web服务
7.2 课后任务
-
实现一个TCP文件传输工具(客户端发送文件,服务端保存)
-
用UDP协议实现简单的时间服务器(客户端请求时间,服务端返回当前时间)
-
预习下一节课:反射与注解
7.3 扩展挑战
-
基于WebSocket实现实时聊天程序(可借助Java EE或Spring框架)