【从零学javase 第六天】网络编程(+多线程)

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);
            }
        }
    }
}
相关推荐
会飞的小新3 分钟前
C 标准库之 <fenv.h> 详解与深度解析
c语言·开发语言·microsoft
许彰午6 分钟前
09-媒体访问控制
网络
only-qi1 小时前
RAG 工作机制详解:构建高质量知识库的技术全流程
网络·人工智能·rag
shencz20001 小时前
在windows10里的apache2.4加php7.2的环境下上安装Laravel5.8框架
php·laravel
大不点wow1 小时前
Java序列化与反序列化:让对象走出JVM
java·开发语言·jvm
阿里嘎多学长1 小时前
2026-07-22 GitHub 热点项目精选
开发语言·程序员·github·代码托管
见合八方1 小时前
【噪声系数】高偏SOA噪声系数测试方法
网络·自动化·soa·光通信·激光雷达·半导体光放大器
噢,我明白了1 小时前
Java中日期和字符串的处理
java·开发语言·日期
爱刷碗的苏泓舒1 小时前
C 语言 if-else 与 switch-case 分支语句对比
c语言·开发语言
-银雾鸢尾-1 小时前
C#中的泛型约束
开发语言·c#