尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

Day28-C:\Users\Lenovo\Desktop\note\code\JavaSE\Basic\src\com\IPDemo\BSDemo+TCP

Day28-C:\Users\Lenovo\Desktop\note\code\JavaSE\Basic\src\com\IPDemo\BSDemo+TCP
📅 发布时间:2026/6/22 2:42:14

TCP

image-20251101141106178

image-20251101141216807

image-20251101142337777

package Basic.src.com.IPDemo.TCPDemo.Demo01;import java.io.DataOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;public class Client {public static void main(String[] args) throws Exception {//1.创建一个socket对象,并同时请求与服务端程序连接Socket socket = new Socket("127.0.0.1", 8888);//socket管道//2.从socket通信管道中得到一个字节输出流,用来发数据给服务端程序OutputStream os = socket.getOutputStream();//3.把低级的字节输出流包装成数据输出流DataOutputStream dos = new DataOutputStream(os);//4.开始写数据出去dos.writeUTF("在一起,好吗?");dos.close();//关闭外部包装流会同时关闭内部的流//5.关闭管道,释放资源socket.close();}
}
package Basic.src.com.IPDemo.TCPDemo.Demo01;import java.io.DataInputStream;
import java.io.InputStream;
import java.net.DatagramSocket;
import java.net.ServerSocket;
import java.net.Socket;public class Server {public static void main(String[] args) throws Exception {System.out.println("=============服务端已开启============");//1.创建ServerSocket对象,同时为服务端注册端口ServerSocket serverSocket = new ServerSocket(8888);//2.使用ServerSocket对象,调用一个accept方法,等待客户端的连接请求Socket socket = serverSocket.accept();//启动后在此阻塞等待//3.从socket通信管道中获得一个字节输入流InputStream is = socket.getInputStream();//4.把原始低级的字节输入流包装成数据输入流DataInputStream dis = new DataInputStream(is);//5.使用数据输入流读取客户端数据String rs = dis.readUTF();//第二次阻塞等待System.out.println(rs);//其实我们也可以获取客户端的ip地址System.out.println(socket.getRemoteSocketAddress());dis.close();socket.close();//serverSocket.close();}
}

多发多收

package Basic.src.com.IPDemo.TCPDemo.Demo02;import java.io.DataOutputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;public class Client {public static void main(String[] args) throws Exception {//1.创建一个socket对象,并同时请求与服务端程序连接Socket socket = new Socket("127.0.0.1", 8888);//socket管道//2.从socket通信管道中得到一个字节输出流,用来发数据给服务端程序OutputStream os = socket.getOutputStream();//3.把低级的字节输出流包装成数据输出流DataOutputStream dos = new DataOutputStream(os);//让用户输入消息Scanner sc = new Scanner(System.in);while (true) {System.out.println("请说:");String msg = sc.nextLine();//一旦用户输入了"exit",就退出客户端程序if (msg.equals("exit")) {System.out.println("欢迎您下次光临,退出成功!");dos.close();socket.close();break;}//4.开始写数据出去dos.writeUTF(msg);dos.flush();//刷新出去,防止数据还在客户端的内存中:立即发生给服务端}
//        dos.close();//关闭外部包装流会同时关闭内部的流
//
//        //5.关闭管道,释放资源
//        socket.close();}
}
package Basic.src.com.IPDemo.TCPDemo.Demo02;import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;public class Server {public static void main(String[] args) throws Exception {System.out.println("=============服务端已开启============");//1.创建ServerSocket对象,同时为服务端注册端口ServerSocket serverSocket = new ServerSocket(8888);//2.使用ServerSocket对象,调用一个accept方法,等待客户端的连接请求Socket socket = serverSocket.accept();//启动后在此阻塞等待//3.从socket通信管道中获得一个字节输入流InputStream is = socket.getInputStream();//4.把原始低级的字节输入流包装成数据输入流DataInputStream dis = new DataInputStream(is);while (true) {try {//5.使用数据输入流读取客户端数据String rs = dis.readUTF();//第二次阻塞等待System.out.println(rs);//其实我们也可以获取客户端的ip地址System.out.println(socket.getRemoteSocketAddress());} catch (IOException e) {System.out.println(socket.getRemoteSocketAddress()+"离线了");dis.close();socket.close();break;}}//        dis.close();
//        socket.close();//serverSocket.close();}
}

多客户端通信:引入多线程

image-20251101151130776

package Basic.src.com.IPDemo.TCPDemo.Demo03;import java.io.DataOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;public class Client {public static void main(String[] args) throws Exception {//1.创建一个socket对象,并同时请求与服务端程序连接Socket socket = new Socket("127.0.0.1", 8888);//socket管道//2.从socket通信管道中得到一个字节输出流,用来发数据给服务端程序OutputStream os = socket.getOutputStream();//3.把低级的字节输出流包装成数据输出流DataOutputStream dos = new DataOutputStream(os);//让用户输入消息Scanner sc = new Scanner(System.in);while (true) {System.out.println("请说:");String msg = sc.nextLine();//一旦用户输入了"exit",就退出客户端程序if (msg.equals("exit")) {System.out.println("欢迎您下次光临,退出成功!");dos.close();socket.close();break;}//4.开始写数据出去dos.writeUTF(msg);dos.flush();//刷新出去,防止数据还在客户端的内存中:立即发生给服务端}}
}

多线程设置

package Basic.src.com.IPDemo.TCPDemo.Demo03;import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.Socket;public class ServerReaderThread1 extends Thread {private Socket socket;public ServerReaderThread1(Socket socket) {this.socket = socket;}@Overridepublic void run() {try {InputStream is = socket.getInputStream();DataInputStream dis = new DataInputStream(is);while (true) {String msg = null;try {msg = dis.readUTF();} catch (Exception e) {System.out.println("有人下线了:"+socket.getRemoteSocketAddress());dis.close();socket.close();break;}System.out.println(msg);}} catch (IOException e) {e.printStackTrace();}}
}

即时通信

群聊

image-20251101160619761

package Basic.src.com.IPDemo.TCPDemo.Demo04Forward;import java.io.DataOutputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;public class Client {public static void main(String[] args) throws Exception {//1.创建一个socket对象,并同时请求与服务端程序连接Socket socket = new Socket("127.0.0.1", 8888);//socket管道//TCP 的三次握手完成后,程序才会执行 Socket socket = new Socket("127.0.0.1", 8888); 之后的代码。//三次握手://客户端发送 SYN 包(请求连接);//服务端回复 SYN+ACK 包(同意连接);//客户端回复 ACK 包(确认连接)。//创建一个独立线程,负责随机从socket中接收服务端发过来的信息new ClentReaderThread(socket).start();//2.从socket通信管道中得到一个字节输出流,用来发数据给服务端程序OutputStream os = socket.getOutputStream();//3.把低级的字节输出流包装成数据输出流DataOutputStream dos = new DataOutputStream(os);//让用户输入消息Scanner sc = new Scanner(System.in);while (true) {System.out.println("请说:");String msg = sc.nextLine();//一旦用户输入了"exit",就退出客户端程序if (msg.equals("exit")) {System.out.println("欢迎您下次光临,退出成功!");dos.close();socket.close();break;}//4.开始写数据出去dos.writeUTF(msg);dos.flush();//刷新出去,防止数据还在客户端的内存中:立即发生给服务端}}
}
package Basic.src.com.IPDemo.TCPDemo.Demo04Forward;import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.Socket;public class ClentReaderThread extends Thread{private Socket socket;public ClentReaderThread(Socket socket){this.socket = socket;}@Overridepublic void run() {try {InputStream is = socket.getInputStream();DataInputStream dis = new DataInputStream(is);while (true) {//循环接收信号try {String msg = dis.readUTF();System.out.println(msg);//把这个消息分发给全部客户端接收,包括自己//sentMsgToAll(msg);} catch (Exception e) {System.out.println("自己下线了:"+socket.getRemoteSocketAddress());//Server.onlinesockets.remove(socket);dis.close();socket.close();break;}}} catch (IOException e) {e.printStackTrace();}}
}
package Basic.src.com.IPDemo.TCPDemo.Demo04Forward;import Basic.src.com.IPDemo.TCPDemo.Demo03.ServerReaderThread;import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;public class Server {public static List<Socket> onlinesockets = new CopyOnWriteArrayList<Socket>();public static void main(String[] args) throws IOException {System.out.println("=============服务端已开启============");//1.创建ServerSocket对象,同时为服务端注册端口ServerSocket serverSocket = new ServerSocket(8888);//Socket socket = new Socket("127.0.0.1", 8888);while (true) {//循环启动线程//2.使用ServerSocket对象,调用一个accept方法,等待客户端的连接请求Socket socket = serverSocket.accept();//启动后在此阻塞等待//Socket socket =  new ServerSocket(8888).accept();//启动后在此阻塞等待//追踪客户端上线onlinesockets.add(socket);//存入管道System.out.println("有人上线了"+socket.getRemoteSocketAddress());//3.把这个客户端对应的socket的通信管道交给一个独立的线程负责处理new ServerReadThreads(socket).start();}}
}
package Basic.src.com.IPDemo.TCPDemo.Demo04Forward;import java.io.*;
import java.net.Socket;public class ServerReadThreads extends Thread {private Socket socket;public ServerReadThreads(Socket socket) {this.socket = socket;}public void run() {System.out.println("转发程序启动:"+socket.getRemoteSocketAddress());try {InputStream is = socket.getInputStream();DataInputStream dis = new DataInputStream(is);while (true) {//循环接收信号try {String msg = dis.readUTF();System.out.println(msg);//把这个消息分发给全部客户端接收,包括自己sentMsgToAll(msg);} catch (Exception e) {System.out.println("有人下线了:"+socket.getRemoteSocketAddress());Server.onlinesockets.remove(socket);dis.close();socket.close();break;}}} catch (IOException e) {e.printStackTrace();}}private void sentMsgToAll(String msg)  throws Exception{//发送给全部在线的socket接收for (Socket onlinesocket : Server.onlinesockets){System.out.println("开始转发消息,在线客户端数:" + Server.onlinesockets.size());OutputStream os = onlinesocket.getOutputStream();DataOutputStream dos = new DataOutputStream(os);dos.writeUTF(msg);dos.flush();}}
}

BS

http协议: http://服务器IP:服务器端口

比如:http://127.0.0.1:8080

image-20251101175335466

image-20251101175540321

package Basic.src.com.IPDemo.BSDemo;import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;public class Server {public static void main(String[] args) throws Exception {System.out.println("=============服务端已开启============");//1.创建ServerSocket对象,同时为服务端注册端口ServerSocket serverSocket = new ServerSocket(8080);while (true) {//2.使用ServerSocket对象,调用一个accept方法,等待客户端的连接请求Socket socket = serverSocket.accept();System.out.println("有人上线了:"+socket.getRemoteSocketAddress());new ServerReaderThread(socket).start();}}
}
package Basic.src.com.IPDemo.BSDemo;import java.io.DataOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.Socket;public class ServerReaderThread extends Thread{private Socket socket;public ServerReaderThread(Socket socket) {this.socket = socket;}@Overridepublic void run() {//立即响应一个网页内容:“黑马程序员”给浏览器展示OutputStream os = null;try {os = socket.getOutputStream();PrintStream ps = new PrintStream(os);ps.println("HTTP/1.1 200 OK");ps.println("Content-Type: text/html; charset=UTF-8");ps.println();ps.println("<div style='color:red;font-size:140px;text-align:center;font-family:Arial'>密码的666<div style");ps.close();ps.close();socket.close();//网页响应是短连接} catch (IOException e) {throw new RuntimeException(e);}}
}

image-20251101181058275

package Basic.src.com.IPDemo.BSDemo;import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;public class Server {public static void main(String[] args) throws Exception {System.out.println("=============服务端已开启============");//1.创建ServerSocket对象,同时为服务端注册端口ServerSocket serverSocket = new ServerSocket(8080);while (true) {//2.使用ServerSocket对象,调用一个accept方法,等待客户端的连接请求Socket socket = serverSocket.accept();System.out.println("有人上线了:"+socket.getRemoteSocketAddress());new ServerReaderThread(socket).start();}}
}
package Basic.src.com.IPDemo.BSDemo;import java.io.DataOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.Socket;public class ServerReaderThread extends Thread{private Socket socket;public ServerReaderThread(Socket socket) {this.socket = socket;}@Overridepublic void run() {//立即响应一个网页内容:“黑马程序员”给浏览器展示OutputStream os = null;try {os = socket.getOutputStream();PrintStream ps = new PrintStream(os);ps.println("HTTP/1.1 200 OK");ps.println("Content-Type: text/html; charset=UTF-8");ps.println();ps.println("<div style='color:red;font-size:140px;text-align:center;font-family:Arial'>密码的666<div style");ps.close();ps.close();socket.close();//网页响应是短连接} catch (IOException e) {throw new RuntimeException(e);}}
}

相关新闻

  • Elasticsearch命令执行增删改查
  • 一物一码公司推荐,国内头部品牌为何青睐在互动云平台!
  • [carplay] MFI iAP2在bluez中的实现,实现carplay蓝牙握手 - 指南

最新新闻

  • Grok动态稀疏激活与确定性低延迟机制深度解析
  • MPC565/566 Nexus调试接口硬件配置与设计实战指南
  • Ubuntu 18.04下Nginx启用HTTP/2完整实践指南
  • 电动车托运避坑2026:最全靠谱平台筛选技巧+对比 - 快递物流资讯
  • Pinwheel调度与k-Visits问题:周期性任务调度的复杂度与算法实践
  • MIT协议下AI模型集成的合规实践与信源透明化

日新闻

  • 2026速览惠州叛逆青少年学校前十大排名名单出炉 - 武汉中职最新信息发布
  • 2026上饶白蚁消杀哪家好?15年本土2大权威白蚁防治公司推荐(金盾虫控/青蚁卫士) - 我叫一
  • 天龙八部单机版终极数据管理工具:5个技巧快速掌握游戏数据编辑

周新闻

  • Visual C++运行库修复终极指南:5分钟快速解决Windows软件启动错误
  • 手把手教你构建统计局地区经济数据爬虫:从环境搭建到数据持久化全指南
  • 2026多Agent深度解析:用AI团队替代单一模型,四种架构实战落地

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号