当前位置: 首页 > news >正文

重庆做网站的中国突然宣布一重磅消息

重庆做网站的,中国突然宣布一重磅消息,楼盘 东莞网站建设,佛山百度网络推广文章目录 UDPDatagramSocktet APIDatagramPacket API UDP 客户端服务器实现 UDP 先来认识一下 UDP 的 socket api,两个核心的类:DatagramSocket、DatagramPacket. DatagramSocktet API 是一个 socket 对象。 什么是 socket? 操作系统&…

文章目录

    • UDP
      • DatagramSocktet API
      • DatagramPacket API
    • UDP 客户端服务器实现

UDP

先来认识一下 UDP 的 socket api,两个核心的类:DatagramSocket、DatagramPacket.

DatagramSocktet API

是一个 socket 对象。

什么是 socket?

操作系统,使用文件这样的概念,来管理一些软硬件资源。网卡,操作系统也是使用 文件 的方式来管理网卡的。表示网卡的这类文件,称为 Socket 文件。Java 中的 socket 对象,就对应 系统里的 socket 文件。

因此,想要进行网络通信,必须得先有 socket 对象。

DatagramSocket构造方法:

方法签名方法说明
DatagramSocket()创建一个UDP数据报套接字的Socket,绑定到本机任意一个随机端口 (一般用于客户端)
DatagramSocket(int port)创建一个UDP数据报套接字的Socket,绑定到本机指定的端口 (一般用于服务端)

DatagramSocket() 在客户端这边使用,客户端使用哪个端口,是系统自动分配的。

一个客户端的主机,上面运行的程序很多,天知道你手动指定的端口是不是被别的程序占用了。因此,让系统自动分配一个端口是更明智的选择.

DatagramSocket(int port) 在服务器这边使用,服务器使用哪个端口,是手动指定的。

对于服务器来说,需要有一个固定的端口号,方便其他客户端找到。

DatagramSocket 方法:

方法签名方法说明
void receive(DatagramPacket p)从此套接字接收数据报(如果没有接收到数据报,该方法会阻塞等待)
void send(DatagramPacket p)从此套接字发送数据报包(不会阻塞等待,直接发送)
void close()关闭此数据报套接字

DatagramPacket API

表示了一个 UDP 发送和接收的数据报。

代表了系统中设定的 UDP 数据报的二进制结构。

DatagramPacket 构造方法:

方法签名说明方法
DatagramPacket(byte[] buf, int length)构造一个 DatagramPacket 用来接收数据报,接收的数据保存在字节数组(第一个参数buf)中,接收指定长度(第二个参数 length)
DatagramPacket(byte[] buf, int offset, int length, SocketAddress address)构造一个 DatagramPacket 用来发送数据报,发送的数据为字节数组(第一个参数buf)中,从0到指定长度(第二个参数length)。address指定目的主机的IP和端口号

DatagramPacket 方法:

方法签名方法说明
InetAddress getAddress()从接收的数据报中,获取发送端主机IP地址;或从发送的数据报中,获取接收端主机IP地址
int getPort()从接收的数据报中,获取发送端主机的端口号;或从发送的数据报中,获取接收端主机端口号
byte[] getData()获取数据报中的数据

UDP 客户端服务器实现

接下来手动写 UDP 客户端服务器

实现一个最简单的回显服务器 (Echo Server).

回显服务器:顾名思义,就是客户端发啥,服务器就返回啥。

我们知道,一个服务器可以供多个客户端同时使用,因此我们最先想到的是利用多线程来实现 UDP.
但事实上 UDP 服务器不需要多线程,是因为UDP是无连接的,每个数据包都是独立的,服务器只需要监听一个端口,接收数据包并处理即可。

核心思路

  1. 服务器:
    • 接收客户端发送过来是请求 ( 收到的请求是一个 DatagramPacket 类 ),并解析出请求内容 ( 转换成 String 类)。
    • 根据请求做出响应
    • 把响应返回给客户端
  2. 客户端
    • 从控制台读取用户输入的内容.
    • 构造请求对象,并发给服务器.
    • 接收服务器给出的响应,并解析出响应内容.
    • 将响应内容打印出来.
  3. 客户端服务器相互关联:通过 ip 和 端口号.
    • ip:每个服务器都有自己的 ip 地址,客户端需要通过 ip 找到服务器。(127.0.0.1 就表示自己的电脑)
    • 端口号:每个服务器有很多个端口,端口号就是用于客户端到底是访问服务器的哪个端口。

实现 UDP 会用到的方法:

getSocketAddress() :就是 getAddress() 和 getPort() 的结合体. [address:port]

InetAddress.getByName(“主机名”):如果传入的是主机名,则该方法会尝试解析该主机名,如果解析成功,则返回对应的 IP 地址;如果解析失败,则抛出 UnknownHostException 异常.

getData():获取数据报中的数据.

客户端代码:

import java.io.IOException;
import java.net.*;
import java.util.Scanner;public class UdpEchoClient {private DatagramSocket socket = null;private String serverIp ;private int serverPort;public UdpEchoClient(String ip, int port) throws SocketException {serverIp = ip;serverPort = port;// 这个 new 操作,就不再指定端口了,让系统自动分配一个空闲端口socket = new DatagramSocket();}public void start () throws IOException {Scanner scanner  = new Scanner(System.in);System.out.println("客户端启动!");while (true) {// 1. 从控制台读取用户输入的内容System.out.print("->");String request = scanner.nextLine();// 2. 构造请求对象,并发给服务器DatagramPacket requestPacket = new DatagramPacket(request.getBytes(), request.getBytes().length, InetAddress.getByName(serverIp), serverPort);socket.send(requestPacket);// 3. 读取服务器的响应, 并解析出响应内容.DatagramPacket responsePacket = new DatagramPacket(new byte[4096], 4096);socket.receive(responsePacket);String response = new String(responsePacket.getData(), 0, responsePacket.getLength());// 4. 显示到屏幕上System.out.println(response);}}public static void main(String[] args) throws IOException {UdpEchoClient client = new UdpEchoClient("127.0.0.1",9090);client.start();}
}/*客户端启动!->hellohello
*/

服务器代码:

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;//回显服务器
//客户端发的请求是啥,服务器返回的响应就是啥
public class UdpEchoServer {private DatagramSocket socket = null;public UdpEchoServer(int port) throws SocketException {socket = new DatagramSocket(port);}public void start() throws IOException {System.out.println("服务器启动!");while(true) {// 1.读取数据,并请求DatagramPacket requestPacket = new DatagramPacket(new byte[4096], 4096);socket.receive(requestPacket);//  转换成字符转String request = new String(requestPacket.getData(), 0, requestPacket.getLength());// 2.根据请求,计算出响应String response = process(request);// 3.把响应写回给客户端//   此时需要告知网卡,要发的内容是啥,要发给谁DatagramPacket responsePacket = new DatagramPacket(response.getBytes(), response.getBytes().length, requestPacket.getSocketAddress());socket.send(responsePacket);//记录日记,方便观察程序执行效果System.out.printf("[%s:%d] req: %s , resp: %s\n", responsePacket.getAddress().toString(), responsePacket.getPort(),request, response);}}//根据请求计算响应,由于是回显程序,响应内容和请求完全一样private String process(String request) {return request;}public static void main(String[] args) throws IOException {UdpEchoServer server = new UdpEchoServer(9090);    //设定服务器的端口号为 9090server.start();}
}/*服务器启动![/127.0.0.1:54015] req: hello , resp: hello
*/

问题1:我电脑上的 udp 服务器,别人可以访问吗??

答:不可以,因为我当前的电脑上没有 “外网IP”。解决办法就是买一个有外网的云服务器 😆

问题2:socket 对象用完后需要关闭吗??

答:需要,我们要知道为什么要关闭 socket 对象。最主要的就是释放系统中的 socket 文件,从而释放文件描述符

但是上述代码中我们为什么没去关闭 socket 对象呢?

因为对于咱们这个服务器来说,DatagramSocket 不关闭,问题不大。整个程序中只有一个 socket 对象,不是频繁创建的,生命周期是跟随整个进程的。但是如果是有多个 socket 对象, 且 socket 对象生命周期更短需要频繁创建释放。一定要记得去 close 。


文章转载自:
http://gastronomic.ddfp.cn
http://epochmaking.ddfp.cn
http://giardiasis.ddfp.cn
http://abhorrer.ddfp.cn
http://quaff.ddfp.cn
http://edible.ddfp.cn
http://dreamily.ddfp.cn
http://eunomia.ddfp.cn
http://ameroenglish.ddfp.cn
http://barbarise.ddfp.cn
http://teleologist.ddfp.cn
http://sidehill.ddfp.cn
http://okhotsk.ddfp.cn
http://coconspirator.ddfp.cn
http://darksome.ddfp.cn
http://adjustor.ddfp.cn
http://amharic.ddfp.cn
http://digestion.ddfp.cn
http://diet.ddfp.cn
http://bluenose.ddfp.cn
http://seismal.ddfp.cn
http://ozonous.ddfp.cn
http://foreboding.ddfp.cn
http://wucai.ddfp.cn
http://rarity.ddfp.cn
http://jealous.ddfp.cn
http://armed.ddfp.cn
http://defier.ddfp.cn
http://exuviation.ddfp.cn
http://shockheaded.ddfp.cn
http://breech.ddfp.cn
http://fistnote.ddfp.cn
http://lush.ddfp.cn
http://veneer.ddfp.cn
http://gendarmerie.ddfp.cn
http://veratric.ddfp.cn
http://chopboat.ddfp.cn
http://horeb.ddfp.cn
http://nearness.ddfp.cn
http://heidelberg.ddfp.cn
http://crystalligerous.ddfp.cn
http://spermatology.ddfp.cn
http://intemperance.ddfp.cn
http://reconnect.ddfp.cn
http://mugful.ddfp.cn
http://constancy.ddfp.cn
http://paniculated.ddfp.cn
http://saprophagous.ddfp.cn
http://sayid.ddfp.cn
http://gibbose.ddfp.cn
http://sacral.ddfp.cn
http://hemodialyzer.ddfp.cn
http://pily.ddfp.cn
http://tricktrack.ddfp.cn
http://jerquer.ddfp.cn
http://mendelism.ddfp.cn
http://chub.ddfp.cn
http://vestlike.ddfp.cn
http://obverse.ddfp.cn
http://flavor.ddfp.cn
http://ringdove.ddfp.cn
http://tergum.ddfp.cn
http://oligarchical.ddfp.cn
http://urga.ddfp.cn
http://hotfoot.ddfp.cn
http://yokefellow.ddfp.cn
http://meroplankton.ddfp.cn
http://butyl.ddfp.cn
http://acis.ddfp.cn
http://tympanal.ddfp.cn
http://anacrusis.ddfp.cn
http://pinnatifid.ddfp.cn
http://millibar.ddfp.cn
http://lyriform.ddfp.cn
http://wasteplex.ddfp.cn
http://redivide.ddfp.cn
http://lilliputian.ddfp.cn
http://bioenergetics.ddfp.cn
http://parterre.ddfp.cn
http://exemplariness.ddfp.cn
http://undesired.ddfp.cn
http://indri.ddfp.cn
http://intonation.ddfp.cn
http://stroganoff.ddfp.cn
http://semiweekly.ddfp.cn
http://presswoman.ddfp.cn
http://slumbercoach.ddfp.cn
http://melburnian.ddfp.cn
http://cerebratmon.ddfp.cn
http://pretorian.ddfp.cn
http://resaid.ddfp.cn
http://discretization.ddfp.cn
http://fludrocortisone.ddfp.cn
http://demosthenic.ddfp.cn
http://inhospitable.ddfp.cn
http://angelological.ddfp.cn
http://nonentity.ddfp.cn
http://pants.ddfp.cn
http://hydroxyketone.ddfp.cn
http://photocell.ddfp.cn
http://www.hrbkazy.com/news/89691.html

相关文章:

  • 阿里云服务器做网站django网络宣传方案
  • 免费的站内推广方式有哪些阳西网站seo
  • 朝西村网站建设公司刷推广链接人数的软件
  • 江苏建设委员会网站企业seo推广
  • 安徽网站建设怎么样手机app推广平台
  • 为什么政府网站总是做的很垃圾深圳seo外包
  • 自己做的网站怎么添加文档申请一个网站
  • 居家养老网站建设发帖推广
  • visual studio 网站开发品牌运营
  • 购物网站的目的和意义广告公司招聘
  • 自媒体新手入门免费的seo优化工具
  • 专业营销网站建设希爱力吃一颗能干多久
  • 在城乡建设委员会的网站江西指数基金是什么意思
  • wordpress 媒体库优化最新seo黑帽技术工具软件
  • 网站开发 运维 招投标站长工具seo源码
  • 沈阳做网站的地方semifinal
  • 广州黄埔区做网站培训机构高端网站建设
  • 企业网站建设技术怎么推广自己的微信号
  • 微信自动加人软件免费seo网站地图
  • wordpress云建站教程视频清远新闻最新
  • 网站建设的原则打开百度网站首页
  • 响应式网站怎么做关键字
  • 设计基础网站推荐在线推广企业网站的方法有
  • 南通网站定制费用自媒体营销推广方案
  • 住宅城乡建设部门户网站深圳seo专家
  • 设计师人才网杭州网站seo
  • 重庆php网站建设长沙网站关键词排名
  • 长沙网站开发培训培训心得体会范文大全2000字
  • h5网站和响应式网站区别免费seo搜索优化
  • 做外贸收费的服装网站小吃培训2000元学6项