JAVA题目笔记(二十五)网络编程综合小练qa!3EF TG6U8.L;

一、多发多收

客户端:

import java.io.*;
import java.net.Socket;
import java.util.Scanner;public class Test1_2 {public static void main(String[] args) throws IOException {//TCP发送端Scanner sc=new Scanner(System.in);String b;//创建Socket对象Socket socket=new Socket("127.0.0.1",1000);OutputStream ops = socket.getOutputStream();//多次发送数据while(true){//从连接通道中获取输出流System.out.print("输入信息:");b=sc.nextLine();ops.write((b+"\r\n").getBytes());ops.flush();if(b.equals("886"))break;}socket.close();}
}

服务器:

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;public class Test1 {public static void main(String[] args) throws IOException {//TCP接收端//创建ServerSocket对象ServerSocket ss=new ServerSocket(1000);//接收数据Socket socket = ss.accept();//获取通道中的输入流InputStreamReader isr=new InputStreamReader(socket.getInputStream());int b;//多发多收while ((b = isr.read()) != -1) {System.out.print((char)b);}socket.close();ss.close();}
}

 Tips:

BufferedWriter
OutputStreamWriter这类因为自身带有缓冲区,因此只有当缓冲区填满时或者流关闭时才会向服务器传输数据。不适合多发多收。

二、接收和反馈

客户端:

import java.io.*;
import java.net.Socket;
import java.util.Scanner;public class Test2_2 {public static void main(String[] agrs) throws IOException {//TCP协议发送端//创建Socket对象//在创建对象的同时会连接服务器//如果连接不上,代码会报错Socket socket=new Socket("127.0.0.1",1000);//从连接通道种获取输出流OutputStream ops=socket.getOutputStream();Scanner sc=new Scanner(System.in);//写出数据String s=sc.nextLine();ops.write(s.getBytes());//关闭通道中输出流socket.shutdownOutput();//等待接收端反馈信息BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream()));String str = br.readLine();System.out.println(str);socket.close();}
}

服务器:

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class Test2 {public static void main(String[] args) throws IOException {//TCP协议接收端//创建ServerSocket对象ServerSocket ss=new ServerSocket(1000);//监听客户端的链接Socket socket=ss.accept();//从连接通道中获取输入流,读取数据(不能传中文)//使用转换流转化为字符流InputStreamReader isr=new InputStreamReader(socket.getInputStream());//为了读取效率,再套一个缓冲流BufferedReader br=new BufferedReader(isr);String s;while((s=br.readLine())!=null){System.out.println(s);}//关闭通道中的输入流socket.shutdownInput();//反馈//获取通道中的输出流socket.getOutputStream();BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));bw.write("已经接收到了信号");bw.close();socket.close();}
}

Tips: 

//读取结束标记
socket.shutdownInput();
//写入结束标记
socket.shutdownOutput();通道中的输出流和输入流两边都可以调取并使用

三、上传文件

客户端:

import java.io.*;
import java.net.Socket;public class Test3_2 {public static void main(String[] args) throws IOException {//发送端//创建Socket对象Socket socket=new Socket("127.0.0.1",1000);OutputStream ops=socket.getOutputStream();//根据通道输出流转换成字符流再转换成字符缓冲流BufferedOutputStream bos=new BufferedOutputStream(socket.getOutputStream());//读取本地文件BufferedInputStream bis=new BufferedInputStream(new FileInputStream("src\\MIUI10.jpg"));int len;byte[] bytes=new byte[1024];while((len=bis.read(bytes))!=-1){bos.write(bytes,0,len);bos.flush(); //刷新缓冲区}//本地文件读取结束bis.close();//输出流结束标记socket.shutdownOutput();//接收反馈信号BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream()));String b;while((b=br.readLine())!=null){System.out.println(b);}br.close();socket.close();}
}

服务器:

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;public class Test3 {public static void main(String[] args) throws IOException {//接收端//创建服务器对象ServerSocket ss=new ServerSocket(1000);//通道对象Socket socket = ss.accept();//获取通道的输入流BufferedInputStream bis=new BufferedInputStream(socket.getInputStream());//写入本地文件BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream("COPY.jpg"));int len;byte[] bytes=new byte[1024];while((len=bis.read(bytes))!=-1){//拷贝bos.write(bytes,0,len);bos.flush();//刷新缓冲区}bos.close();//读取结束标志socket.shutdownInput();//发送反馈//获取通道中的输出流BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));bw.write("文件接收完毕");bw.close();//刷新缓冲区//释放资源socket.close();}
}

四、解决三中重名问题

只需要修改服务器

服务器:

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.UUID;public class Test3 {public static void main(String[] args) throws IOException {//接收端//创建服务器对象ServerSocket ss=new ServerSocket(1000);//通道对象Socket socket = ss.accept();//获取通道的输入流BufferedInputStream bis=new BufferedInputStream(socket.getInputStream());//写入本地文件String name=UUID.randomUUID().toString().replace("-","");BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream(name+".jpg"));int len;byte[] bytes=new byte[1024];while((len=bis.read(bytes))!=-1){//拷贝bos.write(bytes,0,len);bos.flush();//刷新缓冲区}bos.close();//读取结束标志socket.shutdownInput();//发送反馈//获取通道中的输出流BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));bw.write("文件接收完毕");bw.close();//刷新缓冲区//释放资源socket.close();}
}

Tips:

String name=UUID.randomUUID().toString().replace("-","");
BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream(name+".jpg"));UUID类中的randomUUID方法:生成随机且唯一的序列号

五、上传文件(多线程版)

 服务器:

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;public class Test5 {public static void main(String[] args) throws IOException {//接收端//创建服务器对象ServerSocket ss=new ServerSocket(1000);while(true){//阻塞状态:等待客户端连接Socket socket = ss.accept();new MyThread(socket).start();}}
}

线程对象:

import java.io.*;
import java.net.Socket;
import java.util.UUID;public class MyThread extends Thread{private Socket socket;public MyThread(Socket socket){this.socket=socket;}@Overridepublic void run() {//通道对象try {//获取通道的输入流BufferedInputStream bis = new BufferedInputStream(this.socket.getInputStream());//写入本地文件String name = UUID.randomUUID().toString().replace("-", "");BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(name + ".jpg"));int len;byte[] bytes = new byte[1024];while ((len = bis.read(bytes)) != -1) {//拷贝bos.write(bytes, 0, len);bos.flush();//刷新缓冲区}bos.close();//读取结束标志this.socket.shutdownInput();//发送反馈//获取通道中的输出流BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(this.socket.getOutputStream()));bw.write("文件接收完毕");bw.close();//刷新缓冲区} catch (IOException e) {throw new RuntimeException(e);} finally {//释放资源if(socket!=null){//避免空指针异常//若socket为null 对其调用close方法,则会导致空指针异常try {this.socket.close();} catch (IOException e) {throw new RuntimeException(e);}}}}
}

六、上传文件(线程池版)

 服务器:

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;public class Test6 {public static void main(String[] args) throws IOException {//接收端//创建线程池对象ThreadPoolExecutor pool=new ThreadPoolExecutor(3,//核心线程数量 不能小于016,//最大线程数 不能小于0,最大数量必须要大于等于核心数量60,//空闲线程的最大存活时间TimeUnit.SECONDS,//时间单位new ArrayBlockingQueue<>(3),//任务队列Executors.defaultThreadFactory(),//创建线程工厂new ThreadPoolExecutor.AbortPolicy()  //创建任务的拒绝策略(新建一个类的内部类));//创建服务器对象ServerSocket ss=new ServerSocket(1000);while(true){//阻塞状态:等待客户端连接Socket socket = ss.accept();//添加入线程池pool.submit(new MyThread(socket));}}
}

七、多人聊天室

 客户端:

import java.io.*;
import java.net.Socket;
import java.util.Scanner;public class TalkRoom_client {public static void main(String[] args) throws IOException {//客户端//创建Socket对象Socket socket=new Socket("127.0.0.1",1000);while(true){show();Scanner sc = new Scanner(System.in);String choose = sc.nextLine();if (choose.equals("1")) {//登录选择Login(socket);} else if (choose.equals("2")) {//注册Register(socket);} else {//选择不对System.out.println("无效选择,请输入 1 或 2  ");}}}private static void Register(Socket socket) throws IOException {Scanner sc=new Scanner(System.in);//向服务器传输注册标志SendMessageToClient(socket,"register");while(true){//开始注册流程showRegister();System.out.print("请输入账号:");String account=sc.nextLine();System.out.println("请输入密码:");String password=sc.nextLine();int result=check(account,password);//1 正确   2 账号错误  3 密码错误if(result==1){//正确,进行传输String str=account+"="+password;SendMessageToClient(socket,str);System.out.println("注册成功");break;}else if(result==2){//账号违法System.out.println("账号违法,请重新注册");}else{//密码违法System.out.println("密码违法,请重新注册");}}}public static void TalkToAll(Socket socket) throws IOException {Scanner sc=new Scanner(System.in);System.out.println("开始聊天");while(true){System.out.println("请输入要说的话:");String str=sc.nextLine();SendMessageToClient(socket,str);}}public static int check(String account,String password){if(account.matches("[a-zA-Z]{6,12}")){if(password.matches("[a-zA-Z]\\d{2,7}")){//全对return 1;}else{//密码不对return 3;}}else return 2; //账号不对}public static void Login(Socket socket) throws IOException {Scanner sc=new Scanner(System.in);//字符缓冲流:用于传输账号密码信息BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));//向服务器传输登录标志bw.write("login");bw.newLine();bw.flush();System.out.println("请输入您的账号:");String account = sc.nextLine();bw.write(account);bw.write("&");System.out.println("请输入您的密码:");String password = sc.nextLine();bw.write(password);bw.newLine();bw.flush();//接收反馈String s = br.readLine();System.out.println("结果为:"+s);//1 登录成功  2 密码错误 3 账号不存在if("1".equals(s)){System.out.println("登录成功");new ReceiveMessage(socket).start();//开始聊天TalkToAll(socket);}else if("2".equals(s)){System.out.println("密码错误");}else {System.out.println("账号不存在");}}public static void SendMessageToClient(Socket socket,String str) throws IOException {BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));bw.write(str);bw.newLine();bw.flush();}public static void show(){System.out.println("=======聊天室========");System.out.println("1、登录");System.out.println("2、注册");System.out.println("请输入您的选择:");}public static void showRegister(){System.out.println("开始注册");System.out.println("账号要求:6~12位,纯字母");System.out.println("密码要求:3~8位,第一位必须为字母,其余纯数字");}
}

 服务器:

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;public class TalkRoom_server {public static void main(String[] args) throws IOException {//创建服务器ServerSocket ss=new ServerSocket(1000);//创建一个存放socket的集合来进行统一操作ArrayList<Socket> socketlist=new ArrayList<>();while(true){//等待客户端连接Socket socket = ss.accept();socketlist.add(socket);new ClientThread(socket,socketlist).start();}}
}

 客户端线程:

import java.io.*;
import java.net.Socket;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;public class ClientThread extends Thread{static File file=new File("tst.txt"); //存放账号信息的本地文件private Socket socket;private ArrayList<Socket> socketlist;private Map<String,String> map=new HashMap<>();public ClientThread(Socket socket,ArrayList<Socket> socketlist){this.socket=socket;this.socketlist=socketlist;}public void updateMap() throws IOException {//读取本地文件中的账号信息存入集合中BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(new FileInputStream("tst.txt")));String b;while((b=bufferedReader.readLine())!=null){String[] strings = b.split("=");map.put(strings[0],strings[1]);}}@Overridepublic void run() {while(true){try {//接收用户传过来的信息BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));//第一次传输的是选择String choose = br.readLine();switch (choose) {case "login":System.out.println("用户选择登录");//登录操作//先更新本地文件mapupdateMap();login(br, socket, map);break;case "register"://注册操作System.out.println("用户选择注册");register(br,socket,file);break;}} catch (IOException e) {throw new RuntimeException(e);}}}public void register(BufferedReader br,Socket socket,File file) throws IOException {//接收传过来的注册信息String b=br.readLine();//写入本地文件BufferedWriter bufferedWriter=new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file,true)));bufferedWriter.write(b);bufferedWriter.newLine();bufferedWriter.close();//更新本地文件updateMap();}public void login(BufferedReader br,Socket socket,Map<String,String> map) throws IOException {ArrayList<String> list=new ArrayList<>();//获取传输过来的账号密码信息String info=br.readLine();  //account&passwordString[] split = info.split("&");System.out.println("用户输入账号为:"+split[0]);System.out.println("用户输入密码为:"+split[1]);list.add(split[0]);list.add(split[1]);if(map.get(list.get(0))!=null){//账号存在if(map.get(list.get(0)).equals(list.get(1))){//密码正确System.out.println("用户"+list.get(0)+"登录成功");SendMessageToClient("1");//开始聊天//接收ReceiveMessageFromClient(list.get(0),socketlist);}else {//密码错误System.out.println("密码错误");SendMessageToClient("2");}}else{//根本不存在账号System.out.println("账号不存在");SendMessageToClient("3");}}public void SendMessageToClient(String str,ArrayList<Socket> socketlist) throws IOException {for (Socket s : socketlist) {BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));bw.write(str);bw.newLine();bw.flush();}}public void SendMessageToClient(String str) throws IOException {BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));bw.write(str);bw.newLine();bw.flush();}public void ReceiveMessageFromClient(String name,ArrayList<Socket> socketlist) throws IOException {BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream()));String b;while((b=br.readLine())!=null){System.out.println("用户"+name+"发送了信息:"+b);//广播给所有用户SendMessageToClient("用户"+name+"发送了信息:"+b,socketlist);}}
}

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

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

相关文章

决策树的生成与剪枝

决策树的生成与剪枝 决策树的生成生成决策树的过程决策树的生成算法 决策树的剪枝决策树的损失函数决策树的剪枝算法 代码 决策树的生成 生成决策树的过程 为了方便分析描述&#xff0c;我们对上节课中的训练样本进行编号&#xff0c;每个样本加一个ID值&#xff0c;如图所示…

基于SpringBoot的疫苗在线预约功能实现十二

一、前言介绍&#xff1a; 1.1 项目摘要 随着全球公共卫生事件的频发&#xff0c;如新冠疫情的爆发&#xff0c;疫苗成为了预防和控制传染病的重要手段。传统的疫苗预约方式&#xff0c;如人工挂号或电话预约&#xff0c;存在效率低、易出错、手续繁琐等问题&#xff0c;无法…

MySQL基础 -----MySQL数据类型

目录 INT类型 tinyint类型 类型大小范围 测试tinyint类型数据 float类型 测试&#xff1a; 测试正常数据范围的数据 测试插入范围超过临界值的数据&#xff1a; 测试float类型的四舍五入 ​编辑 decimal类型 同样测试&#xff1a; 字符串类型 char类型 测试&…

代码开发相关操作

使用Vue项目管理器创建项目&#xff1a;&#xff08;vue脚手架安装一次就可以全局使用&#xff09; windowR打开命令窗口&#xff0c;输入vue ui&#xff0c;进入GUI页面&#xff0c;点击创建-> 设置项目名称&#xff0c;在初始化git下面输入&#xff1a;init project&…

如何在 Ubuntu 22.04 上安装和使用 Rust 编程语言环境

简介 Rust 是一门由 Mozilla 开发的系统编程语言&#xff0c;专注于性能、可靠性和内存安全。它在没有垃圾收集的情况下实现了内存安全&#xff0c;这使其成为构建对性能要求苛刻的应用程序&#xff08;如操作系统、游戏引擎和嵌入式系统&#xff09;的理想选择。 接下来&…

MybatisPlus-配置加密

配置加密 目前配置文件中的很多参数都是明文&#xff0c;如果开发人员发生流动&#xff0c;很容易导致敏感信息的泄露。所以MybatisPlus支持配置文件的加密和解密功能。 我们以数据库的用户名和密码为例。 生成秘钥 首先&#xff0c;我们利用AES工具生成一个随机秘钥&#…

记录:virt-manager配置Ubuntu arm虚拟机

virt-manager&#xff08;Virtual Machine Manager&#xff09;是一个图形用户界面应用程序&#xff0c;通过libvirt管理虚拟机&#xff08;即作为libvirt的图形前端&#xff09; 因为要在Linux arm环境做测试&#xff0c;记录下virt-manager配置arm虚拟机的过程 先在VMWare中…

ChatGPT客户端安装教程(附下载链接)

用惯了各类AI的我们发现每天打开网页还挺不习惯和麻烦&#xff0c;突然发现客户端上架了&#xff0c;懂摸鱼的人都知道这里面的道行有多深&#xff0c;话不多说&#xff0c;开整&#xff01; 以下是ChatGPT客户端的详细安装教程&#xff0c;适用于Windows和Mac系统&#xff1a…

Element@2.15.14-tree checkStrictly 状态实现父项联动子项,实现节点自定义编辑、新增、删除功能

背景&#xff1a;现在有一个新需求&#xff0c;需要借助树结构来实现词库的分类管理&#xff0c;树的节点是不同的分类&#xff0c;不同的分类可以有自己的词库&#xff0c;所以父子节点是互不影响的&#xff1b;同样为了选择的方便性&#xff0c;提出了新需求&#xff0c;选择…

概率论得学习和整理27:关于离散的数组 随机变量数组的均值,方差的求法3种公式,思考和细节。

目录 1 例子1&#xff1a;最典型的&#xff0c;最简单的数组的均值&#xff0c;方差的求法 2 例子1的问题&#xff1a;例子1只是1个特例&#xff0c;而不是普遍情况。 2.1 例子1各种默认假设&#xff0c;导致了求均值和方差的特殊性&#xff0c;特别简单。 2.2 我觉得 加权…

【HarmonyOS NEXT】Web 组件的基础用法以及 H5 侧与原生侧的双向数据通讯

关键词&#xff1a;鸿蒙、ArkTs、Web组件、通讯、数据 官方文档Web组件用法介绍&#xff1a;文档中心 Web 组件加载沙箱中页面可参考我的另一篇文章&#xff1a;【HarmonyOS NEXT】 如何将rawfile中文件复制到沙箱中_鸿蒙rawfile 复制到沙箱-CSDN博客 目录 如何在鸿蒙应用中加…

ASP.NET Core - 依赖注入 自动批量注入

依赖注入配置变形 随着业务的增长&#xff0c;我们项目工作中的类型、服务越来越多&#xff0c;而每一个服务的依赖注入关系都需要在入口文件通过Service.Add{}方法去进行注册&#xff0c;这将是非常麻烦的&#xff0c;入口文件需要频繁改动&#xff0c;而且代码组织管理也会变…

Spring Boot 3.X:Unable to connect to Redis错误记录

一.背景 最近在搭建一个新项目&#xff0c;本着有新用新的原则&#xff0c;项目选择到了jdk17SpringBoot3.4。但是在测试Redis连接的时候却遇到了以下问题&#xff1a; redis连不上了。于是我先去检查了配置文件的连接信息&#xff0c;发现没问题&#xff1b;再去检查配置类&am…

FFmpeg第一话:FFmpeg 简介与环境搭建

FFmpeg 探索之旅 一、FFmpeg 简介与环境搭建 二、FFmpeg 解码详解 第一话&#xff1a;FFmpeg 简介与环境搭建 FFmpeg 探索之旅一、前言二、FFmpeg 是什么&#xff1f;三、简单介绍其历史背景四、为什么用 C学习 FFmpeg&#xff1f;&#xff08;一&#xff09;高性能优势&#…

(vue)el-table在表头添加筛选功能

(vue)el-table在表头添加筛选功能 筛选前&#xff1a; 选择条件&#xff1a; 筛选后&#xff1a; 返回数据格式: 代码: <el-tableref"filterTable":data"projectData.list"height"540":header-cell-style"{border-bottom: 1px soli…

流程引擎Activiti性能优化方案

流程引擎Activiti性能优化方案 Activiti工作流引擎架构概述 Activiti工作流引擎架构大致分为6层。从上到下依次为工作流引擎层、部署层、业务接口层、命令拦截层、命令层和行为层。 基于关系型数据库层面优化 MySQL建表语句优化 Activiti在MySQL中创建默认字符集为utf8&…

Vue3源码笔记阅读1——Ref响应式原理

本专栏主要用于记录自己的阅读源码的过程,希望能够加深自己学习印象,也欢迎读者可以帮忙完善。接下来每一篇都会从定义、运用两个层面来进行解析 定义 运用 例子:模板中访问ref(1) <template><div>{{str}}</div> </template> <script> impo…

神经网络基础-神经网络搭建和参数计算

文章目录 1.构建神经网络2. 神经网络的优缺点 1.构建神经网络 在 pytorch 中定义深度神经网络其实就是层堆叠的过程&#xff0c;继承自nn.Module&#xff0c;实现两个方法&#xff1a; __init__方法中定义网络中的层结构&#xff0c;主要是全连接层&#xff0c;并进行初始化。…

Dcoker Redis哨兵模式集群介绍与搭建 故障转移 分布式 Java客户端连接

介绍 Redis 哨兵模式&#xff08;Sentinel&#xff09;是 Redis 集群的高可用解决方案&#xff0c;它主要用于监控 Redis 主从复制架构中的主节点和从节点的状态&#xff0c;并提供故障转移和通知功能。通过 Redis 哨兵模式&#xff0c;可以保证 Redis 服务的高可用性和自动故…

机器学习之交叉熵

交叉熵&#xff08;Cross-Entropy&#xff09;是机器学习中用于衡量预测分布与真实分布之间差异的一种损失函数&#xff0c;特别是在分类任务中非常常见。它源于信息论&#xff0c;反映了两个概率分布之间的距离。 交叉熵的数学定义 对于分类任务&#xff0c;假设我们有&#…