用java实现客服聊天+网络爬虫下载音乐(java网络编程,io,多线程)
一 灵感:
在2022年的暑假,也就是我即将迈进高三的那个暑假,我并没有察觉自己应该要学习了,还是和过往的暑假一样玩着王者荣耀,凌晨2点睡觉,中午12点起床。我依稀记得这种状态一直持续到8月19。然而离开学还有6天时。我肚子开始剧烈的疼痛。想了一切可以的办法来恢复但是无极于终。我上百度去搜索,搜到了些眉目,我也进入了济南一家肠胃医院的网站。下面一幅图就是我咨询的聊天。那么你知道这种技术是怎么实现的吗?就是基本的网上聊天。还有一些咨询网站的客服聊天。
二 通信基本概念--实现网上聊天理论
计算机网络
①我们目的是为了写出一个后台聊天,为什么还要了解计算机网络呢?因为聊天的本质就是在计算机网络下进行的。
②何为计算机网络?通过百科搜索我们能查询到计算机网络其实就是一些相互连接的、以资源共享为目的的、自治的计算机的集合。通俗点讲就是计算机网络就像一个巨大的邮局,不同的计算机就像不同的信箱,通过电线或无线信号来传递信息。
③通信就要用各种协议比如早期的http协议和更加安全的Https协议(https经过加密和身份验证)。通信协议就像是一套规则和标准,确保计算机网络中的设备能够正确地发送和接收信息。它定义了数据如何被封装、地址信息如何被添加、以及错误如何被检测和纠正等。协议就是不同计算机遵循的规则。
④https和http只不过是应用层协议我们常见的两种。还有很多这里就不一一赘述。下面要讲的TCP,UDP是传输层的协议与我们今天要讲的聊天密切相关。
⑤每个计算机都有它的IP就是地址。有各自的IP我们才能传送数据。IPv6格式能分配的地址非常多据说可以为地球的每一粒沙子分配地址。
⑥端口就是用来区分每个软件或进程的。在下面代码中我们会用到。
⑦接下来的测试将在本地进行。要用到特殊地址127.0.0.1。
三 TCP
TCP实现聊天:分为客户端和服务端。客户端用来构造连接,发送信息。服务端用来接受信息,输出信息。
我们用TCP实现简单文字传输:
//客户端
package chat;import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;public class TcpClientDemo1 {public static void main(String[] args) {try {//获取服务端的地址InetAddress serverIp = InetAddress.getByName("127.0.0.1");int port = 9999;//创见一个Socket连接Socket socket = new Socket(serverIp, port); //一步化简--》 Socket socket = new Socket(InetAddress.getName(""), 5555);//发送信息创建io流OutputStream os=socket.getOutputStream();os.write("你好".getBytes());os.close();} catch (Exception e) {e.printStackTrace();}}
}
//服务端package chat;import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;//服务器端
public class TcpServerDemo1 {public static void main(String[] args) {ByteArrayOutputStream bao=null;//地址 端口号try {ServerSocket serverSocket = new ServerSocket(9999);//等待客户端连接过来Socket socket=serverSocket.accept();//读取客户端的信息InputStream is=socket.getInputStream();//管道流bao=new ByteArrayOutputStream();byte[]buffs=new byte[1024];int len;while((len=is.read(buffs))!=-1){bao.write(buffs,0,len);System.out.println(bao.toString());//关闭}}catch(Exception e){e.printStackTrace();}finally{if(bao!=null) {try {bao.close();} catch (Exception e) {e.printStackTrace();}}}}
}
我们用TCP实现文件上传(与上面代码很是相似但略有不同):
//客户端package file;
import java.io.*;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;//文件上传
public class TcpClientDemo2 {public static void main(String[] args) {try {//获取连接Socket socket=new Socket(InetAddress.getByName("127.0.0.1"),5555);//文件输出--》创建一个输出流OutputStream os=socket.getOutputStream();//读取文件FileInputStream fis=new FileInputStream(new File("C://Users//hp//OneDrive//图片//本机照片//微信图片_20240227182056.jpg"));int len;byte[]buffs=new byte[2014];while((len=fis.read(buffs))!=-1){os.write(buffs,0,len);//写进来再输出去}//写一个传送完成的标志,告诉服务器已经结束了socket.shutdownOutput();//当传送完成时应该输出语句输送成功InputStream is=socket.getInputStream();//管道输出ByteArrayOutputStream byteArrayOutputStream=new ByteArrayOutputStream();int len1;byte[]buffs1=new byte[2024];while((len1=is.read(buffs1))!=-1){byteArrayOutputStream.write(buffs1,0,len1);}System.out.println(byteArrayOutputStream.toString());byteArrayOutputStream.close();
is.close();fis.close();os.close();socket.close();} catch (Exception e) {e.printStackTrace();}}}
//服务端package file;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketAddress;public class TcpServerDemo2 {public static void main(String[] args) {try {//服务端的端口ServerSocket serverSocket=new ServerSocket(5555);//等待接受,阻塞式监听会一直等待Socket socket=serverSocket.accept();//获取输入流InputStream is=socket.getInputStream();//文件输出FileOutputStream fos=new FileOutputStream(new File("receive.jpg")); //命了个名int len;byte[]buffs=new byte[2024];while((len=is.read(buffs))!=-1){fos.write(buffs,0,len);//写进来输出}//输出输出完成//输出流OutputStream os=socket.getOutputStream();os.write("输送成功".getBytes());fos.close();is.close();socket.close();serverSocket.close();} catch (Exception e) {e.printStackTrace();}}}
文件上传成功后,我们文件会出现在最下面如图所示:
四 UDP
既然上面已经通过TCP实现交流了为什么还要UDP实现交流呢?这不得不提一下两者的差别。TCP协议需要进行连接,而UDP协议不需要进行连接,随便传送。
//建立一个Socket
DatagramSocket socket=new DatagramSocket();
//建立一个数据包
String msg="新年快乐";
InetAddress localhost=InetAddress.getByName("localhost");
int port=5555;
DatagramPacket packet=new DatagramPacket(msg.getBytes(),msg.getBytes().length,localhost,port);
//发送数据包
socket.send(packet);
//关闭
socket.close();
//开发端口DatagramSocket socket=new DatagramSocket(5555);//接受数据包byte[]buffs=new byte[1024];DatagramPacket packet=new DatagramPacket(buffs,0,buffs.length);socket.receive(packet);System.out.println(packet.getAddress().getHostAddress());System.out.println(new String(packet.getData(),0, packet.getLength()));
通过上面的代码可以发现:UDP在客户端先建立一个socket连接,建立包,发送包的过程。然而没有了服务端这一概念,不需要进行连接而是接受包输出包的过程。
由此我们可以实现互发消息,通过多线程。
//发送消息package send;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.*;
import java.nio.charset.StandardCharsets;public class UdpSend implements Runnable{DatagramSocket socket=null;BufferedReader reader=null;private int fromPort;private String toIp;private int toPort;public UdpSend(int fromPort, String toIp, int toPort) throws Exception {this.fromPort = fromPort;this.toIp = toIp;this.toPort = toPort;socket=new DatagramSocket(fromPort);reader=new BufferedReader(new InputStreamReader(System.in));}@Overridepublic void run() {//准备数据控制台读取-->打包进去while (true) {try {String data = reader.readLine();byte[] datas;datas = data.getBytes();DatagramPacket packet = new DatagramPacket(datas, 0, datas.length, new InetSocketAddress(this.toIp, this.toPort));socket.send(packet);if (data.equals("bye")) {break;}} catch (IOException e) {throw new RuntimeException(e);}//发送}socket.close();}}
//接受消息package send;import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
import java.nio.charset.StandardCharsets;public class UdpReceive implements Runnable{DatagramSocket socket=null;private int port;private String msg;public UdpReceive(int port,String msg) throws Exception {this.port=port;this.msg=msg;socket=new DatagramSocket(port);}public void run(){while(true) {try {//准备接受包裹byte[] container = new byte[2024];DatagramPacket packet = new DatagramPacket(container, 0, container.length);//接受socket.receive(packet);//断开连接int length = packet.getLength();byte[] data = packet.getData();String receiveD = new String(data, 0, length);System.out.println(msg+":"+receiveD);if (receiveD.equals("bye")) {break;}} catch (IOException e) {throw new RuntimeException(e);}}socket.close();}}
老师类:
package send;public class tackTeacher {public static void main(String[] args) throws Exception {new Thread(new UdpSend(4444,"localhost",7777)).start();new Thread(new UdpReceive(8888,"学生")).start();}}
学生类:
package send;public class tackStudent {public static void main(String[] args) throws Exception {new Thread(new UdpSend(5555,"localhost",8888)).start();new Thread(new UdpReceive(7777,"老师")).start();}
}
五 URL
URL其实就相当于网络爬虫,下载网络视频音乐等。
这里是一段下载音乐的代码:
package U;import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.*;public class UrlDown {public static void main(String[] args) throws Exception {//下载地址URL url=new URL("\n" +"https://m804.music.126.net/20240601202251/50656d3a6d5b5489905b09e4ada8bef2/jdyyaac/obj/w5rDlsOJwrLDjj7CmsOj/34873299362/7d37/4c2f/3640/245ede6e6294337d349d85532c0abcc3.m4a");//连接到这个资源HttpURLConnection connection=(HttpURLConnection)url.openConnection();//输入InputStream is=connection.getInputStream();FileOutputStream fos=new FileOutputStream("f.m4a");byte[]buffs=new byte[1024];int len;while((len=is.read(buffs))!=-1){fos.write(buffs,0,len);}//断开fos.close();is.close();connection.disconnect();}
}
如果包最下面出现如图情况就说明下载完成了。如果还有什么不懂的地方或者没有实现,可以私信我或在评论区留下您的问题。
相关文章:

用java实现客服聊天+网络爬虫下载音乐(java网络编程,io,多线程)
一 灵感: 在2022年的暑假,也就是我即将迈进高三的那个暑假,我并没有察觉自己应该要学习了,还是和过往的暑假一样玩着王者荣耀,凌晨2点睡觉,中午12点起床。我依稀记得这种状态一直持续到8月19。然而离开学还…...

基于springboot+vue的医院信息管理系统
开发语言:Java框架:springbootJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:…...

乡村振兴与农业科技创新:加大农业科技研发投入,推动农业科技创新,促进农业现代化和美丽乡村建设
一、引言 在当代中国,乡村振兴已成为国家发展的重要战略之一。作为国民经济的基础,农业的发展直接关系到国家的稳定和人民的福祉。随着科技的不断进步,农业科技创新在推动农业现代化和美丽乡村建设中发挥着越来越重要的作用。本文旨在探讨如…...

Java 雪花算法:分布式唯一ID生成的魔法秘籍
欢迎来到本次博客的旅程,今天我们要揭开一个神秘算法的面纱,它就是在分布式系统中广受欢迎的——雪花算法(Snowflake)。这个算法不是用来预测雪花的形状,而是用来生成唯一的ID,保证在分布式系统中ÿ…...

mybatis配置环境流程
mybatis配置环境流程 为啥要用mybatis:通过Mybatis实现快速访问后端pgsql、mysql等数据库。 1.修改pom.xml,添加mybatis相关依赖 <dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-s…...

UE5增强输入系统入门
UE4直接在项目设置里设置的轴映射和操作映射在UE5中被标记为废弃,改为使用增强输入系统。 这两天学习了下蓝图和c中增强输入系统的使用,在这里分享一下。 学习使用的模板是第三人称模板(蓝图/c),代码蓝图都参考的模板。 增强输入系统 UE5…...

Python 语法好乱:深度解析与应对策略
Python 语法好乱:深度解析与应对策略 Python,作为一门简洁明了的编程语言,广受编程初学者的喜爱。然而,随着学习的深入,许多学习者会发现Python的语法似乎并不像初看起来那么简单,甚至有时会感到“好乱”。…...

移动端框架:加速移动应用开发与提升跨平台兼容性
在当今快速发展的移动应用领域,开发者们面临着如何快速构建、维护并发布跨平台应用的挑战。为了应对这一挑战,移动端框架应运而生,它们不仅加速了移动应用的开发流程,还提升了应用的跨平台兼容性,并确保了应用性能与原…...

Linux systemctl:掌握软件启动和关闭的利器
Linux systemctl:掌握软件启动和关闭的利器 在 Linux 操作系统中,systemctl 是一个强大的工具,用于管理系统服务的启动、停止和状态监控。本篇博客将深入介绍 systemctl 的使用方法,帮助你更好地掌握软件的启动和关闭。 1. syst…...

Jmeter干货分享:当你的Log viewer不显示日志时,可能是引入的Jar包冲突导致
问题描述 近期使用Jmeter时发现了一个非常奇怪的问题,就是Jmeter是可以正常使用运行脚本,但是在Log viewer中确没有任何日志,如下图: 问题排查过程 真是百思不得其解啊,在网上各种获取资料,大多数都是说跟…...

网络编程TCP
White graces:个人主页 🙉专栏推荐:Java入门知识🙉 🙉 内容推荐:Java网络编程(下)🙉 🐹今日诗词: 壮士当唱大风哥, 宵小之徒能几何?🐹 ⛳️点赞 ☀️收藏⭐️关注💬卑微…...

C++中的迭代器
目录 摘要 迭代器类别 1. 输入迭代器(Input Iterator) 2. 输出迭代器(Output Iterator) 3. 前向迭代器(Forward Iterator) 4. 双向迭代器(Bidirectional Iterator) 5. 随机访…...

8.1 Go 包的概念与使用
💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…...

第一篇【传奇开心果系列】AI工业应用经典算法和Python示例:基于AI的智能制造技术经典算法与Python实践
传奇开心果博文系列 系列博文目录AI工业应用经典算法和Python示例系列 博文目录前言一、AI在智能制造方面的应用场景介绍二、基于AI的智能制造技术经典算法介绍三、支持向量机机器学习算法Python示例代码四、随机森林机器学习算法Python示例代码五、深度学习算法Python示例代码…...

Mathtype插入编号的高级格式会重置之前的简单格式的问题
文章标题没说人话,大致意思是: 先以简单格式插入几个编号 再设置高级格式的编号时,即使没有选择插入编号,在点击下图的确定键时,会连带前面的简单公式一并更新 我在网上没有找到相关的问题,即使关闭了…...

弘君资本:存储芯片概念强势,西测测试三连板,佰维存储涨超10%
存储芯片概念3日盘中强势拉升,截至发稿,西测测验、万润科技涨停,佰维存储涨超10%,香农芯创涨近7%,航天智装、普冉股份等涨超5%。值得注意的是,西测测验已连续3个交易日涨停。 职业方面,当时干流…...

【机器学习】逻辑回归:原理、应用与实践
🌈个人主页: 鑫宝Code 🔥热门专栏: 闲话杂谈| 炫酷HTML | JavaScript基础 💫个人格言: "如无必要,勿增实体" 文章目录 逻辑回归:原理、应用与实践引言1. 逻辑回归基础1.1 基本概念1.2 Sig…...

C++:list模拟实现
hello,各位小伙伴,本篇文章跟大家一起学习《C:list模拟实现》,感谢大家对我上一篇的支持,如有什么问题,还请多多指教 ! 如果本篇文章对你有帮助,还请各位点点赞!…...

植物大战僵尸杂交版全平台 PC MAC 安卓手机下载安装详细图文教程
最近植物大战僵尸杂交版非常的火,好多小伙伴都想玩一玩,但作者只分享了 win 版,像手机还有MAC电脑都没有办法安装,身为 MAC 党当然不能放弃,经过一番折腾,也是成功在所有平台包括手机和MAC电脑都成功安装上…...

发送Http请求的两种方式
说明:在项目中,我们有时会需要调用第三方接口,获取调用结果,来实现自己的业务逻辑。调用第三方接口,通常是双方确定好,由对方开放一个接口,需要我们根据他们提供的接口文档,组装Http…...

【算法训练记录——Day23】
Day23——二叉树Ⅸ 669.修剪二叉搜索树108.将有序数组转换为二叉搜索树538.把二叉搜索树转换为累加树 今日内容: ● 669.修剪二叉搜索树 ● 108.将有序数组转换为二叉搜索树 ● 538.把二叉搜索树转换为累加树 ● 总结篇 669.修剪二叉搜索树 思路:主要是…...

【wiki知识库】04.SpringBoot后端实现电子书的增删改查以及前端界面的展示
📝个人主页:哈__ 期待您的关注 目录 一、🔥今日内容 二、🌏前端页面的改造 2.1新增电子书管理页面 2.2新增路由规则 2.3修改the-header代码 三、🚗SpringBoot后端Ebook模块改造 3.1增加电子书增/改接口 3.1.…...

NTLM Relay Gat:自动化NTLM中继安全检测工具
关于NTLM Relay Gat NTLM Relay Gat是一款功能强大的NTLM中继威胁检测工具,该工具旨在利用Impacket工具套件中的ntlmrelayx.py脚本在目标环境中实现NTLM中继攻击风险检测,以帮助研究人员确定目标环境是否能够抵御NTLM中继攻击。 功能介绍 1、多线程支持…...

摸鱼大数据——Hive函数14
14、开窗(开列)函数 官网链接:Window Functions - Apache AsterixDB - Apache Software Foundation 14.1 基础使用 开窗函数格式: 开窗函数 over(partition by 分组字段名 [order by 排序字段名 asc|desc] [rows between 开窗开始 and 开窗结束]) partition b…...

elasticsearch的常规操作--增删改查和批量处理
1、_cat 查询 GET /_cat/nodes: 查看所有节点 GET /_cat/health: 查看es 健康状况 GET /_cat/master: 查看主节点 GET /_cat/indices:查看所有索引show databases; 2、索引一个文档(保存) 保存一个数据&…...

盘点2024年还在活跃发版的开源私有网盘项目附源码链接
时不时的会有客户上门咨询,丰盘ECM是不是开源项目,源码在哪里可以下载;如果需要和内部其他系统做集成,购买商业版的话,能否提供源代码做二次开发呢,等等诸多问题。 这里做个统一回复,丰盘ECM产…...

MySQL 使用方法以及教程
一、引言 MySQL是一个流行的开源关系型数据库管理系统(RDBMS),广泛应用于Web开发、数据分析等领域。它提供了高效、稳定的数据存储和查询功能。同时,Python作为一种强大的编程语言,也提供了多种与MySQL交互的库&#…...

算法学习笔记——二进制
二进制 负数的十进制转二进制数(-2 -> 1110): 正数 - 1,再取反,得到负数的二进制。 例如:-2 :0010 -> 0010 - 1 -> 0001 -> 取反 -> 1110 负数的二进制转十进制(…...

计算机网络介绍
计算机网络介绍 概述网络概述相关硬件 链路层VLAN概念VLAN 特点VLAN 的划分帧格式端口类型原理 STP概念特点原理 Smart Link概念特点组网 网络层ARP概念原理 IP概念版本IP 地址 IPv4IP 地址数据报格式 IPv6特点IP 地址数据报格式 ICMP概念分类报文格式 VRRP概念原理报文格式 OS…...

解锁数据宝藏:高效查找算法揭秘
代码下载链接:https://gitee.com/flying-wolf-loves-learning/data-structure.git 目录 一、查找的原理 1.1 查找概念 1.2 查找方法 1.3平均查找长度 1.4顺序表的查找 1.5 顺序表的查找算法及分析 1.6 折半查找算法及分析 1.7 分块查找算法及分析 1.8 总结…...