【从零学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);
            }
        }
    }
}
相关推荐
2301_780789665 小时前
跨平台适配!SDK 游戏盾兼容全终端游戏场景
java·网络·ddos
第九序言T5 小时前
Python 数据处理进阶(十八)批量处理同结构文件:一个文件夹一次跑完
开发语言·python·自动化·pandas·数据处理
龙亘川7 小时前
构建城市公共安全数字底座:亘川智城智慧安防系统全维度解读
java·大数据·开发语言·人工智能·信息可视化
程序喵大人7 小时前
【C++入门】内存模型与资源管理 - 09 shared_ptr 和 weak_ptr 解决共享,也带来代价
开发语言·c++·资源管理·智能指针·内存模型
星融元asterfusion7 小时前
工业网络升级实战:100G 双轨 Leaf-Spine 架构破解高并发出货网络瓶颈
网络·架构·spine
Da Da 泓7 小时前
五子棋 Web 端测试用例报告
前端·网络·websocket·网络协议·测试用例·项目
Raas1007 小时前
AI网关部署方案?从部署到上线全流程
java·开发语言·人工智能·gateway·ai网关·企业级ai网关·企业级ai产品
云和数据.ChenGuang8 小时前
光哥说Python RAG 系统需要哪些评估指标:从检索到生成的全链路评测指南
网络·人工智能·python·算法·langchain
niucloud-admin8 小时前
NIUCLOUD PHP SAAS上门家政使用文档:城市管理
java·前端·php
专注仿真8 小时前
线性回归和逻辑回归算法详解
开发语言·人工智能·python·大模型训练·控制算法