Socket学习记录
本次学习Socket的编程开发,该技术在一些通讯软件,比如说微信,QQ等有广泛应用。
网络结构
这些都是计算机网络中的内容,我们在这里简单回顾一下:
UDP(User Datagram Protocol):
用户数据报协议;TCP(Transmission ControlProtocol):
传输控制协议。
TCP
协议
特点:面向连接、可靠通信。
TCP
的最终目的:要保证在不可靠的信道上实现可靠的传输。
TCP
主要有三个步骤实现可靠传输:三次握手建立连接,传输数据进行确认,四次挥手断开连接。
四次握手是为了确保收发数据都已完成。
我们首先了解一下关于获取主机地址的相关方法:
//获取本机IP地址对象的地址InetAddress localHost = InetAddress.getLocalHost();System.out.println(localHost.getHostName());System.out.println(localHost.getHostAddress());//获取指定IP域名的IP地址对象InetAddress ip = InetAddress.getByName("www.baidu.com");System.out.println(ip.getHostName());//输出ip主机名称System.out.println(ip.getHostAddress());//输出指定域名的ip地址//判断6秒内能否与百度联通,相当于pingSystem.out.println(ip.isReachable(6000));
UDP通信开发
随后我们进行客户端与服务端的数据发送与接收:
首先是客户端的定义:
//创建客户端对象,这里可以选择使用无参构造,当然也可以指定端口进行有参构造,在不指定端口时系统会默认分配DatagramSocket socket = new DatagramSocket();//创建数据包封装对象,存储数据信息
// public DatagramPacket(byte buf[], int offset, int length,
// InetAddress address, int port) {
// setData(buf, offset, length);
// setAddress(address);
// setPort(port);
// }byte[] bytes = "客户端消息:我是鹏翔".getBytes();//客户端发送的数据包,需要指明接收的服务端的IP地址以及端口DatagramPacket packet =new DatagramPacket(bytes,bytes.length,InetAddress.getLocalHost(),8888);//发送数据包socket.send(packet);System.out.println("客户端数据发送完毕");socket.close();
服务端的开发设计
System.out.println("服务端启动");//创建一个服务端对象,并指定端口DatagramSocket socket = new DatagramSocket(8888);//定义所能够接收的数据的大小byte[] buffer = new byte[1024*64];//服务器接受的数据包DatagramPacket packet = new DatagramPacket(buffer,buffer.length);//接收数据socket.receive(packet);int length = packet.getLength();String string = new String(packet.getData(), 0, length);//发送多少数据则接收多少数据System.out.println(string);socket.close();
至此,我们的客户端与服务端便开发完成了,在实验中,我们需要先启动服务端,再启动客户端。
至此,完成客户端与服务端的消息发送与接收。
UTP通信多发多收
但这只是完成了一次消息的发送与接收,而在实际情况中我们往往需要进行多发多收,那么该如何实现呢?
客户端设计:
public static void main(String[] args) throws IOException {System.out.println("服务端启动");//创建一个服务端对象,并指定端口DatagramSocket socket = new DatagramSocket(8888);//定义所能够接收的数据的大小byte[] buffer = new byte[1024*64];//服务器接受的数据包DatagramPacket packet = new DatagramPacket(buffer,buffer.length);while(true){socket.receive(packet);int length = packet.getLength();String string = new String(packet.getData(), 0, length);System.out.println(string);System.out.println("--------------------------");}}
客户端设计:
public static void main(String[] args) throws IOException {//创建客户端对象DatagramSocket socket = new DatagramSocket();Scanner scanner=new Scanner(System.in);while(true){System.out.println("请说:");String msg = scanner.nextLine();if ("exit".equals(msg)) {System.out.println("客户端数据发送完毕");socket.close();break;}byte[] bytes = msg.getBytes();//客户端发送的数据包,需要指明接收的服务端的IP地址以及端口DatagramPacket packet =new DatagramPacket(bytes,bytes.length,InetAddress.getLocalHost(),8888);//发送数据包socket.send(packet);}
此外,服务器是否能够接收多个客户端发送的消息呢,当然可以,只需要将客户端程序设置为允许多开即可。
TCP通信开发
public ServerSocket(int port) 为服务端程序注册端口
public Socket accept()方法:阻塞等待客户端的连接请求,一旦与某个客户端成功连接,则返回服务端这边的Socket对象。
客户端设计实现
Socket socket = new Socket("127.0.0.1",8088);//从socket中获取一个字节输出流,用于给服务端发送OutputStream outputStream = socket.getOutputStream();//原本的字节输出流并不好用,将其封装为高级的数据输出流DataOutputStream dataOutputStream = new DataOutputStream(outputStream);//开始写数据dataOutputStream.writeUTF("我爱你!");dataOutputStream.close();socket.close();
服务端设计实现
System.out.println("服务端启动");//创建ServerSocket对象,并指明端口号,方便接收客户端数据ServerSocket serverSocket = new ServerSocket(8088);//调用accept方法,等待客户端的连接请求Socket accept = serverSocket.accept();//从socket的通信管道中得到一个字节输入流InputStream inputStream = accept.getInputStream();//将原始的字节输入流包装成高级的数据输入流DataInputStream dataInputStream = new DataInputStream(inputStream);//使用数据输入流读取客户端发送的数据String string = dataInputStream.readUTF();//通信很严格,要保持一致System.out.println(string);System.out.println(accept.getInetAddress());//输出发送客户端的IP地址dataInputStream.close();serverSocket.close();
同样的,我们只是完成一条消息的发送与接收,那么该如何实现数据的多发多收呢?
TCP通信多发多收
其实实现与UDP时的完全相同,只需要一个循环即可。
全选要加入循环的语句,按住Ctrl+Alt+T
多发多收服务端设计:
public static void main(String[] args) throws IOException {System.out.println("服务端启动");//创建ServerSocket对象,并指明端口号,方便接收客户端数据ServerSocket serverSocket = new ServerSocket(8088);//调用accept方法,等待客户端的连接请求Socket accept = serverSocket.accept();//从socket的通信管道中得到一个字节输入流InputStream inputStream = accept.getInputStream();//将原始的字节输入流包装成高级的数据输入流DataInputStream dataInputStream = new DataInputStream(inputStream);//使用数据输入流读取客户端发送的数据while (true) {String string = dataInputStream.readUTF();//通信很严格,要保持一致System.out.println(string);System.out.println(accept.getInetAddress());//输出发送客户端的IP地址}}
多发多收客户端设计:
public static void main(String[] args) throws IOException {//创建Socket对象,并同时请求服务端程序的连接,声明服务器的IP与端口号Socket socket = new Socket("127.0.0.1",8088);//从socket中获取一个字节输出流,用于给服务端发送OutputStream outputStream = socket.getOutputStream();//原本的字节输出流并不好用,将其封装为高级的数据输出流DataOutputStream dataOutputStream = new DataOutputStream(outputStream);//开始写数据Scanner scanner = new Scanner(System.in);while (true) {System.out.println("请输入内容:");String string = scanner.nextLine();if ("exit".equals(string)) {dataOutputStream.close();socket.close();System.out.println("退出成功!");break;}dataOutputStream.writeUTF(string);dataOutputStream.flush();//将数据刷新出去,防止数据还留在内存中}}
同时需要注意,TCP作为可靠连接,一旦服务端挂掉了,那么就会抛出异常
我们可以通过捕获抛出的异常,来判断是否客户端退出。
public class Servers {public static void main(String[] args) throws IOException {System.out.println("服务端启动");//创建ServerSocket对象,并指明端口号,方便接收客户端数据ServerSocket serverSocket = new ServerSocket(8088);//调用accept方法,等待客户端的连接请求Socket accept = serverSocket.accept();//从socket的通信管道中得到一个字节输入流InputStream inputStream = accept.getInputStream();//将原始的字节输入流包装成高级的数据输入流DataInputStream dataInputStream = new DataInputStream(inputStream);//使用数据输入流读取客户端发送的数据while (true) {try {String string = dataInputStream.readUTF();//通信很严格,要保持一致System.out.println(string);} catch (IOException e) {System.out.println(accept.getInetAddress()+"客户端退出了!");//输出发送客户端的IP地址dataInputStream.close();serverSocket.close();break;}}}
}
TCP通信聊天室
如何实现一个服务器与多个客户端通信呢?现在的肯定是不行的,因为我们在判断客户端关闭后也将服务端关闭了,事实上,此时服务端只能和一个客户端建立可靠连接,归根接地,是因为在建立连接后,服务端一直在等待某一个客户端发送的消息,这就导致会停留在那,从而无法与其他客户端建立连接。怎么办呢?可以使用多线程来解决。
改进后的服务端:
package IPAddress.TCP;import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;public class ServerMany {public static void main(String[] args) throws IOException {System.out.println("服务端启动");//创建ServerSocket对象,并指明端口号,方便接收客户端数据ServerSocket serverSocket = new ServerSocket(8088);//调用accept方法,等待客户端的连接请求Socket accept = null;while (true) {accept = serverSocket.accept();new ServerReadThread(accept).start();}}
}
多开线程实现服务端接收数据
package IPAddress.TCP;import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.Socket;public class ServerReadThread extends Thread{private Socket socket;public ServerReadThread(Socket accept) {this.socket=accept;}@Overridepublic void run() {try {InputStream inputStream = socket.getInputStream();//将原始的字节输入流包装成高级的数据输入流DataInputStream dataInputStream = new DataInputStream(inputStream);System.out.println(socket.getInetAddress()+"客户端上线了!");//输出发送客户端的IP地址//使用数据输入流读取客户端发送的数据while (true) {try {String string = dataInputStream.readUTF();//通信很严格,要保持一致System.out.println(string);} catch (IOException e) {System.out.println(socket.getInetAddress()+"客户端下线了!");dataInputStream.close();socket.close();break;}}} catch (IOException e) {System.out.println("服务异常!" + socket.getInetAddress() + "连接中断!");}}
}
最后,我们可以通过一个聊天室的案例来简单检验一下成果:
首先我们需要在服务端定义一个集合,用于保存连接的socket,同时由主线程负责创建socket连接,一旦有新的客户端开启,则开启一个新的子线程,用于该客户端与服务端之间的通信:
public class Server {public static List<Socket> sockets=new ArrayList<>();public static void main(String[] args) throws IOException {System.out.println("服务端启动");//创建ServerSocket对象,并指明端口号,方便接收客户端数据ServerSocket serverSocket = new ServerSocket(8088);//调用accept方法,等待客户端的连接请求Socket accept = null;while (true) {accept = serverSocket.accept();sockets.add(accept);new ServerReadThread(accept).start();}}
}
在服务端的子线程中,负责将接收的信息输出,并将接收的信息转发给其他客户端(端口转发)
import java.io.*;
import java.net.Socket;public class ServerReadThread extends Thread{private Socket socket;public ServerReadThread(Socket accept) {this.socket=accept;}@Overridepublic void run() {try {InputStream inputStream = socket.getInputStream();//将原始的字节输入流包装成高级的数据输入流DataInputStream dataInputStream = new DataInputStream(inputStream);System.out.println(socket.getInetAddress()+"客户端上线了哟!");//输出发送客户端的IP地址//使用数据输入流读取客户端发送的数据while (true) {try {String string = dataInputStream.readUTF();//通信很严格,要保持一致System.out.println(string);sendMsg(string);} catch (IOException e) {System.out.println(socket.getInetAddress()+"客户端下线了!");Server.sockets.remove(socket);dataInputStream.close();socket.close();break;}}} catch (IOException e) {System.out.println("服务异常!" + socket.getInetAddress() + "连接中断!");}}private void sendMsg(String string) throws IOException {//发送给所有Socket管道去接收System.out.println("转发数据");for (Socket online:Server.sockets) {OutputStream outputStream = online.getOutputStream();DataOutputStream dataOutputStream = new DataOutputStream(outputStream);dataOutputStream.writeUTF(string);dataOutputStream.flush();}}
}
在客户端设计中,除了原本的输入数据发送信息外,还要开启一个线程用于接收服务器转发的数据:
public class Clients {public static void main(String[] args) throws IOException {//创建Socket对象,并同时请求服务端程序的连接,声明服务器的IP与端口号Socket socket = new Socket("127.0.0.1",8088);new ClientReadThread(socket).start();//从socket中获取一个字节输出流,用于给服务端发送OutputStream outputStream = socket.getOutputStream();//原本的字节输出流并不好用,将其封装为高级的数据输出流DataOutputStream dataOutputStream = new DataOutputStream(outputStream);//开始写数据Scanner scanner = new Scanner(System.in);while (true) {System.out.println("请输入内容:");String string = scanner.nextLine();if ("exit".equals(string)) {dataOutputStream.close();socket.close();System.out.println("退出成功!");break;}dataOutputStream.writeUTF(string);dataOutputStream.flush();//将数据刷新出去,防止数据还留在内存中}}
}
客户端接收转发信息的线程设计如下:
public class ClientReadThread extends Thread{private Socket socket;public ClientReadThread(Socket accept) {this.socket=accept;}@Overridepublic void run() {try {InputStream inputStream = socket.getInputStream();//将原始的字节输入流包装成高级的数据输入流DataInputStream dataInputStream = new DataInputStream(inputStream);//使用数据输入流读取客户端发送的数据while (true) {try {String string = dataInputStream.readUTF();//通信很严格,要保持一致System.out.println(string);} catch (IOException e) {System.out.println("自己客户端下线了!");dataInputStream.close();socket.close();break;}}} catch (IOException e) {System.out.println("服务异常!" + socket.getInetAddress() + "连接中断!");}}
}
BS架构通信开发
首先了解一下BS架构的基本原理:
BS架构下,我们并不需要开发客户端程序。只需要开发服务端即可
public class Server {public static List<Socket> sockets=new ArrayList<>();public static void main(String[] args) throws IOException {System.out.println("服务端启动");//创建ServerSocket对象,并指明端口号,方便接收客户端数据ServerSocket serverSocket = new ServerSocket(9090);while (true) {Socket accept = serverSocket.accept();System.out.println("子线程启动");sockets.add(accept);new ServerReadThread(accept).start();}}
}
随后进行服务端子进程的设计,用于向浏览器响应一段文字,注意,要想向浏览器响应内容,就需要遵循固定的HTTP协议规定,即符合下面的要求:
服务端子线程设计如下:
public class ServerReadThread extends Thread{private Socket socket;public ServerReadThread(Socket accept) {this.socket=accept;}@Overridepublic void run() {try {System.out.println("上线访问了");OutputStream outputStream = socket.getOutputStream();//将原始的字节输出流包装成高级的打印流PrintStream printStream = new PrintStream(outputStream);printStream.println("HTTP/1.1 200 OK");printStream.println("Content-Type:text/html;charset=UTF-8");printStream.println();printStream.println("<div style='color:red;font-size:40px;text-align:center'>服务端响应</div>");printStream.close();socket.close();} catch (IOException e) {System.out.println("服务异常!" + socket.getInetAddress() + "连接中断!");}}
}
前面的BS架构设计中,每当浏览器发起一次访问,就会创建一个线程,然而,当我们的网站访问量十分大时,即面对一些高并发情况,就会出现宕机现象。对于这种情况,可以通过线程池来进行优化。
在主线程中设计一个线程池来控制线程数量
public class Server {public static List<Socket> sockets=new ArrayList<>();public static void main(String[] args) throws IOException {System.out.println("服务端启动");//创建ServerSocket对象,并指明端口号,方便接收客户端数据ServerSocket serverSocket = new ServerSocket(9090);//通过线程池来控制执行线程的数量与任务队列数量ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(16 * 2, 16 * 2,0, TimeUnit.SECONDS, new ArrayBlockingQueue<>(8),Executors.defaultThreadFactory(), new ThreadPoolExecutor.AbortPolicy());while (true) {Socket accept = serverSocket.accept();System.out.println("子线程启动");threadPoolExecutor.execute(new ServerReadRunnable(accept));}}
}
将原本的线程改造为任务。
public class ServerReadRunnable implements Runnable{private Socket socket;public ServerReadRunnable(Socket accept) {this.socket=accept;}@Overridepublic void run() {try {System.out.println("上线访问了");OutputStream outputStream = socket.getOutputStream();//将原始的字节输出流包装成高级的打印流PrintStream printStream = new PrintStream(outputStream);printStream.println("HTTP/1.1 200 OK");printStream.println("Content-Type:text/html;charset=UTF-8");printStream.println();printStream.println("<div style='color:red;font-size:40px;text-align:center'>服务端响应</div>");printStream.close();socket.close();} catch (IOException e) {System.out.println("服务异常!" + socket.getInetAddress() + "连接中断!");}}
}
相关文章:

Socket学习记录
本次学习Socket的编程开发,该技术在一些通讯软件,比如说微信,QQ等有广泛应用。 网络结构 这些都是计算机网络中的内容,我们在这里简单回顾一下: UDP(User Datagram Protocol):用户数据报协议;TCP(Transmission Contr…...

黑马 - websocket搭建在线聊天室
这里写自定义目录标题 一、消息推送常见方式二、websocket 是什么?三、websocket api的介绍1、客户端 (浏览器)2、服务端api 四、实现在线聊天室1、需求2、聊天室流程分析3、消息格式4、代码实现 一、消息推送常见方式 1、轮训方式 2、SSE…...

【每日力扣】543. 二叉树的直径与101. 对称二叉树
🔥 个人主页: 黑洞晓威 😀你不必等到非常厉害,才敢开始,你需要开始,才会变的非常厉害 543. 二叉树的直径 给你一棵二叉树的根节点,返回该树的 直径 。 二叉树的 直径 是指树中任意两个节点之间最长路径的…...

【linux】——日志分析
1. 日志文件 1.1 日志文件的分类 日志文件: 是用于记录Linux系统中各种运行消息的文件,相当于Linux主机的“日记". 日志文件对于诊断和解决系统中的问题很有帮助,系统一旦出现问题时及时分析日志就会“有据可查”。此外。当主机遭受攻…...

【intro】GraphSAGE
论文 https://arxiv.org/pdf/1706.02216 abstract 大图中节点的低维embedding已经被证明在各种预测任务中非常有用,然而,大多数现有的方法要求在embedding训练期间图中的所有节点都存在;这些先前的方法属于直推式(transductive)…...

管理能力学习笔记九:授权的常见误区和如何有效授权
授权的常见误区 误区一:随意授权 管理者在授权工作时,需要依据下属的能力、经验、意愿问最自己:这项工作适合授权给Ta做吗?如果没有,可以通过哪些方法进行培训呢? 误区二:缺乏信任 心理暗示…...
第21天 反射
反射概述 想象一下,你在一个房间里边,但你看不见自己,也不知道自己是谁。这时候你面前有一个镜子,你可以通过镜子的反射来观察自己。反射就像这面镜子。它让你能够检查、分析、修改Java中的对象、类、方法等 使用情况࿱…...

多链路聚合设备是什么
多链路聚合设备属于通信指挥装备。 乾元通多链路聚合设备,它能够将多个网络链路聚合成一个逻辑链路,以实现高速、稳定、可靠的数据传输。多链路聚合设备的核心技术包括链路聚合、负载均衡、故障切换等,能够智能管理和优化利用不同网络链路&a…...

基于springboot+vue+Mysql的自习室预订系统
开发语言:Java框架:springbootJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:…...
解决后端ID传到前端时被截断,末尾显示00
问题原因: Java后端Long类型的取值和前端Number类型取值范围不一样。 解决方案: 将id字段进行json序列化时转为字符串。 JsonSerialize(using ToStringSerializer.class) private Long id;...

Transformer中的数据输入构造
文章目录 1. 文本内容2. 字典构造2.1 定义一个类用于字典构造2.2 拆分文本2.3 构造结果 3. 完整代码 1. 文本内容 假如我们有如下一段文本内容: Optics It is the branch of physics that studies the behaviour and properties of light . Optical Science 这段…...
完美实现vue3异步加载组件
经过几个小时的努力,终于实现了,根据组件名异常加载组件,直接上代码,网上的很多代码方都有坑,先贴出比较坑的代码: <template><view class"main"> <view class"tops"…...
点云成图原理
点成图(Point Cloud)是指由一组离散的点构成的图形,它们在空间中没有任何连接关系。点成图通常是由激光雷达、相机或其他传感器获取的三维数据,用于表示现实世界中的物体或场景。 三角成图(Triangulation)…...

如何将jsp项目转成springboot项目
昨天说过,springboot推荐使用Thymeleaf作为前后端渲染的模板引擎,为什么推荐用Thymeleaf呢,有以下几个原因: 动静结合:Thymeleaf支持HTML原型,允许在HTML标签中增加额外的属性来实现模板与数据的结合。这样…...

C语言:环形链表
1.例子1:环形链表 142. 环形链表 II - 力扣(LeetCode) 思路:我们先定义两个变量slow和fast,slow每次走一步,fast每次走两步,如果链表是环形链表,那么必定存在fast不会走到链表的最后…...
typescript综合练习1(展开音乐播放列表)
Playlist Soundness What’s up, friend?! I’m so pumped you’re joining us. We’ve got a sick project we could totally use your help on! See, someone’s giving us amazing recommendations for songs to play. But they’re not just coming in as songs. Someti…...
零基础入门学习Python第二阶02面向对象,迭代器生成器,并发编程
Python语言进阶 面向对象相关知识 三大支柱:封装、继承、多态 例子:工资结算系统。 """月薪结算系统 - 部门经理每月15000 程序员每小时200 销售员1800底薪加销售额5%提成"""from abc import ABCMeta, abstractmethodcl…...

Unity | Shader基础知识(第十三集:编写内置着色器阶段总结和表面着色器的补充介绍)
目录 前言 一、表面着色器的补充介绍 二、案例viewDir详解 1.viewDir是什么 2.viewDir的作用 3.使用viewDir写shader 前言 注意观察的小伙伴会发现,这组教程前半部分我们在编写着色器的时候,用的是顶点着色器和片元着色器的组合。 SubShader{CGPRO…...
JavaScript map对象/set对象详解
文章目录 一、map对象二、map对象应用场景1. 数组元素转换2. 对象数组的属性提取或转换3. 数组元素的复杂转换4. 与其他数组方法结合使用5. 与异步操作结合(使用 Promise)6. 生成新的数据结构7. 数学和统计计算 三、set对象1. 基本使用2. 特性3. 注意事项…...
【kettle017】kettle访问DB2数据库并处理数据至execl文件(最近完善中)
1.一直以来想写下基于kettle的系列文章,作为较火的数据ETL工具,也是日常项目开发中常用的一款工具,最近刚好挤时间梳理、总结下这块儿的知识体系。 2.熟悉、梳理、总结下DB2数据库(IBM公司开发的一套关系型数据库管理系统…...
ES6从入门到精通:前言
ES6简介 ES6(ECMAScript 2015)是JavaScript语言的重大更新,引入了许多新特性,包括语法糖、新数据类型、模块化支持等,显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var…...
DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径
目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...

SCAU期末笔记 - 数据分析与数据挖掘题库解析
这门怎么题库答案不全啊日 来简单学一下子来 一、选择题(可多选) 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘:专注于发现数据中…...
使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装
以下是基于 vant-ui(适配 Vue2 版本 )实现截图中照片上传预览、删除功能,并封装成可复用组件的完整代码,包含样式和逻辑实现,可直接在 Vue2 项目中使用: 1. 封装的图片上传组件 ImageUploader.vue <te…...
【论文笔记】若干矿井粉尘检测算法概述
总的来说,传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度,通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...

视频字幕质量评估的大规模细粒度基准
大家读完觉得有帮助记得关注和点赞!!! 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用,因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型(VLMs)在字幕生成方面…...
GitHub 趋势日报 (2025年06月08日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...
WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)
一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解,适合用作学习或写简历项目背景说明。 🧠 一、概念简介:Solidity 合约开发 Solidity 是一种专门为 以太坊(Ethereum)平台编写智能合约的高级编…...

自然语言处理——Transformer
自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效,它能挖掘数据中的时序信息以及语义信息,但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN,但是…...

宇树科技,改名了!
提到国内具身智能和机器人领域的代表企业,那宇树科技(Unitree)必须名列其榜。 最近,宇树科技的一项新变动消息在业界引发了不少关注和讨论,即: 宇树向其合作伙伴发布了一封公司名称变更函称,因…...