当前位置: 首页 > news >正文

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

Java 网络编程实战教程:从零基础到群聊

本文适合刚会 Java 的同学,带你从零基础学 Java 网络编程,最终实现多客户端群聊。


一、网络编程基础概念

网络编程就是用程序让两台电脑互相传递信息

  • IP 地址:电脑的网络位置,例如127.0.0.1(本机)
  • 端口号:程序监听的“门牌号”,例如8888
  • 客户端(Client):发送消息
  • 服务器(Server):接收消息

TCP(可靠通信)与 UDP(快速通信):

  • TCP:保证顺序、保证不丢包,适合聊天、文件传输
  • UDP:不保证顺序、可能丢包,适合视频、语音、游戏

本文先用 TCP 实现基础聊天程序,然后扩展到多客户端和群聊。


二、单客户端聊天(客户端 + 服务器)

服务器端(Server.java)

importjava.io.*;importjava.net.*;publicclassServer{publicstaticvoidmain(String[]args)throwsException{ServerSocketserver=newServerSocket(8888);System.out.println("服务器启动,等待客户端连接...");Socketsocket=server.accept();System.out.println("客户端已连接");BufferedReaderreader=newBufferedReader(newInputStreamReader(socket.getInputStream()));PrintWriterwriter=newPrintWriter(socket.getOutputStream(),true);Stringmsg;while((msg=reader.readLine())!=null){System.out.println("客户端说:"+msg);writer.println("收到:"+msg);if(msg.equalsIgnoreCase("bye"))break;}socket.close();server.close();}}

客户端(Client.java)

importjava.io.*;importjava.net.*;publicclassClient{publicstaticvoidmain(String[]args)throwsException{Socketsocket=newSocket("127.0.0.1",8888);System.out.println("已连接服务器");BufferedReaderconsole=newBufferedReader(newInputStreamReader(System.in));BufferedReaderreader=newBufferedReader(newInputStreamReader(socket.getInputStream()));PrintWriterwriter=newPrintWriter(socket.getOutputStream(),true);Stringmsg;while(true){System.out.print("发送给服务器:");msg=console.readLine();writer.println(msg);if(msg.equalsIgnoreCase("bye"))break;Stringreply=reader.readLine();System.out.println("服务器说:"+reply);}socket.close();}}

三、多线程服务器(同时服务多个客户端)

importjava.io.*;importjava.net.*;publicclassMultiServer{publicstaticvoidmain(String[]args)throwsException{ServerSocketserver=newServerSocket(8888);System.out.println("多线程服务器启动...");while(true){Socketsocket=server.accept();newThread(()->handleClient(socket)).start();}}privatestaticvoidhandleClient(Socketsocket){try{BufferedReaderreader=newBufferedReader(newInputStreamReader(socket.getInputStream()));PrintWriterwriter=newPrintWriter(socket.getOutputStream(),true);Stringmsg;while((msg=reader.readLine())!=null){System.out.println("客户端说:"+msg);writer.println("收到:"+msg);if(msg.equalsIgnoreCase("bye"))break;}socket.close();}catch(IOExceptione){e.printStackTrace();}}}

四、群聊功能实现

importjava.io.*;importjava.net.*;importjava.util.*;publicclassChatServer{privatestaticList<PrintWriter>clients=newArrayList<>();publicstaticvoidmain(String[]args)throwsException{ServerSocketserver=newServerSocket(8888);System.out.println("群聊服务器启动...");while(true){Socketsocket=server.accept();newThread(()->handleClient(socket)).start();}}privatestaticvoidhandleClient(Socketsocket){try{BufferedReaderreader=newBufferedReader(newInputStreamReader(socket.getInputStream()));PrintWriterwriter=newPrintWriter(socket.getOutputStream(),true);synchronized(clients){clients.add(writer);}Stringmsg;while((msg=reader.readLine())!=null){System.out.println("收到:"+msg);broadcast(msg);if(msg.equalsIgnoreCase("bye"))break;}synchronized(clients){clients.remove(writer);}socket.close();}catch(IOExceptione){e.printStackTrace();}}privatestaticvoidbroadcast(Stringmsg){synchronized(clients){for(PrintWriterout:clients){out.println(msg);}}}}
http://www.jsqmd.com/news/482337/

相关文章:

  • 阿里最新SpringBoot进阶笔记,2026快速上手突击必备!
  • Selenium 数据提取全攻略:从元素到页面数据一网打尽
  • 普通Java程序员如何快速上手性能调优?
  • LeetCode 50. Pow(x, n)
  • Unity平台跳跃游戏开发利器:Platformer Project 技术架构深度解析
  • 金三银四已到,Java就业压力为啥还没缓解?
  • JeecgBoot低代码 AI Skills 实战:自然语言驱动 BPM 流程自动生成
  • OpenClaw-龙虾智能体-新手入门必看,一文搞懂核心定义与应用场景
  • LeetCode-206:从数组反转到链表反转,一篇搞懂反转链表
  • IT界有哪些优秀的高并发解决方案?
  • 二次剩余
  • 手机秒变高清摄像头?这个工具用了就回不去了
  • 「JOI Open 2021」怪兽游戏题解
  • 词向量做句子相似度已经落伍?深度解析词移距离(WMD)为何能成为语义匹配新宠!
  • 三月十二
  • 十万个why:Nacos 服务注册为什么默认是临时实例?
  • MySQL 1045 登录失败,远程登录提示1045(本地登录正常)
  • 提示工程架构师深度钻研AI上下文工程长短期记忆机制设计的核心算法
  • AI 换脸软件 MagicMirror 下载安装教程全攻略:普通电脑也能轻松实现离线 AI 换脸
  • 【实证分析】上市公司债务融资成本数据-含代码(2006-2024年)
  • 线程池里的代码明明报错了,为什么控制台一行异常日志都不打?
  • 《Mastering Atari with Discrete World Models》随记
  • 11 张图总结下,微服务增量拉取
  • STM32入门(10)
  • 打开网站显示图片上传失败?错误怎么办|已解决
  • 校园网线是否可以通过两个路由器进行中转?
  • PHP 网站完整搬家避坑指南(新手必看,杜绝报错、断站)
  • Java 后端实现 token自动续期,这方案有点优雅!
  • AI 批量图片去水印工具 v1.0.0 - 豆包专属去水印
  • 分发:AI的终极护城河