购物网站建设网页推广南宁网站开发价格

web/2025/9/28 19:11:03/文章来源:
购物网站建设网页推广,南宁网站开发价格,网站运营推广这么做,优秀定制网站建设案例文章目录 第16章_网络编程本章专题与脉络1. 网络编程概述1.1 软件架构1.2 网络基础 2. 网络通信要素2.1 如何实现网络中的主机互相通信2.2 通信要素一#xff1a;IP地址和域名2.2.1 IP地址2.2.2 域名 2.3 通信要素二#xff1a;端口号2.4 通信要素三#xff1a;网络通信协议… 文章目录 第16章_网络编程本章专题与脉络1. 网络编程概述1.1 软件架构1.2 网络基础 2. 网络通信要素2.1 如何实现网络中的主机互相通信2.2 通信要素一IP地址和域名2.2.1 IP地址2.2.2 域名 2.3 通信要素二端口号2.4 通信要素三网络通信协议 2. 谈传输层协议TCP与UDP协议2.1 TCP协议与UDP协议2.2 三次握手2.3 四次挥手 3. 网络编程API3.1 InetAddress类3.2 Socket类3.3 Socket相关类API3.3.1 ServerSocket类3.3.2 Socket类3.3.3 DatagramSocket类3.3.4 DatagramPacket类 4. TCP网络编程4.1 通信模型4.2 开发步骤4.3 例题与练习4.4 案例聊天室4.5 理解客户端、服务端 5. UDP网络编程5.1 通信模型5.2 开发步骤5.3 演示发送和接收消息举例1举例2 6. URL编程6.1 URL类6.2 URL类常用方法6.3 针对HTTP协议的URLConnection类6.4 小结6.4 小结 第16章_网络编程 本章专题与脉络 1. 网络编程概述 Java是 Internet 上的语言它从语言级上提供了对网络应用程序的支持程序员能够很容易开发常见的网络应用程序。 Java提供的网络类库可以实现无痛的网络连接联网的底层细节被隐藏在 Java 的本机安装系统里由 JVM 进行控制。并且 Java 实现了一个跨平台的网络库程序员面对的是一个统一的网络编程环境。 1.1 软件架构 C/S架构 全称为Client/Server结构是指客户端和服务器结构。常见程序有QQ、美团app、360安全卫士等软件。 B/S架构 全称为Browser/Server结构是指浏览器和服务器结构。常见浏览器有IE、谷歌、火狐等。 两种架构各有优势但是无论哪种架构都离不开网络的支持。网络编程就是在一定的协议下实现两台计算机的通信的程序。 1.2 网络基础 计算机网络 把分布在不同地理区域的计算机与专门的外部设备用通信线路互连成一个规模大、功能强的网络系统从而使众多的计算机可以方便地互相传递信息、共享硬件、软件、数据信息等资源。 **网络编程的目的**直接或间接地通过网络协议与其它计算机实现数据交换进行通讯。 网络编程中有三个主要的问题 问题1如何准确地定位网络上一台或多台主机问题2如何定位主机上的特定的应用问题3找到主机后如何可靠、高效地进行数据传输 2. 网络通信要素 2.1 如何实现网络中的主机互相通信 通信双方地址 IP端口号 一定的规则不同的硬件、操作系统之间的通信所有的这一切都需要一种规则。而我们就把这种规则称为协议即网络通信协议。 生活类比 2.2 通信要素一IP地址和域名 2.2.1 IP地址 IP地址指互联网协议地址Internet Protocol Address俗称IP。IP地址用来给网络中的一台计算机设备做唯一的编号。假如我们把“个人电脑”比作“一台电话”的话那么“IP地址”就相当于“电话号码”。 IP地址分类方式一 IPv4是一个32位的二进制数通常被分为4个字节表示成a.b.c.d 的形式以点分十进制表示例如192.168.65.100 。其中a、b、c、d都是0~255之间的十进制整数。 这种方式最多可以表示42亿个。其中30亿都在北美亚洲4亿中国2.9亿。2011年初已经用尽。 IP地址 网络地址 主机地址 网络地址标识计算机或网络设备所在的网段主机地址标识特定主机或网络设备 其中E类用于科研。 IPv6由于互联网的蓬勃发展IP地址的需求量愈来愈大但是网络地址资源有限使得IP的分配越发紧张。 为了扩大地址空间拟通过IPv6重新定义地址空间采用128位地址长度共16个字节写成8个无符号整数每个整数用四个十六进制位表示数之间用冒号分开。比如ABCD:EF01:2345:6789:ABCD:EF01:2345:6789按保守方法估算IPv6实际可分配的地址整个地球的每平方米面积上仍可分配1000多个地址这样就解决了网络地址资源数量不够的问题。2012年6月6日国际互联网协会举行了世界IPv6启动纪念日这一天全球IPv6网络正式启动。多家知名网站如Google、Facebook和Yahoo等于当天全球标准时间0点北京时间8点整开始永久性支持IPv6访问。2018年6月三大运营商联合阿里云宣布将全面对外提供IPv6服务并计划在2025年前助推中国互联网真正实现“IPv6 Only”。 在IPv6的设计过程中除了一劳永逸地解决了地址短缺问题以外还考虑了在IPv4中解决不好的其它问题主要有端到端IP连接、服务质量QoS、安全性、多播、移动性、即插即用等。 IP地址分类方式二 公网地址( 万维网使用和 私有地址( 局域网使用。192.168.开头的就是私有地址范围即为192.168.0.0–192.168.255.255专门为组织机构内部使用。 常用命令 查看本机IP地址在控制台输入 ipconfig检查网络是否连通在控制台输入 ping 空格 IP地址 ping 220.181.57.216特殊的IP地址 本地回环地址(hostAddress)127.0.0.1主机名(hostName)localhost 2.2.2 域名 Internet上的主机有两种方式表示地址 域名(hostName)www.atguigu.comIP 地址(hostAddress)202.108.35.210 **域名解析**因为IP地址数字不便于记忆因此出现了域名。域名容易记忆当在连接网络时输入一个主机的域名后域名服务器(DNSDomain Name System域名系统)负责将域名转化成IP地址这样才能和主机建立连接。 简单理解 详细理解 在浏览器中输入www . qq .com 域名操作系统会先检查自己本地的hosts文件是否有这个网址映射关系如果有就先调用这个IP地址映射完成域名解析。如果hosts里没有这个域名的映射则查找本地DNS解析器缓存是否有这个网址映射关系如果有直接返回完成域名解析。如果hosts与本地DNS解析器缓存都没有相应的网址映射关系首先会找TCP/IP参数中设置的首选DNS服务器在此我们叫它本地DNS服务器此服务器收到查询时如果要查询的域名包含在本地配置区域资源中则返回解析结果给客户机完成域名解析此解析具有权威性。如果要查询的域名不由本地DNS服务器区域解析但该服务器已缓存了此网址映射关系则调用这个IP地址映射完成域名解析此解析不具有权威性。如果本地DNS服务器本地区域文件与缓存解析都失效则根据本地DNS服务器的设置是否设置转发器进行查询如果未用转发模式本地DNS就把请求发至13台根DNS根DNS服务器收到请求后会判断这个域名(.com)是谁来授权管理并会返回一个负责该顶级域名服务器的一个IP。本地DNS服务器收到IP信息后将会联系负责.com域的这台服务器。这台负责.com域的服务器收到请求后如果自己无法解析它就会找一个管理.com域的下一级DNS服务器地址(http://qq.com)给本地DNS服务器。当本地DNS服务器收到这个地址后就会找http://qq.com)域服务器重复上面的动作进行查询直至找到www.qq.com主机。如果用的是转发模式此DNS服务器就会把请求转发至上一级DNS服务器由上一级服务器进行解析上一级服务器如果不能解析或找根DNS或把转请求转至上上级以此循环。不管是本地DNS服务器用是是转发还是根提示最后都是把结果返回给本地DNS服务器由此DNS服务器再返回给客户机。 2.3 通信要素二端口号 网络的通信本质上是两个进程应用程序的通信。每台计算机都有很多的进程那么在网络通信时如何区分这些进程呢 如果说IP地址可以唯一标识网络中的设备那么端口号就可以唯一标识设备中的进程应用程序。 不同的进程设置不同的端口号。 端口号用两个字节表示的整数它的取值范围是0~65535。 公认端口0~1023。被预先定义的服务通信占用如HTTP80FTP21Telnet23注册端口1024~49151。分配给用户进程或应用程序。如Tomcat8080MySQL3306Oracle1521。动态/ 私有端口49152~65535。 如果端口号被另外一个服务或应用所占用会导致当前程序启动失败。 2.4 通信要素三网络通信协议 通过计算机网络可以使多台计算机实现连接位于同一个网络中的计算机在进行连接和通信时需要遵守一定的规则这就好比在道路中行驶的汽车一定要遵守交通规则一样。 网络通信协议在计算机网络中这些连接和通信的规则被称为网络通信协议它对数据的传输格式、传输速率、传输步骤、出错控制等做了统一规定通信双方必须同时遵守才能完成数据交换。 新的问题网络协议涉及内容太多、太复杂。如何解决 计算机网络通信涉及内容很多比如指定源地址和目标地址加密解密压缩解压缩差错控制流量控制路由控制如何实现如此复杂的网络协议呢通信协议分层思想。 在制定协议时把复杂成份分解成一些简单的成份再将它们复合起来。最常用的复合方式是层次方式即同层间可以通信、上一层可以调用下一层而与再下一层不发生关系。各层互不影响利于系统的开发和扩展。 这里有两套参考模型 OSI参考模型模型过于理想化未能在因特网上进行广泛推广TCP/IP参考模型(或TCP/IP协议)事实上的国际标准。 上图中OSI参考模型模型过于理想化未能在因特网上进行广泛推广。 TCP/IP参考模型(或TCP/IP协议)事实上的国际标准。 TCP/IP协议 传输控制协议/因特网互联协议( Transmission Control Protocol/Internet Protocol)TCP/IP 以其两个主要协议传输控制协议(TCP)和网络互联协议(IP)而得名实际上是一组协议包括多个具有不同功能且互为关联的协议。是Internet最基本、最广泛的协议。 TCP/IP协议中的四层介绍 应用层应用层决定了向用户提供应用服务时通信的活动。主要协议有HTTP协议、FTP协议、SNMP简单网络管理协议、SMTP简单邮件传输协议和POP3Post Office Protocol 3的简称,即邮局协议的第3个版等。传输层主要使网络程序进行通信在进行网络通信时可以采用TCP协议也可以采用UDP协议。TCPTransmission Control Protocol协议即传输控制协议是一种面向连接的、可靠的、基于字节流的传输层通信协议。UDP(User Datagram Protocol用户数据报协议)是一个无连接的传输层协议、提供面向事务的简单不可靠的信息传送服务。网络层网络层是整个TCP/IP协议的核心支持网间互连的数据通信。它主要用于将传输的数据进行分组将分组数据发送到目标计算机或者网络。而IP协议是一种非常重要的协议。IPinternet protocal又称为互联网协议。IP的责任就是把数据从源传送到目的地。它在源地址和目的地址之间传送一种称之为数据包的东西它还提供对数据大小的重新组装功能以适应不同网络对包大小的要求。 物理数据链路层链路层是用于定义物理传输通道通常是对某些网络连接设备的驱动协议例如针对光纤、网线提供的驱动。 2. 谈传输层协议TCP与UDP协议 通信的协议还是比较复杂的java.net 包中包含的类和接口它们提供低层次的通信细节。我们可以直接使用这些类和接口来专注于网络程序开发而不用考虑通信的细节。 java.net 包中提供了两种常见的网络协议的支持 UDP用户数据报协议(User Datagram Protocol)。TCP传输控制协议 (Transmission Control Protocol)。 2.1 TCP协议与UDP协议 TCP协议 TCP协议进行通信的两个应用进程客户端、服务端。使用TCP协议前须先建立TCP连接形成基于字节流的传输数据通道传输前采用“三次握手”方式点对点通信是可靠的 TCP协议使用重发机制当一个通信实体发送一个消息给另一个通信实体后需要收到另一个通信实体确认信息如果没有收到另一个通信实体确认信息则会再次重复刚才发送的消息。 在连接中可进行大数据量的传输传输完毕需释放已建立的连接效率低 UDP协议 UDP协议进行通信的两个应用进程发送端、接收端。将数据、源、目的封装成数据包传输的基本单位不需要建立连接发送不管对方是否准备好接收方收到也不确认不能保证数据的完整性故是不可靠的每个数据报的大小限制在64K内发送数据结束时无需释放资源开销小通信效率高适用场景音频、视频和普通数据的传输。例如视频会议 TCP生活案例打电话 UDP生活案例发送短信、发电报 2.2 三次握手 TCP协议中在发送数据的准备阶段客户端与服务器之间的三次交互以保证连接的可靠。 第一次握手客户端向服务器端发起TCP连接的请求第二次握手服务器端发送针对客户端TCP连接请求的确认第三次握手客户端发送确认的确认 1、客户端会随机一个初始序列号seqx设置SYN1 表示这是SYN握手报文。然后就可以把这个 SYN 报文发送给服务端了表示向服务端发起连接之后客户端处于同步已发送状态。 2、服务端收到客户端的 SYN 报文后也随机一个初始序列号(seqy)设置ackx1表示收到了客户端的x之前的数据希望客户端下次发送的数据从x1开始。 设置 SYN1 和 ACK1。表示这是一个SYN握手和ACK确认应答报文。最后把该报文发给客户端该报文也不包含应用层数据之后服务端处于同步已接收状态。 3、客户端收到服务端报文后还要向服务端回应最后一个应答报文将ACK置为 1 表示这是一个应答报文 acky1 表示收到了服务器的y之前的数据希望服务器下次发送的数据从y1开始。 最后把报文发送给服务端这次报文可以携带数据之后客户端处于 连接已建立 状态。服务器收到客户端的应答报文后也进入连接已建立状态。 完成三次握手连接建立后客户端和服务器就可以开始进行数据传输了。由于这种面向连接的特性TCP协议可以保证传输数据的安全所以应用十分广泛例如下载文件、浏览网页等。 2.3 四次挥手 TCP协议中在发送数据结束后释放连接时需要经过四次挥手。 第一次挥手客户端向服务器端提出结束连接让服务器做最后的准备工作。此时客户端处于半关闭状态即表示不再向服务器发送数据了但是还可以接受数据。第二次挥手服务器接收到客户端释放连接的请求后会将最后的数据发给客户端。并告知上层的应用进程不再接收数据。第三次挥手服务器发送完数据后会给客户端发送一个释放连接的报文。那么客户端接收后就知道可以正式释放连接了。第四次挥手客户端接收到服务器最后的释放连接报文后要回复一个彻底断开的报文。这样服务器收到后才会彻底释放连接。这里客户端发送完最后的报文后会等待2MSL因为有可能服务器没有收到最后的报文那么服务器迟迟没收到就会再次给客户端发送释放连接的报文此时客户端在等待时间范围内接收到会重新发送最后的报文并重新计时。如果等待2MSL后没有收到那么彻底断开。 1、客户端打算断开连接向服务器发送FIN报文(FIN标记位被设置为11表示为FIN0表示不是)FIN报文中会指定一个序列号之后客户端进入FIN_WAIT_1状态。也就是客户端发出连接释放报文段(FIN报文)指定序列号seq u主动关闭TCP连接等待服务器的确认。 2、服务器收到连接释放报文段(FIN报文)后就向客户端发送ACK应答报文以客户端的FIN报文的序列号 seq1 作为ACK应答报文段的确认序列号ack seq1 u 1。接着服务器进入CLOSE_WAIT(等待关闭)状态此时的TCP处于半关闭状态(下面会说什么是半关闭状态)客户端到服务器的连接释放。客户端收到来自服务器的ACK应答报文段后进入FIN_WAIT_2状态。 3、服务器也打算断开连接向客户端发送连接释放(FIN)报文段之后服务器进入LASK_ACK(最后确认)状态等待客户端的确认。服务器的连接释放(FIN)报文段的FIN1ACK1序列号seqm确认序列号acku1。 4、客户端收到来自服务器的连接释放(FIN)报文段后会向服务器发送一个ACK应答报文段以连接释放(FIN)报文段的确认序号 ack 作为ACK应答报文段的序列号 seq以连接释放(FIN)报文段的序列号 seq1作为确认序号ack。 之后客户端进入TIME_WAIT(时间等待)状态服务器收到ACK应答报文段后服务器就进入CLOSE(关闭)状态到此服务器的连接已经完成关闭。客户端处于TIME_WAIT状态时此时的TCP还未释放掉需要等待2MSL后客户端才进入CLOSE状态。 3. 网络编程API 3.1 InetAddress类 InetAddress类主要表示IP地址两个子类Inet4Address、Inet6Address。 InetAddress 类没有提供公共的构造器而是提供 了 如下几个 静态方法来获取InetAddress 实例 public static InetAddress getLocalHost()public static InetAddress getByName(String host)public static InetAddress getByAddress(byte[] addr) InetAddress 提供了如下几个常用的方法 public String getHostAddress() 返回 IP 地址字符串以文本表现形式public String getHostName() 获取此 IP 地址的主机名public boolean isReachable(int timeout)测试是否可以达到该地址 package com.atguigu.ip;import java.net.InetAddress; import java.net.UnknownHostException;import org.junit.Test;public class TestInetAddress {Testpublic void test01() throws UnknownHostException{InetAddress localHost InetAddress.getLocalHost();System.out.println(localHost);}Testpublic void test02()throws UnknownHostException{InetAddress atguigu InetAddress.getByName(www.atguigu.com);System.out.println(atguigu);}Testpublic void test03()throws UnknownHostException{ // byte[] addr {112,54,108,98};byte[] addr {(byte)192,(byte)168,24,56};InetAddress atguigu InetAddress.getByAddress(addr);System.out.println(atguigu);} }3.2 Socket类 网络上具有唯一标识的IP地址和端口号组合在一起构成唯一能识别的标识符套接字Socket。 利用套接字(Socket)开发网络应用程序早已被广泛的采用以至于成为事实上的标准。网络通信其实就是Socket间的通信。 通信的两端都要有Socket是两台机器间通信的端点。 Socket允许程序把网络连接当成一个流数据在两个Socket间通过IO传输。 一般主动发起通信的应用程序属客户端等待通信请求的为服务端。 Socket分类 流套接字stream socket使用TCP提供可依赖的字节流服务 ServerSocket此类实现TCP服务器套接字。服务器套接字等待请求通过网络传入。Socket此类实现客户端套接字也可以就叫“套接字”。套接字是两台机器间通信的端点。 数据报套接字datagram socket使用UDP提供“尽力而为”的数据报服务 DatagramSocket此类表示用来发送和接收UDP数据报包的套接字。 3.3 Socket相关类API 3.3.1 ServerSocket类 ServerSocket类的构造方法 ServerSocket(int port) 创建绑定到特定端口的服务器套接字。 ServerSocket类的常用方法 Socket accept()侦听并接受到此套接字的连接。 3.3.2 Socket类 Socket类的常用构造方法 public Socket(InetAddress address,int port)创建一个流套接字并将其连接到指定 IP 地址的指定端口号。public Socket(String host,int port)创建一个流套接字并将其连接到指定主机上的指定端口号。 Socket类的常用方法 public InputStream getInputStream()返回此套接字的输入流可以用于接收消息public OutputStream getOutputStream()返回此套接字的输出流可以用于发送消息public InetAddress getInetAddress()此套接字连接到的远程 IP 地址如果套接字是未连接的则返回 null。public InetAddress getLocalAddress()获取套接字绑定的本地地址。public int getPort()此套接字连接到的远程端口号如果尚未连接套接字则返回 0。public int getLocalPort()返回此套接字绑定到的本地端口。如果尚未绑定套接字则返回 -1。public void close()关闭此套接字。套接字被关闭后便不可在以后的网络连接中使用即无法重新连接或重新绑定。需要创建新的套接字对象。 关闭此套接字也将会关闭该套接字的 InputStream 和 OutputStream。public void shutdownInput()如果在套接字上调用 shutdownInput() 后从套接字输入流读取内容则流将返回 EOF文件结束符。 即不能在从此套接字的输入流中接收任何数据。public void shutdownOutput()禁用此套接字的输出流。对于 TCP 套接字任何以前写入的数据都将被发送并且后跟 TCP 的正常连接终止序列。 如果在套接字上调用 shutdownOutput() 后写入套接字输出流则该流将抛出 IOException。 即不能通过此套接字的输出流发送任何数据。 **注意**先后调用Socket的shutdownInput()和shutdownOutput()方法仅仅关闭了输入流和输出流并不等于调用Socket的close()方法。在通信结束后仍然要调用Scoket的close()方法因为只有该方法才会释放Socket占用的资源比如占用的本地端口号等。 3.3.3 DatagramSocket类 DatagramSocket 类的常用方法 public DatagramSocket(int port)创建数据报套接字并将其绑定到本地主机上的指定端口。套接字将被绑定到通配符地址IP 地址由内核来选择。public DatagramSocket(int port,InetAddress laddr)创建数据报套接字将其绑定到指定的本地地址。本地端口必须在 0 到 65535 之间包括两者。如果 IP 地址为 0.0.0.0套接字将被绑定到通配符地址IP 地址由内核选择。public void close()关闭此数据报套接字。public void send(DatagramPacket p)从此套接字发送数据报包。DatagramPacket 包含的信息指示将要发送的数据、其长度、远程主机的 IP 地址和远程主机的端口号。public void receive(DatagramPacket p)从此套接字接收数据报包。当此方法返回时DatagramPacket 的缓冲区填充了接收的数据。数据报包也包含发送方的 IP 地址和发送方机器上的端口号。 此方法在接收到数据报前一直阻塞。数据报包对象的 length 字段包含所接收信息的长度。如果信息比包的长度长该信息将被截短。public InetAddress getLocalAddress()获取套接字绑定的本地地址。public int getLocalPort()返回此套接字绑定的本地主机上的端口号。public InetAddress getInetAddress()返回此套接字连接的地址。如果套接字未连接则返回 null。public int getPort()返回此套接字的端口。如果套接字未连接则返回 -1。 3.3.4 DatagramPacket类 DatagramPacket类的常用方法 public DatagramPacket(byte[] buf,int length)构造 DatagramPacket用来接收长度为 length 的数据包。 length 参数必须小于等于 buf.length。public DatagramPacket(byte[] buf,int length,InetAddress address,int port)构造数据报包用来将长度为 length 的包发送到指定主机上的指定端口号。length 参数必须小于等于 buf.length。public InetAddress getAddress()返回某台机器的 IP 地址此数据报将要发往该机器或者是从该机器接收到的。public int getPort()返回某台远程主机的端口号此数据报将要发往该主机或者是从该主机接收到的。public byte[] getData()返回数据缓冲区。接收到的或将要发送的数据从缓冲区中的偏移量 offset 处开始持续 length 长度。public int getLength()返回将要发送或接收到的数据的长度。 4. TCP网络编程 4.1 通信模型 Java语言的基于套接字TCP编程分为服务端编程和客户端编程其通信模型如图所示 4.2 开发步骤 客户端程序包含以下四个基本的步骤 创建 Socket 根据指定服务端的 IP 地址或端口号构造 Socket 类对象。若服务器端响应则建立客户端到服务器的通信线路。若连接失败会出现异常。打开连接到 Socket 的输入/ 出流 使用 getInputStream()方法获得输入流使用getOutputStream()方法获得输出流进行数据传输按照一定的协议对 Socket 进行读/ 写操作通过输入流读取服务器放入线路的信息但不能读取自己放入线路的信息通过输出流将信息写入线路。关闭 Socket 断开客户端到服务器的连接释放线路 服务器端程序包含以下四个基本的 步骤 调用 ServerSocket(int port) 创建一个服务器端套接字并绑定到指定端口上。用于监听客户端的请求。调用 accept() 监听连接请求如果客户端请求连接则接受连接返回通信套接字对象。调用 该Socket 类对象的 getOutputStream() 和 getInputStream () 获取输出流和输入流开始网络数据的发送和接收。关闭Socket 对象客户端访问结束关闭通信套接字。 4.3 例题与练习 例题1客户端发送内容给服务端服务端将内容打印到控制台上。 例题2客户端发送文件给服务端服务端将文件保存在本地。 例题3从客户端发送文件给服务端服务端保存到本地。并返回“发送成功”给客户端。并关闭相应的连接。 练习1服务端读取图片并发送给客户端客户端保存图片到本地 练习2客户端给服务端发送文本服务端会将文本转成大写在返回给客户端。 演示单个客户端与服务器单次通信 需求客户端连接服务器连接成功后给服务发送“lalala”服务器收到消息后给客户端返回“欢迎登录”客户端接收消息后断开连接 1、服务器端示例代码 package com.atguigu.tcp.one;import java.io.InputStream; import java.io.OutputStream; import java.net.InetAddress; import java.net.ServerSocket; import java.net.Socket;public class Server {public static void main(String[] args)throws Exception {//1、准备一个ServerSocket对象并绑定8888端口ServerSocket server new ServerSocket(8888);System.out.println(等待连接....);//2、在8888端口监听客户端的连接该方法是个阻塞的方法如果没有客户端连接将一直等待Socket socket server.accept();InetAddress inetAddress socket.getInetAddress();System.out.println(inetAddress.getHostAddress() 客户端连接成功);//3、获取输入流用来接收该客户端发送给服务器的数据InputStream input socket.getInputStream();//接收数据byte[] data new byte[1024];StringBuilder s new StringBuilder();int len;while ((len input.read(data)) ! -1) {s.append(new String(data, 0, len));}System.out.println(inetAddress.getHostAddress() 客户端发送的消息是 s);//4、获取输出流用来发送数据给该客户端OutputStream out socket.getOutputStream();//发送数据out.write(欢迎登录.getBytes());out.flush();//5、关闭socket不再与该客户端通信//socket关闭意味着InputStream和OutputStream也关闭了socket.close();//6、如果不再接收任何客户端通信可以关闭ServerSocketserver.close();} } 2、客户端示例代码 package com.atguigu.tcp.one;import java.io.InputStream; import java.io.OutputStream; import java.net.Socket;public class Client {public static void main(String[] args) throws Exception {// 1、准备Socket连接服务器需要指定服务器的IP地址和端口号Socket socket new Socket(127.0.0.1, 8888);// 2、获取输出流用来发送数据给服务器OutputStream out socket.getOutputStream();// 发送数据out.write(lalala.getBytes());//会在流末尾写入一个“流的末尾”标记对方才能读到-1否则对方的读取方法会一致阻塞socket.shutdownOutput();//3、获取输入流用来接收服务器发送给该客户端的数据InputStream input socket.getInputStream();// 接收数据byte[] data new byte[1024];StringBuilder s new StringBuilder();int len;while ((len input.read(data)) ! -1) {s.append(new String(data, 0, len));}System.out.println(服务器返回的消息是 s);//4、关闭socket不再与服务器通信即断开与服务器的连接//socket关闭意味着InputStream和OutputStream也关闭了socket.close();} } 演示多个客户端与服务器之间的多次通信 通常情况下服务器不应该只接受一个客户端请求而应该不断地接受来自客户端的所有请求所以Java程序通常会通过循环不断地调用ServerSocket的accept()方法。 如果服务器端要“同时”处理多个客户端的请求因此服务器端需要为每一个客户端单独分配一个线程来处理否则无法实现“同时”。 咱们之前学习IO流的时候提到过装饰者设计模式该设计使得不管底层IO流是怎样的节点流文件流也好网络Socket产生的流也好程序都可以将其包装成处理流甚至可以多层包装从而提供更多方便的处理。 案例需求多个客户端连接服务器并进行多次通信 每一个客户端连接成功后从键盘输入英文单词或中国成语并发送给服务器服务器收到客户端的消息后把词语“反转”后返回给客户端客户端接收服务器返回的“词语”打印显示当客户端输入“stop”时断开与服务器的连接多个客户端可以同时给服务器发送“词语”服务器可以“同时”处理多个客户端的请求 1、服务器端示例代码 package com.atguigu.tcp.many;import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintStream; import java.net.ServerSocket; import java.net.Socket;public class Server {public static void main(String[] args) throws IOException {// 1、准备一个ServerSocketServerSocket server new ServerSocket(8888);System.out.println(等待连接...);int count 0;while(true){// 2、监听一个客户端的连接Socket socket server.accept();System.out.println(第 count 个客户端socket.getInetAddress().getHostAddress()连接成功);ClientHandlerThread ct new ClientHandlerThread(socket);ct.start();}//这里没有关闭server永远监听}static class ClientHandlerThread extends Thread{private Socket socket;private String ip;public ClientHandlerThread(Socket socket) {super();this.socket socket;ip socket.getInetAddress().getHostAddress();}public void run(){try{//1获取输入流用来接收该客户端发送给服务器的数据BufferedReader br new BufferedReader(new InputStreamReader(socket.getInputStream()));//2获取输出流用来发送数据给该客户端PrintStream ps new PrintStream(socket.getOutputStream());String str;// 3接收数据while ((str br.readLine()) ! null) {//4反转StringBuilder word new StringBuilder(str);word.reverse();//5返回给客户端ps.println(word);}System.out.println(客户端 ip正常退出);}catch(Exception e){System.out.println(客户端 ip意外退出);}finally{try {//6断开连接socket.close();} catch (IOException e) {e.printStackTrace();}}}} } 2、客户端示例代码 package com.atguigu.tcp.many;import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.PrintStream; import java.net.Socket; import java.util.Scanner;public class Client {public static void main(String[] args) throws Exception {// 1、准备Socket连接服务器需要指定服务器的IP地址和端口号Socket socket new Socket(127.0.0.1, 8888);// 2、获取输出流用来发送数据给服务器OutputStream out socket.getOutputStream();PrintStream ps new PrintStream(out);// 3、获取输入流用来接收服务器发送给该客户端的数据InputStream input socket.getInputStream();BufferedReader br;if(args! null args.length0) {String encoding args[0];br new BufferedReader(new InputStreamReader(input,encoding));}else{br new BufferedReader(new InputStreamReader(input));}Scanner scanner new Scanner(System.in);while(true){System.out.println(输入发送给服务器的单词或成语);String message scanner.nextLine();if(message.equals(stop)){socket.shutdownOutput();break;}// 4、 发送数据ps.println(message);// 接收数据String feedback br.readLine();System.out.println(从服务器收到的反馈是 feedback);}//5、关闭socket断开与服务器的连接scanner.close();socket.close();} }4.4 案例聊天室 服务端 package com.atguigu.tcp;import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.PrintStream; import java.net.ServerSocket; import java.net.Socket; import java.util.ArrayList;public class TestChatServer {//这个集合用来存储所有在线的客户端static ArrayListSocket online new ArrayListSocket();public static void main(String[] args)throws Exception {//1、启动服务器绑定端口号ServerSocket server new ServerSocket(8989);//2、接收n多的客户端同时连接while(true){Socket accept server.accept();online.add(accept);//把新连接的客户端添加到online列表中MessageHandler mh new MessageHandler(accept);mh.start();//}}static class MessageHandler extends Thread{private Socket socket;private String ip;public MessageHandler(Socket socket) {super();this.socket socket;}public void run(){try {ip socket.getInetAddress().getHostAddress();//插入给其他客户端转发“我上线了”sendToOther(ip上线了);//(1)接收该客户端的发送的消息InputStream input socket.getInputStream();InputStreamReader reader new InputStreamReader(input);BufferedReader br new BufferedReader(reader);String str;while((str br.readLine())!null){//(2)给其他在线客户端转发sendToOther(ip:str);}sendToOther(ip下线了);} catch (IOException e) {try {sendToOther(ip掉线了);} catch (IOException e1) {e1.printStackTrace();}}finally{//从在线人员中移除我online.remove(socket);}}//封装一个方法给其他客户端转发xxx消息public void sendToOther(String message) throws IOException{//遍历所有的在线客户端一一转发for (Socket on : online) {OutputStream every on.getOutputStream();//为什么用PrintStream目的用它的println方法按行打印PrintStream ps new PrintStream(every);ps.println(message);}}} } 客户端 package com.atguigu.tcp;import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.PrintStream; import java.net.Socket; import java.util.Scanner;public class TestChatClient {public static void main(String[] args)throws Exception {//1、连接服务器Socket socket new Socket(127.0.0.1,8989);//2、开启两个线程//(1)一个线程负责看别人聊即接收服务器转发的消息Receive receive new Receive(socket);receive.start();//(2)一个线程负责发送自己的话Send send new Send(socket);send.start();send.join();//等我发送线程结束了才结束整个程序socket.close();} } class Send extends Thread{private Socket socket;public Send(Socket socket) {super();this.socket socket;}public void run(){try {OutputStream outputStream socket.getOutputStream();//按行打印PrintStream ps new PrintStream(outputStream);Scanner input new Scanner(System.in);//从键盘不断的输入自己的话给服务器发送由服务器给其他人转发while(true){System.out.print(自己的话);String str input.nextLine();if(bye.equals(str)){break;}ps.println(str);}input.close();} catch (IOException e) {e.printStackTrace();}}} class Receive extends Thread{private Socket socket;public Receive(Socket socket) {super();this.socket socket;}public void run(){try {InputStream inputStream socket.getInputStream();Scanner input new Scanner(inputStream);while(input.hasNextLine()){String line input.nextLine();System.out.println(line);}} catch (IOException e) {e.printStackTrace();}} }4.5 理解客户端、服务端 客户端 自定义浏览器(browser — server) 服务端 自定义Tomcat服务器 5. UDP网络编程 UDP(User Datagram Protocol用户数据报协议)是一个无连接的传输层协议、提供面向事务的简单不可靠的信息传送服务类似于短信。 5.1 通信模型 UDP协议是一种面向非连接的协议面向非连接指的是在正式通信前不必与对方先建立连接不管对方状态就直接发送至于对方是否可以接收到这些数据内容UDP协议无法控制因此说UDP协议是一种不可靠的协议。无连接的好处就是快省内存空间和流量因为维护连接需要创建大量的数据结构。UDP会尽最大努力交付数据但不保证可靠交付没有TCP的确认机制、重传机制如果因为网络原因没有传送到对端UDP也不会给应用层返回错误信息。 UDP协议是面向数据报文的信息传送服务。UDP在发送端没有缓冲区对于应用层交付下来的报文在添加了首部之后就直接交付于ip层不会进行合并也不会进行拆分而是一次交付一个完整的报文。比如我们要发送100个字节的报文我们调用一次send()方法就会发送100字节接收方也需要用receive()方法一次性接收100字节不能使用循环每次获取10个字节获取十次这样的做法。 UDP协议没有拥塞控制所以当网络出现的拥塞不会导致主机发送数据的速率降低。虽然UDP的接收端有缓冲区但是这个缓冲区只负责接收并不会保证UDP报文的到达顺序是否和发送的顺序一致。因为网络传输的时候由于网络拥塞的存在是很大的可能导致先发的报文比后发的报文晚到达。如果此时缓冲区满了后面到达的报文将直接被丢弃。这个对实时应用来说很重要比如视频通话、直播等应用。 因此UDP适用于一次只传送少量数据、对可靠性要求不高的应用环境数据报大小限制在64K以下。 类 DatagramSocket 和 DatagramPacket 实现了基于 UDP 协议网络程序。 UDP数据报通过数据报套接字 DatagramSocket 发送和接收系统不保证 UDP数据报一定能够安全送到目的地也不能确定什么时候可以抵达。 DatagramPacket 对象封装了UDP数据报在数据报中包含了发送端的IP地址和端口号以及接收端的IP地址和端口号。 UDP协议中每个数据报都给出了完整的地址信息因此无须建立发送方和接收方的连接。如同发快递包裹一样。 5.2 开发步骤 发送端程序包含以下四个基本的步骤 创建DatagramSocket 默认使用系统随机分配端口号。创建DatagramPacket将要发送的数据用字节数组表示并指定要发送的数据长度接收方的IP地址和端口号。调用 该DatagramSocket 类对象的 send方法 发送数据报DatagramPacket对象。关闭DatagramSocket 对象发送端程序结束关闭通信套接字。 接收端程序包含以下四个基本的步骤 创建DatagramSocket 指定监听的端口号。创建DatagramPacket指定接收数据用的字节数组起到临时数据缓冲区的效果并指定最大可以接收的数据长度。调用 该DatagramSocket 类对象的receive方法 接收数据报DatagramPacket对象。。关闭DatagramSocket 接收端程序结束关闭通信套接字。 5.3 演示发送和接收消息 基于UDP协议的网络编程仍然需要在通信实例的两端各建立一个Socket但这两个Socket之间并没有虚拟链路这两个Socket只是发送、接收数据报的对象Java提供了DatagramSocket对象作为基于UDP协议的Socket使用DatagramPacket代表DatagramSocket发送、接收的数据报。 举例1 发送端 DatagramSocket ds null; try {ds new DatagramSocket();byte[] by hello,atguigu.com.getBytes();DatagramPacket dp new DatagramPacket(by, 0, by.length, InetAddress.getByName(127.0.0.1), 10000);ds.send(dp); } catch (Exception e) {e.printStackTrace(); } finally {if (ds ! null)ds.close(); } 接收端 DatagramSocket ds null; try {ds new DatagramSocket(10000);byte[] by new byte[1024*64];DatagramPacket dp new DatagramPacket(by, by.length);ds.receive(dp);String str new String(dp.getData(), 0, dp.getLength());System.out.println(str -- dp.getAddress()); } catch (Exception e) {e.printStackTrace(); } finally {if (ds ! null)ds.close(); } 举例2 发送端 package com.atguigu.udp;import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.util.ArrayList;public class Send {public static void main(String[] args)throws Exception { // 1、建立发送端的DatagramSocketDatagramSocket ds new DatagramSocket();//要发送的数据ArrayListString all new ArrayListString();all.add(尚硅谷让天下没有难学的技术);all.add(学高端前沿的IT技术来尚硅谷);all.add(尚硅谷让你的梦想变得更具体);all.add(尚硅谷让你的努力更有价值);//接收方的IP地址InetAddress ip InetAddress.getByName(127.0.0.1);//接收方的监听端口号int port 9999;//发送多个数据报for (int i 0; i all.size(); i) { // 2、建立数据包DatagramPacketbyte[] data all.get(i).getBytes();DatagramPacket dp new DatagramPacket(data, 0, data.length, ip, port); // 3、调用Socket的发送方法ds.send(dp);}// 4、关闭Socketds.close();} }接收端 package com.atguigu.udp;import java.net.DatagramPacket; import java.net.DatagramSocket;public class Receive {public static void main(String[] args) throws Exception { // 1、建立接收端的DatagramSocket需要指定本端的监听端口号DatagramSocket ds new DatagramSocket(9999);//一直监听数据while(true){//2、建立数据包DatagramPacketbyte[] buffer new byte[1024*64];DatagramPacket dp new DatagramPacket(buffer,buffer.length);//3、调用Socket的接收方法ds.receive(dp);//4、拆封数据String str new String(dp.getData(),0,dp.getLength());System.out.println(str);}// ds.close();} }6. URL编程 6.1 URL类 URL(Uniform Resource Locator)统一资源定位符它表示 Internet 上某一资源的地址。 通过 URL 我们可以访问 Internet 上的各种网络资源比如最常见的 wwwftp 站点。浏览器通过解析给定的 URL 可以在网络上查找相应的文件或其他资源。 URL的基本结构由5部分组成 传输协议://主机名:端口号/文件名#片段名?参数列表例如: http://192.168.1.100:8080/helloworld/index.jsp#a?usernameshkstartpassword123 片段名即锚点例如看小说直接定位到章节参数列表格式参数名参数值参数名参数值… 为了表示URLjava.net 中实现了类 URL。我们可以通过下面的构造器来初始化一个 URL 对象 public URL (String spec)通过一个表示URL地址的字符串可以构造一个URL对象。例如 URL url new URL(http://www. atguigu.com/); public URL(URL context, String spec)通过基 URL 和相对 URL 构造一个 URL 对象。例如 URL downloadUrl new URL(url, “download.html)public URL(String protocol, String host, String file); 例如 URL url new URL(http, www.atguigu.com, “download. html);public URL(String protocol, String host, int port, String file); 例如: URL gamelan new URL(http, www.atguigu.com, 80, “download.html);URL类的构造器都声明抛出非运行时异常必须要对这一异常进行处理通常是用 try-catch 语句进行捕获。 6.2 URL类常用方法 一个URL对象生成后其属性是不能被改变的但可以通过它给定的方法来获取这些属性 public String getProtocol( ) 获取该URL的协议名 public String getHost( ) 获取该URL的主机名 public String getPort( ) 获取该URL的端口号 public String getPath( ) 获取该URL的文件路径 public String getFile( ) 获取该URL的文件名 public String getQuery( ) 获取该URL的查询名 URL url new URL(http://localhost:8080/examples/myTest.txt); System.out.println(getProtocol() :url.getProtocol()); System.out.println(getHost() :url.getHost()); System.out.println(getPort() :url.getPort()); System.out.println(getPath() :url.getPath()); System.out.println(getFile() :url.getFile()); System.out.println(getQuery() :url.getQuery());6.3 针对HTTP协议的URLConnection类 URL的方法 openStream()能从网络上读取数据 若希望输出数据例如向服务器端的 CGI 公共网关接口-Common Gateway Interface-的简称是用户浏览器和服务器端的应用程序进行连接的接口程序发送一些数据则必须先与URL建立连接然后才能对其进行读写此时需要使用 URLConnection 。 URLConnection表示到URL所引用的远程对象的连接。当与一个URL建立连接时首先要在一个 URL 对象上通过方法 openConnection() 生成对应的 URLConnection 对象。如果连接过程失败将产生IOException. URL netchinaren new URL (“http://www.atguigu.com/index.shtml”);URLConnectonn u netchinaren.openConnection( ); 通过URLConnection对象获取的输入流和输出流即可以与现有的CGI程序进行交互。 public Object getContent( ) throws IOException public int getContentLength( ) public String getContentType( ) public long getDate( ) public long getLastModified( ) public InputStream getInputStream ( ) throws IOException public OutputSteram getOutputStream( )throws IOException 6.4 小结 位于网络中的计算机具有唯一的IP地址这样不同的主机可以互相区分。 客户端服务器是一种最常见的网络应用程序模型。服务器是一个为其客户端提供某种特定服务的硬件或软件。客户机是一个用户应用程序用于访问某台服务器提供的服务。端口号是对一个服务的访问场所它用于区分同一物理计算机上的多个服务。套接字用于连接客户端和服务器客户端和服务器之间的每个通信会话使用一个不同的套接字。TCP协议用于实现面向连接的会话。 Java 中有关网络方面的功能都定义在 java.net 程序包中。Java 用 InetAddress 对象表示 IP 地址该对象里有两个字段主机名(String) 和 IP 地址(int)。 类 Socket 和 ServerSocket 实现了基于TCP协议的客户端服务器程序。Socket是客户端和服务器之间的一个连接连接创建的细节被隐藏了。这个连接提供了一个安全的数据传输通道这是因为 TCP 协议可以解决数据在传送过程中的丢失、损坏、重复、乱序以及网络拥挤等问题它保证数据可靠的传送。 ion 。 URLConnection表示到URL所引用的远程对象的连接。当与一个URL建立连接时首先要在一个 URL 对象上通过方法 openConnection() 生成对应的 URLConnection 对象。如果连接过程失败将产生IOException. URL netchinaren new URL (“http://www.atguigu.com/index.shtml”);URLConnectonn u netchinaren.openConnection( ); 通过URLConnection对象获取的输入流和输出流即可以与现有的CGI程序进行交互。 public Object getContent( ) throws IOException public int getContentLength( ) public String getContentType( ) public long getDate( ) public long getLastModified( ) public InputStream getInputStream ( ) throws IOException public OutputSteram getOutputStream( )throws IOException 6.4 小结 位于网络中的计算机具有唯一的IP地址这样不同的主机可以互相区分。 客户端服务器是一种最常见的网络应用程序模型。服务器是一个为其客户端提供某种特定服务的硬件或软件。客户机是一个用户应用程序用于访问某台服务器提供的服务。端口号是对一个服务的访问场所它用于区分同一物理计算机上的多个服务。套接字用于连接客户端和服务器客户端和服务器之间的每个通信会话使用一个不同的套接字。TCP协议用于实现面向连接的会话。 Java 中有关网络方面的功能都定义在 java.net 程序包中。Java 用 InetAddress 对象表示 IP 地址该对象里有两个字段主机名(String) 和 IP 地址(int)。 类 Socket 和 ServerSocket 实现了基于TCP协议的客户端服务器程序。Socket是客户端和服务器之间的一个连接连接创建的细节被隐藏了。这个连接提供了一个安全的数据传输通道这是因为 TCP 协议可以解决数据在传送过程中的丢失、损坏、重复、乱序以及网络拥挤等问题它保证数据可靠的传送。 类 URL 和 URLConnection 提供了最高级网络应用。URL 的网络资源的位置来同一表示 Internet 上各种网络资源。通过URL对象可以创建当前应用程序和 URL 表示的网络资源之间的连接这样当前程序就可以读取网络资源数据或者把自己的数据传送到网络上去。

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

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

相关文章

flash网站模板中心东莞网站建设优化方案

目录 最后一台主机(第四台) 本地yum源安装httpd(非必做) 继续开始从最后一台主机开始(第四台) 转第二台主机 转第三台主机 回第二台 上传 转第三台主机 上传 回第二台 转第三台 转第一台主机…

平面素材网站排名帝国cms做的网站

从零开始搭建一个vue项目 一、环境准备 1.1 安装node.js 选择合适的LTS版本,然后下载安装,安装地址:https://nodejs.org/en/download 在命令行中查看已安装的node.js版本 node -v v14.14.01.2 切换为淘宝的镜像源 解决国内下载慢的问题,…

企业网站长度域名不变 新网站

这两种写法在C#中都是有效的,但是它们代表了不同的语法风格和C#版本特性。 第一种写法: namespace Nebula.PDF; public class PdfDocument {}这是C# 9.0及更高版本中引入的顶级语句(top-level statements)特性。它允许你直接在文…

建设网站平台哪里最好建设网站制作公司如何选择

黑色星期五,作为全球购物狂欢的象征,已经成为了电商业务的一年一度的重要节点。尤其对于跨境电商来说,这一天意味着巨大的商机和挑战。为了在这个竞争激烈的时刻脱颖而出,跨境电商必须做好充分的准备。Nox聚星在这里给大家分享几个…

怎么样模仿一个网站做简历学做巧裁缝官方网站

目录 1.私信列表 1.1 数据访问层 1.2 业务层 1.3 表现层 1.4 私信详情 2.发送列表 2.1 数据访问层 2.2 业务层 2.3 表现层 2.4 设置已读状态 1.私信列表 私信列表:查询当前用户的会话列表,每个会话只显示一条最新的私信、支持分页列表私信详情…

泰安网站建设哪里有wordpress您访问的网页出错

Android 为了让我们能够更加方便的管理数据库,特意提供了一个SQLiteOpenHelper帮助类,通过借助这个类就可以非常简单的对数据库进行创建和升级。 SQLiteOpenHelper是一个抽象类,我们要创建一个自己的帮助类去继承它。SQLiteOpenHelper有两个抽…

南翔企业网站开发建设好玩的网页游戏排行

团队名称:筑梦之舟 团队项目名称:跑跑 N(Need)需求: 有许多人在跑步时想了解自己的移动轨迹和跑步距离很不便利,无法了解跑步的日程,我们的软件就是为了更加方便热爱跑步的人能够参加到跑步之中…

一个人做网站要多久本科学历30天出证

我们可能会收到类似于这样的短信,发现其中的链接并不是常规的网址链接,而是个短小精悍的短链接,产品中经常需要这样的需求,如果在给用户下发的短信中是一个很长的连接,用户体验肯定很差,因此我们需要实现长…

网站建设的重难点分析购物网站建设平台

Python爬虫程序是一种利用Python编写的程序,用于自动化地从互联网上获取数据。它可以模拟人类在网页上的操作,自动化地访问网页并提取所需的数据。Python爬虫程序可以用于各种用途,例如数据挖掘、信息收集、搜索引擎优化等。它通常使用Python…

扬州网站建设myvodo龙华网站建设招商

💨随着信息技术的迅猛发展,云计算已成为推动数字经济发展的重要驱动力之一。在这个领域中,云栖大会无疑是中国乃至全球最重要的盛会之一。云栖大会的历史可以追溯到2009年的地方网站峰会,随着时间的推移,它逐渐演变为阿…

html网站源代码网站推广需要几个人做

文章目录 1、索引阻塞的种类2、什么时候使用阻塞?场景1:进行系统维护场景。场景2:保护数据不被随意更改场景。场景3:优化资源使用的场景。场景4:遵守安全规则场景。 3、添加索引阻塞API4、解除设置 API5、小结6、参考 …

小说阅读网站建设市场需求分析百度公司招聘官网

在互联网的app当中,特别是像美团,饿了么等app。经常会看到附件美食或者商家, 当我们点击美食之后,会出现一系列的商家,商家中可以按照多种排序方式,我们此时关注的是距离,这个地方就需要使用到我…

医药电商网站建设网站开发人员工资水平

10011311341 吕涛、10011311356李红目的:通过熟悉使用火车头采集器,在网络上采取3万条笑话并进行排重,以此来熟悉web文本挖掘的一些知识。过程:本次学习,主要分成两个部分。第一部分是笑话文本的采集,第二部…

网站之间的区别查询网站备案显示划横线

随着科技的进步,智能机器人越来越多地融入我们的日常生活。其中,CyberDog 2作为一款前沿的四足机器人,凭借其出色的视觉灵敏度和多功能技术配备,受到了广泛的关注。本文将重点探讨CyberDog 2的视觉系统,尤其是其四种不同类型的摄像头如何共同提升其视觉灵敏度,以及激光传…

网站域名过期未续费怎么办梅县区住房和城乡规划建设局官方网站

西甲的赫罗纳足球俱乐部是8868体育助力的球队之一,西甲排名第12的赫塔费队迎来了西甲第29轮的较量,赫塔费队此役坐镇自己的主场PK赛前排名第2的争冠超级黑马赫罗纳队。 赛前赫塔费队已经连续4轮联赛不胜(2平2负状态低迷)&#xff…

计算机网络 网站开发与设计徐州有哪些做网站

参考资料: JAVA并发专题 - 终有救赎的专栏 - 掘金 Java并发编程学习路线(建议收藏��) | Java程序员进阶之路x沉默王二 面试题目: JUC第一讲:Java并发知识体系详解 面试题汇总(P6熟练 P7精通…

网站怎么增加流量长沙seo工资

最近,网上疯传OpenAI2027年关于AGI的计划。在本文,我们将针对部分细节以第一人称进行分享。​ 摘要:OpenAI于2022年8月开始训练一个125万亿参数的多模态模型。第一个阶段是Arrakis,也叫Q*,该模型于2023年12月完成训练&…

台州seo网站推广旅游网站信息门户建设方案

Kafka中神秘的内部主题(Internal Topic)__consumer_offsets。 consumer_offsets在Kafka源码中有个更为正式的名字,叫*位移主题*,即Offsets Topic。为了方便今天的讨论,我将统一使用位移主题来指代consumer_offsets。需…

做网站哪个公司电子商务网站推广计划书

文章目录 定义案例:零售销售数据仓库实践创建维度表创建事实表插入维度表数据插入事实表数据增改查 定义 维度建模是一种用于数据仓库设计的技术,它的目标是使数据库结构更加直观,易于理解和使用,特别是对于那些进行数据查询和报…

校园兼职网站开发用例图wordpress 联系我们表单

操作系统:CentOS 7.5 64bit,安装方式为gnome Desktop,附加系统工具以及兼容X Window安装包Oracle版本:11gR2Oracle11gR2官方文档链接安装系统建立默认用户的时候建立非oracle的账号。由于是离线安装,使用ssh登录&#…