(请观看本人博文 —— 《详解 网络编程》)


DatagramSocket

概述

这类代表一个发送和接收数据包插座

该类是遵循 UDP协议 实现的一个Socket类

数据报套接字发送或者接收点的分组传送服务。

每个发送的数据包或数据报套接字上接收单独寻址和路由。

从一台机器发送到另一台机器的多个数据包可能会被不同的路由,

并可以以任何顺序到达。

在可能的情况下,

一个新建的DatagramSocket有SO_BROADCAST套接字选项已启用,以便允许广播数据报传输。

为了收到广播包应该将DatagramSocket绑定到通配符地址。

在一些实施方案中,广播包,也可以接受当一个DatagramSocket绑定到一个更具体的地址。


现在,本人来展示下这个类的构造方法

构造方法

  • DatagramSocket()

    构建一个数据报套接字 ,绑定到本地主机任何可用的端口
  • DatagramSocket(int port)

    构建一个数据报套接字,绑定到本地主机指定端口
  • DatagramSocket(int port, InetAddress laddr)

    创建一个数据报套接字,绑定到指定的本地地址
  • DatagramSocket(SocketAddress bindaddr)

    创建一个数据报套接字,绑定到指定的本地套接字地址
  • protected DatagramSocket(DatagramSocketImpl impl)

    创建一个绑定的数据报套接字, 与指定的datagramsocketimpl相关(一般不使用)

那么,现在,本人来展示下这个类的API

API

  • InetAddress getInetAddress()

    返回此套接字连接的地址
  • InetAddress getLocalAddress()

    获取绑定的套接字的本地地址
  • int getLocalPort()

    返回此套接字绑定的本地主机上的端口号
  • SocketAddress getLocalSocketAddress()

    返回此套接字绑定到的端点的地址
  • int getPort()

    返回此套接字连接的端口号
  • void close()

    关闭该数据报套接字
  • void connect(InetAddress address, int port)

    将套接字连接到这个套接字的远程地址
  • void connect(SocketAddress addr)

    将此套接字连接到远程套接字地址(IP地址+端口号)
  • void bind(SocketAddress addr)

    结合这个DatagramSocket到特定的地址和端口
  • void disconnect()

    断开插座
  • boolean getBroadcast()

    如果so_broadcast启用
  • DatagramChannel getChannel()

    返回与此数据报套接字相关的独特的 DatagramChannel对象,如果任何
  • int getReceiveBufferSize()

    得到这个 DatagramSocket的so_rcvbuf期权价值,即通过平台用于该 DatagramSocket输入缓冲区的大小。
  • SocketAddress getRemoteSocketAddress()

    返回此套接字连接的端点的地址,或如果它是无关的 null。
  • boolean getReuseAddress()

    如果so_reuseaddr启用。
  • int getSendBufferSize()

    得到这个 DatagramSocket的so_sndbuf期权价值,即缓冲区的大小由平台用于输出在这 DatagramSocket。
  • int getSoTimeout()

    检索设置so_timeout。
  • int getTrafficClass()

    获取交通类或类型的服务在IP数据报头的DatagramSocket发送的数据包。
  • boolean isBound()

    返回套接字的绑定状态。
  • boolean isClosed()

    返回套接字是否关闭或不关闭的。
  • boolean isConnected()

    返回套接字的连接状态。
  • void receive(DatagramPacket p)

    接收数据报包从这个插座。
  • void send(DatagramPacket p)

    从这个套接字发送数据报包。
  • void setBroadcast(boolean on)

    启用/禁用so_broadcast。
  • static void setDatagramSocketImplFactory(DatagramSocketImplFactory fac)

    集的数据报套接字实现工厂的应用。
  • void setReceiveBufferSize(int size)

    集so_rcvbuf选项,这 DatagramSocket指定值。
  • void setReuseAddress(boolean on)

    启用/禁用so_reuseaddr套接字选项。
  • void setSendBufferSize(int size)

    集so_sndbuf选项,这 DatagramSocket指定值。
  • void setSoTimeout(int timeout)

    启用/禁用so_timeout以指定的超时时间,以毫秒为单位。
  • void setTrafficClass(int tc)

    集交通类或从这个DatagramSocket发送数据报的IP数据报头字节型服务

那么,接下来,本人来通过一个例子,来展示下部分API的使用

例1

题目

右转哥忽然被竖锯附体,透过屏幕看向了一个未关注右转哥的同学,现在,他俩之间要进行一轮对话,请完成相关代码。

要求

使用DatagramSocket类构造对象,实现下右转哥(竖锯附身版)和那位同学的对话

那么,本人来给出代码:

首先是右转哥的代码:

package edu.youzg.about_net.about_udp.core;

import java.io.IOException;
import java.net.*; public class UDPYouzg { public static void main(String[] args) throws IOException {
//创建Youzg 的 UDP的Socket
DatagramSocket youzg = new DatagramSocket(8888); //封装数据 DatagramPacket数据报包 数据报包用来实现无连接包投递服务。
byte[] bytes = "Hello,Students who don't pay attention to Youzg\r\nI want to play a game...".getBytes();
DatagramPacket packet = new DatagramPacket(bytes, bytes.length, InetAddress.getLocalHost(), 6666); //发送数据,发送数据报包
youzg.send(packet); //接收数据
youzg.receive(packet); //阻塞的方法,如果数据没过来,就等待在这里。
//从数据报包中取数据
byte[] data = packet.getData();
//获取数据报包中数据的实际长度
int length = packet.getLength();
//把字节数据转换成字符串
String s = new String(data, 0, length);
System.out.println("the guy 给你发来消息,内容是:\r\n" + s); //释放资源
youzg.close();
} }

接下来实现下 该同学的代码:

package edu.youzg.about_net.about_udp.core;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress; public class UDPYou { public static void main(String[] args) throws IOException {
//创建数据报套接字并将其绑定到本地主机上的指定端口。
//创建服务端的Sokcet并暴露端口号
DatagramSocket you = new DatagramSocket(6666); //构造 DatagramPacket,用来接收长度为 length 的数据包。
byte[] bytes = new byte[1024];
DatagramPacket packet = new DatagramPacket(bytes, bytes.length); //接收数据
you.receive(packet); //阻塞的方法,如果数据没过来,就等待在这里。
//从数据报包中取数据
byte[] data = packet.getData();
//获取数据报包中数据的实际长度
int length = packet.getLength();
//把字节数据转换成字符串
String s = new String(data, 0, length);
System.out.println("Jigsaw 给你发来消息,内容是:\r\n" + s); //回复消息
data = "I'm sorry,I'm following Youzg right now at thumb up".getBytes();
packet = new DatagramPacket(data, data.length, InetAddress.getLocalHost(), 8888);
you.send(packet); //释放资源
you.close();
} }

那么,现在,本人来展示下两人的对话过程(运行结果):

首先是 该同学 接受到信息:

接下来是 右转哥 接收到的回复:



可以看到,上述代码实现了两人的一问一答的对话。

(哈哈,看到上述的聊天过程,右转哥不禁笑出了声)

例2:

题目

右转哥自从被附体之后,在无意中做了很多自己并不知道的事情,所以,他要和有的同学进行一系列交谈,了解当时发生的事。请用代码实现下他们的聊天。

要求

编写模拟聊天室的聊天功能,在控制台输入语句,在控制台显示接收到的语句

那么,本人现在来展示下代码:

首先是 右转哥聊天所需的代码:

package edu.youzg.about_net.about_udp.core;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.*; public class UDPYouzg { public static void main(String[] args) throws IOException {
//创建子线程开启服务器,来接收消息
new Thread(new Runnable() {
@Override
public void run() {
try {
//创建服务端的Socket,并暴露端口号
DatagramSocket ds = new DatagramSocket(8888);
System.out.println("Youzg服务器已经开启,等待连接");
while (true) {
//接收发送过来的数据
byte[] bytes = new byte[1024];
DatagramPacket dp = new DatagramPacket(bytes, bytes.length); ds.receive(dp);
//从数据报包中取出数据
byte[] data = dp.getData();
int length = dp.getLength();
//取发送者的IP
String s = new String(data, 0, length);
System.out.println("the gay:" + s);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}).start(); //在主线程给对方发消息
sendMsg(); } private static void sendMsg() {
try {
//创建客户端的socket
DatagramSocket ds = new DatagramSocket();
//创建键盘录入对象
BufferedReader bfr = new BufferedReader(new InputStreamReader(System.in));
while (true) {
System.out.println("请输入要发送消息:");
String s = bfr.readLine();
if (s.equals("byebye")) {
break;
}
byte[] bytes = s.getBytes();
//创建数据报包
DatagramPacket dp = new DatagramPacket(bytes, bytes.length, InetAddress.getLocalHost(), 9999);
//发送数据
ds.send(dp);
} //释放资源
ds.close();
} catch (IOException e) {
e.printStackTrace();
}
} }

接下来是 那位同学聊天所需的代码:

package edu.youzg.about_net.about_udp.core;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress; public class UDPYou { public static void main(String[] args) throws IOException {
//创建子线程开启服务器,来接收消息
new Thread(new Runnable() {
@Override
public void run() {
try {
//创建服务端的Socket,并暴露端口号
DatagramSocket ds = new DatagramSocket(9999);
System.out.println("the guy 服务器已经开启,等待连接");
while (true) {
//接收发送过来的数据
byte[] bytes = new byte[1024];
DatagramPacket dp = new DatagramPacket(bytes, bytes.length); ds.receive(dp);
//从数据报包中取出数据
byte[] data = dp.getData();
int length = dp.getLength();
//取发送者的IP
String s = new String(data, 0, length);
System.out.println("Youzg:" + s);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}).start(); //在主线程给对方发消息
sendMsg(); } private static void sendMsg() {
try {
//创建客户端的socket
DatagramSocket ds = new DatagramSocket();
//创建键盘录入对象
BufferedReader bfr = new BufferedReader(new InputStreamReader(System.in));
while (true) {
System.out.println("请输入要发送消息:");
String s = bfr.readLine();
if (s.equals("byebye")) {
break;
}
byte[] bytes = s.getBytes();
//创建数据报包
DatagramPacket dp = new DatagramPacket(bytes, bytes.length, InetAddress.getLocalHost(), 8888);
//发送数据
ds.send(dp);
} //释放资源
ds.close();
} catch (IOException e) {
e.printStackTrace();
}
} }

那么,现在,本人来展示下聊天内容(运行结果):

首先是右转哥的聊天记录:



接下来是那位同学的聊天记录:



可以看到,在byebye前的对话都传达了!


(本人 网络编程 总集篇博文链接:https://www.cnblogs.com/codderYouzg/p/12419011.html)

详解 DatagramSocket类的更多相关文章

  1. unity3D游戏开发之详解Animation类和Animator类

    详解Animator类和Animation类 链接: http://wenku.baidu.com/link?url=SiaUYcdrNYjOYrWVDJSKGAYdJOntMTOhsVJtyBk2i ...

  2. 【python进阶】详解元类及其应用1

    前言 元类在python中是很重要的一部分,我将分两次去讲解元类及其应用,此篇为详解元类及其应用第一篇,下面开始今天的说明~~~ 1. 类也是对象 在⼤多数编程语⾔中,类就是⼀组⽤来描述如何⽣成⼀个对 ...

  3. 【python进阶】详解元类及其应用2

    前言 在上一篇文章[python进阶]详解元类及其应用1中,我们提到了关于元类的一些前置知识,介绍了类对象,动态创建类,使用type创建类,这一节我们将继续接着上文来讲~~~ 5.使⽤type创建带有 ...

  4. Unity3D - 详解Quaternion类(二)

    OK,不做引子了,接上篇Unity3D - 详解Quaternion类(一)走起! 四.Quaternion类静态方法 Quaternion中的静态方法有9个即:Angle方法.Dot方法.Euler ...

  5. Unity3D - 详解Quaternion类(一)

    一.简介 Quaternion又称四元数,由x,y,z和w这四个分量组成,是由爱尔兰数学家威廉·卢云·哈密顿在1843年发现的数学概念.四元数的乘法不符合交换律.从明确地角度而言,四元数是复数的不可交 ...

  6. Kotlin——最详解的类(class)的使用

    在任何一门面向对象编程的语言里,类(class)是非常基础.但也是非常重要的一项组成,通俗的说就是万般皆对象,而所说的对象就是我们生成的类.Kotlin也是如此,下面详细为大家介绍Kotlin中的类的 ...

  7. IOC和AOP使用扩展之AOP详解实现类

    摘要:   “Depend on yourself” is what nature says to every man.  Parents can help you. Teachers can hel ...

  8. 详解 Arrays类

    请关注本人博文--<详解 普通数组 -- Arrays类 与 浅克隆> Arrays类: 概述: 针对数组进行操作的工具类.它提供了对于数组的值的排序.查找等功能. 现在,本人来展示一下A ...

  9. 详解 Collections类

    (请关注 本人"集合总集篇"博文--<详解 集合框架>) 有的同学可能会有这样的疑问 -- Collections类也是集合吗? 答曰:非也! 那为什么要讲解这个类呢? ...

随机推荐

  1. MySql InnoDB中的锁研究

    # MySql InnoDB中的锁研究 ## 1.InnoDB中有哪些锁### 1. 共享和排他(独占)锁(Shared and Exclusive Locks) InnoDB实现标准的行级锁定,其中 ...

  2. Python电影数据分析

    数据说明:MovieLens数据集,它包含来自于943个用户以及精选的1682部电影的100K个电影打分.每个用户至少为20部电影打分,数据类型user id | item id | rating | ...

  3. 一文上手Tensorflow2.0(四)

    系列文章目录: Tensorflow2.0 介绍 Tensorflow 常见基本概念 从1.x 到2.0 的变化 Tensorflow2.0 的架构 Tensorflow2.0 的安装(CPU和GPU ...

  4. 用卷积神经网络和自注意力机制实现QANet(问答网络)

    欢迎大家关注我们的网站和系列教程:http://www.tensorflownews.com/ ,学习更多的机器学习.深度学习的知识! 在这篇文章中,我们将解决自然语言处理(具体是指问答)中最具挑战性 ...

  5. 2020年最新版Web前端学习路线图-前端小白入门必读-pink老师推荐

    Hello,大家好,相信很多学习前端的小伙伴,会有很多的疑惑: 我要学习那些技术? 我要到哪里去学习这些技术呢? 学习这些技术的目的对就业有什么帮助呢? 我学到什么程度可以胜任工作? ... 这里,p ...

  6. openssl与java(读取加密码的密钥)

    最近在研究java security方面的东西,java自带可以使用各种加密解密算法(rsa,dsa,des3,aes,md5...),但往往一些密钥是第三方给我们的,我们需要用java装载这些密钥然 ...

  7. sql MySQL5.7 安装 centos docker

    MySQL5.7 安装 1 . 普通安装 # 准备工作 停止以前的数据库并删除配置文件 systemctl stop mysqld rpm -e mysql-community-server-5.7. ...

  8. 如何在Linux下优雅的查询日志

    做为一名合格的Java后台开发 经常需要查询线上的日志,定位线上问题 所以熟练掌握日志查询的命令 可以使你更加迅速的定位错误日志位置,及时解决问题 在此,我将介绍几个自己工作中经常使用到的日志查询命令 ...

  9. C/C++知识总结 一 C/C++常识概述

    C/C++常识概述 程序与计算机语言 C/C++简介与发展 C/C++异同 C/C++编译特点 学习编程建议 程序与计算机语言 程序:是一组计算机能识别和执行.预先编好的一些指令操作合集. 计算机语言 ...

  10. 使用Pytorch在多GPU下保存和加载训练模型参数遇到的问题

    最近使用Pytorch在学习一个深度学习项目,在模型保存和加载过程中遇到了问题,最终通过在网卡查找资料得已解决,故以此记之,以备忘却. 首先,是在使用多GPU进行模型训练的过程中,在保存模型参数时,应 ...