【从零学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);
            }
        }
    }
}
相关推荐
数智化管理手记7 小时前
精益生产中的TPM管理是什么?一文破解设备零故障的密码
服务器·网络·数据库·低代码·制造·源代码管理·精益工程
Xudde.7 小时前
班级作业笔记报告0x04
笔记·学习·安全·web安全·php
晓晓hh7 小时前
JavaSE学习——迭代器
java·开发语言·学习
Laurence7 小时前
C++ 引入第三方库(一):直接引入源文件
开发语言·c++·第三方库·添加·添加库·添加包·源文件
kyriewen118 小时前
你点的“刷新”是假刷新?前端路由的瞒天过海术
开发语言·前端·javascript·ecmascript·html5
014-code8 小时前
String.intern() 到底干了什么
java·开发语言·面试
eastyuxiao8 小时前
如何在不同的机器上运行多个OpenClaw实例?
人工智能·git·架构·github·php
421!8 小时前
GPIO工作原理以及核心
开发语言·单片机·嵌入式硬件·学习
摇滚侠8 小时前
JAVA 项目教程《苍穹外卖-12》,微信小程序项目,前后端分离,从开发到部署
java·开发语言·vue.js·node.js
@insist1239 小时前
网络工程师-生成树协议(STP/RSTP/MSTP)核心原理与应用
服务器·开发语言·网络工程师·软考·软件水平考试