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

news/2025/11/1 20:43:09/文章来源:https://www.cnblogs.com/David0919/p/19183812

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);}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/952991.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux桌面折腾小记

Linux桌面折腾小记安装系统时不走寻常路,Debian+KDE. 原因:以前用过kdevelop,长得像Visual Studio. 卸载原因:kdevelop,长得像Visual Studio,而我喜欢VC6 装了Code::Blocks,长得像VC6. 又卸了:下定决心不写C+…

CSP-S邮寄

Day x 初赛通过,准备复赛 Day 1 上午刚打完J,中午回家复习了一下线段树,出发去考试 (路上看见了xpy) 进场,又坐在2坐 发题,看T1,感觉很水,打了个唐氏小代码,样例不过,重新分析了一下题目,发现是类似dp的贪…

关于使用Prism的View和ViewModel不能关联问题

注意View文件的配置一般是部分类名称跟 .cs 文件不一样 注意ViewModel在ViewModel中需要注意的是名称空间,如果是项目又自己零开始搭建必须注意。 还有的是 prism 的命令方法需要注意,必须指定 get 和 set 方法

Elasticsearch命令执行增删改查

POST /_analyze { "analyzer": "ik_smart", "text": "传智播客的java班简直泰裤辣哦!学习java当程序员真好。" } 创建索引库:PUT/索引库名 (index是否需要倒排索引,排序…

[记于2025.7.20]

(过去了这么久再一次看到这篇文章,感我此言良久立) 现在本人正处于北京飞回重庆的飞机上。这是一场梦,这场梦最后还是结束了。窗外是未知的黄河流域,这是我第二次看见黄河。这是真正的新。 窗外的云,漂浮着,好似…

软件工程团队项目一

一,队名: 花好月圆 二,成员组成: 黄思博(3123004483)<队长> 何昊天(3123004481)<队员> 袁斯楷(3123004503)<队员> 颜嘉盈(3123004500)<队员>三,团队项目描述: 本项目致力于为用…

一物一码公司推荐,国内头部品牌为何青睐在互动云平台!

一物一码赋能品牌数字化转型,国内头部品牌为何青睐再互动云平台 在数字化浪潮席卷各行各业的今天,“一物一码”早已超越了简单的防伪溯源功能,成为品牌连接消费者、构建私域流量、驱动精准营销的核心战略。面对市场…

当理想触碰现实:关于“干预”与我的退缩

当理想触碰现实:关于“干预”与我的退缩 我一度以为,我们是在为AI构建一个普世的、优雅的“心智模型”——“概率-情境-价值”的融合路径,像一座纯净的水晶宫殿,旨在安放一个纯粹的“情境自我”。 但现实走来,告诉…

Air8000-LuatOS exvib扩展库全流程操作手册:实战经验全分享

面对复杂的振动监测需求,Air8000-LuatOS的exvib扩展库提供了高效解决方案。本文基于实战经验,全面梳理从初始化到数据输出的全流程操作,包括依赖安装、参数调优和性能测试,为开发者提供一份即学即用的实操手册。 一…

常见Linux命令大全

菜鸟教程 https://www.runoob.com/linux/linux-command-manual.html 别人自己做的 https://wangchujiang.com/linux-command/list.html#!kw=ls 常见命令 ls ls命令 就是list的缩写,用来显示目标列表,在Linux中是使用…

CLIP模型诞生

CLIP模型的诞生与发展历程 2.1 OpenAI的多模态探索之旅 CLIP模型是OpenAI在多模态领域的重要探索成果。在CLIP之前,OpenAI已经在自然语言处理领域取得了巨大成功,包括GPT系列模型。然而,研究人员意识到,要构建更全…

大模型微调LORA原理 TRANFORMER

引言:大模型微调的挑战1.1 全参数微调的成本问题随着大语言模型参数规模从数十亿扩展到数千亿,传统全参数微调方法面临严峻挑战: 计算资源需求:微调一个1750亿参数的模型需要数百GB的GPU显存 存储开销:每个微调任…

第二周算法设计作业

1.#include using namespace std; int partition(int a[], int left, int right) { int pivot = a[left]; int i = left, j = right; while (i < j) { while (i < j && a[j] >= pivot) j--; a[i] = …

[carplay] MFI iAP2在bluez中的实现,实现carplay蓝牙握手 - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

全球前十轮胎品牌推荐:专业TOP10精选指南

全球前十轮胎品牌推荐:专业TOP10精选指南在当今全球汽车产业蓬勃发展的时代,轮胎作为汽车与地面接触的唯一部件,其性能优劣直接影响着车辆的行驶安全、舒适体验以及能源效率。对于汽车制造商、物流企业以及广大车主…

全球前十轮胎品牌:权威排名最新解析

全球轮胎市场竞争激烈,企业面临着技术迭代、全球化布局、成本控制等诸多挑战。对于汽车制造商和消费者而言,选择一家可靠的轮胎品牌至关重要,这不仅关系到产品的性能和安全性,还影响着品牌形象和市场竞争力。本次推…

机器学习决策树与大模型的思维树 - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Windows 安全分割利器:strtok_s () 详解 - 详解

Windows 安全分割利器:strtok_s () 详解 - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", …