Java 网络编程实战教程:从零基础到群聊
本文适合刚会 Java 的同学,带你从零基础学 Java 网络编程,最终实现多客户端群聊。
一、网络编程基础概念
网络编程就是用程序让两台电脑互相传递信息。
- IP 地址 :电脑的网络位置,例如
127.0.0.1(本机) - 端口号 :程序监听的"门牌号",例如
8888 - 客户端(Client):发送消息
- 服务器(Server):接收消息
TCP(可靠通信)与 UDP(快速通信):
- TCP:保证顺序、保证不丢包,适合聊天、文件传输
- UDP:不保证顺序、可能丢包,适合视频、语音、游戏
本文先用 TCP 实现基础聊天程序,然后扩展到多客户端和群聊。
二、单客户端聊天(客户端 + 服务器)
服务器端(Server.java)
java
import java.io.*;
import java.net.*;
public class Server {
public static void main(String[] args) throws Exception {
ServerSocket server = new ServerSocket(8888);
System.out.println("服务器启动,等待客户端连接...");
Socket socket = server.accept();
System.out.println("客户端已连接");
BufferedReader reader = new BufferedReader(
new InputStreamReader(socket.getInputStream()));
PrintWriter writer = new PrintWriter(socket.getOutputStream(), true);
String msg;
while ((msg = reader.readLine()) != null) {
System.out.println("客户端说:" + msg);
writer.println("收到:" + msg);
if (msg.equalsIgnoreCase("bye")) break;
}
socket.close();
server.close();
}
}
客户端(Client.java)
java
import java.io.*;
import java.net.*;
public class Client {
public static void main(String[] args) throws Exception {
Socket socket = new Socket("127.0.0.1", 8888);
System.out.println("已连接服务器");
BufferedReader console = new BufferedReader(new InputStreamReader(System.in));
BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter writer = new PrintWriter(socket.getOutputStream(), true);
String msg;
while (true) {
System.out.print("发送给服务器:");
msg = console.readLine();
writer.println(msg);
if (msg.equalsIgnoreCase("bye")) break;
String reply = reader.readLine();
System.out.println("服务器说:" + reply);
}
socket.close();
}
}
三、多线程服务器(同时服务多个客户端)
java
import java.io.*;
import java.net.*;
public class MultiServer {
public static void main(String[] args) throws Exception {
ServerSocket server = new ServerSocket(8888);
System.out.println("多线程服务器启动...");
while (true) {
Socket socket = server.accept();
new Thread(() -> handleClient(socket)).start();
}
}
private static void handleClient(Socket socket) {
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter writer = new PrintWriter(socket.getOutputStream(), true);
String msg;
while ((msg = reader.readLine()) != null) {
System.out.println("客户端说:" + msg);
writer.println("收到:" + msg);
if (msg.equalsIgnoreCase("bye")) break;
}
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
四、群聊功能实现
java
import java.io.*;
import java.net.*;
import java.util.*;
public class ChatServer {
private static List<PrintWriter> clients = new ArrayList<>();
public static void main(String[] args) throws Exception {
ServerSocket server = new ServerSocket(8888);
System.out.println("群聊服务器启动...");
while (true) {
Socket socket = server.accept();
new Thread(() -> handleClient(socket)).start();
}
}
private static void handleClient(Socket socket) {
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter writer = new PrintWriter(socket.getOutputStream(), true);
synchronized (clients) { clients.add(writer); }
String msg;
while ((msg = reader.readLine()) != null) {
System.out.println("收到:" + msg);
broadcast(msg);
if (msg.equalsIgnoreCase("bye")) break;
}
synchronized (clients) { clients.remove(writer); }
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
private static void broadcast(String msg) {
synchronized (clients) {
for (PrintWriter out : clients) {
out.println(msg);
}
}
}
}