【从零学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);
            }
        }
    }
}
相关推荐
xieliyu.5 小时前
Java算法精讲:双指针(二)
java·开发语言·算法
何以解忧,唯有..6 小时前
Python包管理工具pip:从入门到精通
开发语言·python·pip
雪的季节6 小时前
RabbitMQ详解
开发语言
张忠琳7 小时前
【SR-IOV cni】(Part 4) SR-IOV Network Device Plugin 3.11.0 — 超深度架构分析
网络·云原生·kubernetes·cni·sriov
ice8130331817 小时前
【Python】Matplotlib折线图绘制
开发语言·python·matplotlib
三品吉他手会点灯7 小时前
C语言学习笔记 - 44.运算符和表达式 - 运算符2 - 除法与取余运算符
c语言·开发语言·笔记·算法
kkeeper~7 小时前
0基础C语言积跬步之动态内存管理
c语言·开发语言
橘右今7 小时前
2026 Java后端高频面试宝典
java·开发语言·面试
微小冷7 小时前
Julia卫星工具箱SatelliteToolbox简介
开发语言·航天·坐标转换·julia·卫星工具箱
汤愈韬7 小时前
IPSec-NAT穿越原理和配置
网络·网络协议·安全·网络安全·security