详解 DatagramSocket类
(请观看本人博文 —— 《详解 网络编程》)
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类的更多相关文章
- unity3D游戏开发之详解Animation类和Animator类
		详解Animator类和Animation类 链接: http://wenku.baidu.com/link?url=SiaUYcdrNYjOYrWVDJSKGAYdJOntMTOhsVJtyBk2i ... 
- 【python进阶】详解元类及其应用1
		前言 元类在python中是很重要的一部分,我将分两次去讲解元类及其应用,此篇为详解元类及其应用第一篇,下面开始今天的说明~~~ 1. 类也是对象 在⼤多数编程语⾔中,类就是⼀组⽤来描述如何⽣成⼀个对 ... 
- 【python进阶】详解元类及其应用2
		前言 在上一篇文章[python进阶]详解元类及其应用1中,我们提到了关于元类的一些前置知识,介绍了类对象,动态创建类,使用type创建类,这一节我们将继续接着上文来讲~~~ 5.使⽤type创建带有 ... 
- Unity3D - 详解Quaternion类(二)
		OK,不做引子了,接上篇Unity3D - 详解Quaternion类(一)走起! 四.Quaternion类静态方法 Quaternion中的静态方法有9个即:Angle方法.Dot方法.Euler ... 
- Unity3D - 详解Quaternion类(一)
		一.简介 Quaternion又称四元数,由x,y,z和w这四个分量组成,是由爱尔兰数学家威廉·卢云·哈密顿在1843年发现的数学概念.四元数的乘法不符合交换律.从明确地角度而言,四元数是复数的不可交 ... 
- Kotlin——最详解的类(class)的使用
		在任何一门面向对象编程的语言里,类(class)是非常基础.但也是非常重要的一项组成,通俗的说就是万般皆对象,而所说的对象就是我们生成的类.Kotlin也是如此,下面详细为大家介绍Kotlin中的类的 ... 
- IOC和AOP使用扩展之AOP详解实现类
		摘要: “Depend on yourself” is what nature says to every man. Parents can help you. Teachers can hel ... 
- 详解 Arrays类
		请关注本人博文--<详解 普通数组 -- Arrays类 与 浅克隆> Arrays类: 概述: 针对数组进行操作的工具类.它提供了对于数组的值的排序.查找等功能. 现在,本人来展示一下A ... 
- 详解 Collections类
		(请关注 本人"集合总集篇"博文--<详解 集合框架>) 有的同学可能会有这样的疑问 -- Collections类也是集合吗? 答曰:非也! 那为什么要讲解这个类呢? ... 
随机推荐
- 解决 Mac Android Studio Gradle Sync 慢的问题
			1.启动Android Studio 2.从项目的 gradle/wrapper/gradle-wrapper.properties 目录中找到 distributionUrl 这个字段,查看后面对应 ... 
- Rasa Stack:创建支持上下文的人工智能助理和聊天机器人教程
			相关概念 Rasa Stack 是一组开放源码机器学习工具,供开发人员创建支持上下文的人工智能助理和聊天机器人: • Core = 聊天机器人框架包含基于机器学习的对话管理 • NLU = 用于自然语 ... 
- (note)从小白到产品经理之路
			学习了云课堂的产品课程,整理出部分笔记,以作备用参考,方便实际运用过程中查看巩固. 1.产品工具:Axure.mindmanager.viso.办公软件wps 2.产品人需要具备的品格 富有同理心,习 ... 
- Python python lamda 表达式
			'''关键字lambda表示匿名函数,冒号前面的x表示函数参数. 匿名函数有个限制,就是只能有一个表达式,不用写return,返回值就是该表达式的结果. 用匿名函数有个好处,因为函数没有名字,不必担心 ... 
- [codevs1227]草地排水<Dinic网络流最大流>
			题目链接:http://codevs.cn/problem/1993/ https://www.luogu.org/problemnew/show/P2740 之前一直都没去管网络流这算法,但是老师最 ... 
- 针对Kafka的centos系统参数优化
			TCP网络优化 sudo vim /etc/sysctl.conf vm.max_map_count=655360net.core.rmem_default=262144net.core.rmem_m ... 
- 对oracle里面clob字段里面xml的增删改查学习
			这段时间,我使用系统表里面有clob字段里面存放的xml信息,我们如何对xml进行增删改查操作呢,自己参考了很多也学到很多,给大家分享一下 首先我们先建测试表 CREATE TABLE EFGP_23 ... 
- Redis对象——列表(List)
			列表(list)类型是用来存储多个有序的字符串,列表中的每个字符串称为元素(element),一个列表最多可以存储232-1个元素.在Redis中,可以对列表两端插入(push)和弹出(pop),还可 ... 
- 1021 Deepest Root (25 分)
			A graph which is connected and acyclic can be considered a tree. The height of the tree depends on t ... 
- 完整微信小程序授权登录页面教程
			完整微信小程序授权登录页面教程 1.前言 微信官方对getUserInfo接口做了修改,授权窗口无法直接弹出,而取而代之是需要创建一个button,将其open-type属性绑定getUseInfo方 ... 
