Java 日看一类(60)之net包中的AbstractPlainDatagramSocketImpl类

网络编程之三:java.net包的DatagramSocket和DatagramPacket 本博文主要简述TCP/UDP的比较和应用场景,继而java.net包下基于DatagramSocket/DatagramPacket的编程和源码分析 TCP与UDP作为传输层两个重要的协议,得到广泛的使用 TCP 1、面向连接,速度较慢,证明:连接双方的一方主动断开连接之后,另一方的recieve()会立即作出响应 2、面向字节流,虽然应用程序和TCP的交互是一次一个数据块(大小不等),但TC 阅读详情

该类引入了如下包:

import java.io.FileDescriptor;
import java.io.IOException;
import java.security.AccessController;
import sun.net.ResourceManager;


该类继承自DatagramSocketImpl类

该类不是公共类



该类的类头注释如下:

/**
 * Abstract datagram and multicast socket implementation base class.
 * Note: This is not a public class, so that applets cannot call
 * into the implementation directly and hence cannot bypass the
 * security checks present in the DatagramSocket and MulticastSocket
 * classes.
 *
 * @author Pavani Diwanji
 */

大意如下:

该类是数据报和组播的基础实现类。

注意:该类不是公共类,所以applets不能直接调用该实现并且因此不能避过在DatagramSocket和MulticastSocket的即时安全性检查



该类含有如下的成员变量:

超时记录(等ack

int timeout = 0;

连接状态

boolean connected = false;

服务类型

private int trafficClass = 0;

目的地址

protected InetAddress connectedAddress = null;

目的端口

private int connectedPort = -1;

本地主机名

private static final String os = AccessController.doPrivileged(//跳过权限检查
    new sun.security.action.GetPropertyAction("os.name")
);

检测连接是否被禁用(看主机名里是不是有OS X,我本人用的Mac os,所以检测的是OS X),如果为false,native函数connect不能调用

private final static boolean connectDisabled = os.contains("OS X");



该类含有如下的成员方法:

默认构造函数

protected synchronized void create() throws SocketException {
    ResourceManager.beforeUdpCreate();//资源管理器检查创建UDP的资源
    fd = new FileDescriptor();//创建文件描述符
    try {
        datagramSocketCreate();//尝试创建DatagramSocket
    } catch (SocketException ioe) {
        ResourceManager.afterUdpClose();//出异常关闭的时候也需要进行资源检查,释放资源
        fd = null;
        throw ioe;
    }
}

绑定本地端口

protected synchronized void bind(int lport, InetAddress laddr)
    throws SocketException {
    bind0(lport, laddr);
}

绑定本地端口(native

protected abstract void bind0(int lport, InetAddress laddr)
    throws SocketException;

发送数据报包(需要后续完成,

protected abstract void send(DatagramPacket p) throws IOException;

连接远端的数据报套接字

protected void connect(InetAddress address, int port) throws SocketException {
    connect0(address, port);
    connectedAddress = address;
    connectedPort = port;
    connected = true;
}

断开已有的连接

protected void disconnect() {
    disconnect0(connectedAddress.holder().getFamily());
    connected = false;
    connectedAddress = null;
    connectedPort = -1;
}

窥探包来源(参数就是包来源,不是很懂,等到后面看到该类实例应该就清楚了,返回值肯定是IP地址一类的

protected abstract int peek(InetAddress i) throws IOException;

窥探包来源(返回值是包来源

protected abstract int peekData(DatagramPacket p) throws IOException;

接收数据报

protected synchronized void receive(DatagramPacket p)
    throws IOException {
    receive0(p);
}

接收数据报(native

protected abstract void receive0(DatagramPacket p)
    throws IOException;

设置发包过期时间(ttl

protected abstract void setTimeToLive(int ttl) throws IOException;

返回设置的过期时间(int

protected abstract int getTimeToLive() throws IOException;

设置发包过期时间(emmm,参数是byte类

protected abstract void setTTL(byte ttl) throws IOException;

返回设置的过期时间(byte

protected abstract byte getTTL() throws IOException;

加入组播团体

protected void join(InetAddress inetaddr) throws IOException {
    join(inetaddr, null);
}

离开组播团体

protected void leave(InetAddress inetaddr) throws IOException {
    leave(inetaddr, null);
}

加入组播团体(参数不同

protected void joinGroup(SocketAddress mcastaddr, NetworkInterface netIf)
    throws IOException {
    if (mcastaddr == null || !(mcastaddr instanceof InetSocketAddress))
        throw new IllegalArgumentException("Unsupported address type");
    join(((InetSocketAddress)mcastaddr).getAddress(), netIf);
}

加入组播团体(基础方法

protected abstract void join(InetAddress inetaddr, NetworkInterface netIf)
    throws IOException;

离开组播团体

protected void leaveGroup(SocketAddress mcastaddr, NetworkInterface netIf)
    throws IOException {
    if (mcastaddr == null || !(mcastaddr instanceof InetSocketAddress))
        throw new IllegalArgumentException("Unsupported address type");
    leave(((InetSocketAddress)mcastaddr).getAddress(), netIf);
}

基础方法

protected abstract void leave(InetAddress inetaddr, NetworkInterface netIf)
    throws IOException;

关闭套接字

protected void close() {
    if (fd != null) {//文件描述符标志该套接字状态
        datagramSocketClose();
        ResourceManager.afterUdpClose();
        fd = null;
    }
}

判定当前套接字状态

protected boolean isClosed() {
    return (fd == null) ? true : false;
}

最终操作(关闭

protected void finalize() {
    close();
}

设置操作权限(object 根据设置操作不同而不同,该方法主要是检查,设置封装在另一个方法里

public void setOption(int optID, Object o) throws SocketException {
    if (isClosed()) {//检测当前套接字是否关闭
        throw new SocketException("Socket Closed");
    }
    switch (optID) {//常量声明在父类
       /* check type safety b4 going native.  These should never
        * fail, since only java.Socket* has access to
        * PlainSocketImpl.setOption().
        */
    case SO_TIMEOUT://设置超时
        if (o == null || !(o instanceof Integer)) {
            throw new SocketException("bad argument for SO_TIMEOUT");
        }
        int tmp = ((Integer) o).intValue();
        if (tmp < 0)
            throw new IllegalArgumentException("timeout < 0");
        timeout = tmp;
        return;
    case IP_TOS://IP服务类型设置
        if (o == null || !(o instanceof Integer)) {
            throw new SocketException("bad argument for IP_TOS");
        }
        trafficClass = ((Integer)o).intValue();
        break;
    case SO_REUSEADDR://地址端口重用
        if (o == null || !(o instanceof Boolean)) {
            throw new SocketException("bad argument for SO_REUSEADDR");
        }
        break;
    case SO_BROADCAST://设置广播
        if (o == null || !(o instanceof Boolean)) {
            throw new SocketException("bad argument for SO_BROADCAST");
        }
        break;
    case SO_BINDADDR://绑定地址
        throw new SocketException("Cannot re-bind Socket");
    case SO_RCVBUF://接收和发送的缓冲大小
    case SO_SNDBUF:
        if (o == null || !(o instanceof Integer) ||
            ((Integer)o).intValue() < 0) {
            throw new SocketException("bad argument for SO_SNDBUF or " +
                                      "SO_RCVBUF");
        }
        break;
    case IP_MULTICAST_IF://组播设置
        if (o == null || !(o instanceof InetAddress))
            throw new SocketException("bad argument for IP_MULTICAST_IF");
        break;
    case IP_MULTICAST_IF2:
        if (o == null || !(o instanceof NetworkInterface))
            throw new SocketException("bad argument for IP_MULTICAST_IF2");
        break;
    case IP_MULTICAST_LOOP:
        if (o == null || !(o instanceof Boolean))
            throw new SocketException("bad argument for IP_MULTICAST_LOOP");
        break;
    default:
        throw new SocketException("invalid option: " + optID);
    }
    socketSetOption(optID, o);
}

获得具体设置信息

public Object getOption(int optID) throws SocketException {
    if (isClosed()) {
        throw new SocketException("Socket Closed");
    }

    Object result;

    switch (optID) {
        case SO_TIMEOUT:
            result = new Integer(timeout);
            break;

        case IP_TOS:
            result = socketGetOption(optID);
            if ( ((Integer)result).intValue() == -1) {
                result = new Integer(trafficClass);
            }
            break;

        case SO_BINDADDR:
        case IP_MULTICAST_IF:
        case IP_MULTICAST_IF2:
        case SO_RCVBUF:
        case SO_SNDBUF:
        case IP_MULTICAST_LOOP:
        case SO_REUSEADDR:
        case SO_BROADCAST:
            result = socketGetOption(optID);
            break;

        default:
            throw new SocketException("invalid option: " + optID);
    }

    return result;
}

创建数据报套接字

protected abstract void datagramSocketCreate() throws SocketException;

关闭数据包套接字

protected abstract void datagramSocketClose();

具体设置

protected abstract void socketSetOption(int opt, Object val)
    throws SocketException;

具体设置获得

protected abstract Object socketGetOption(int opt) throws SocketException;

连接至目的地址和端口

protected abstract void connect0(InetAddress address, int port) throws SocketException;

断开连接

protected abstract void disconnect0(int family);

返回连接禁用状态

protected boolean nativeConnectDisabled() {
    return connectDisabled;
}

检测数据有效性(猜测是进行校验码校验

abstract int dataAvailable();



该类含有如下的静态代码块:

static {
    java.security.AccessController.doPrivileged(
        new java.security.PrivilegedAction<Void>() {//加载运行时的net库
            public Void run() {
                System.loadLibrary("net");
                return null;
            }
        });
}



该类对于学过一些计算机网络知识的人来说比较好理解,对于那些名词(比如,组播、广播、ttl等等)和操作设置都应该会有大致的印象。对于没有学过计算机网络的人而言可能对于这些名词的理解会比较吃力,推荐先去补充基础理论知识。

java.net.SocketException Connection reset 解决方法 立即下载

相关推荐

3D Slicer中文教程(三)—数据加载及保存方式

1.打开数据与保存数据 (1)打开数据 ——可以将数据拖拽到3D Slicer应用窗口或者从菜单栏工具栏打开。 ——多种方式加载大量数据。 有关DICOM数据,请参阅DICOM模块文档。 对于几乎所有其他(包括场景),您可以使用添加数据对话框。 有关支持的数据格式的列表,请参阅此列表。 请注意,仅部分支持列出的某些格式。 ——对于一些更复杂的格式(特别是DWI),建议首先使用DICOM到n...

weixin_33676492的博客 5539

java使用DatagramSocket和DatagramPacket进行通信

一、DatagramSocket DatagramSocket是使用UDP协议的Socket,它的作用是接收和发送数据包,但是它本身并不能产生IO流 1、创建DatagramSocket对象 DatagramSocket() //创建一个数据包套接字,绑定到本机上任意一个可用的端口 DatagramSocket(DatagramSocketImpl) //创建一个绑定的数据报套接字, 与指定的datagramsocketimpl相关(一般不使用) DatagramSocket(SocketAdd.

qq_38345598的博客 5910

【数学模型】灰色关联分析

数学模型-灰色关联分析

suic009的博客 1万+

DatagramChannelImpl 解析四(地址绑定,关闭通道等)

og/2373281[/url] DatagramChannelImpl 解析三(多播):[url]http://donald-draper.iteye.com/blog/2373507[/url] [size=medium][b]引言:[/b][/size] 前面一篇文章我们看了报文通道加入多播组,阻塞和解除阻塞源地址报文等方法,先来回顾一下, join(报文通道加入多播组)方法,首先检查加入的多播组地址是否正确,然后校验源地址,检查多播成员关系注册器中是否存在多播地址为inetaddre

Donald_Draper的专栏 567

【低空经济】低空无人机公共测试场与验证基地设计方案

公共测试场与验证基地是为低空无人机相关技术的研发、测试与应用提供一个系统性的平台。在无人机产业蓬勃发展的背景下,建设一个配备完善、功能齐全的公共测试场与验证基地显得尤为重要。该基地不仅可以作为无人机的测试和验证场地,还可以为相关企业、科研机构以及政府部门提供技术支持和服务。因此,为此基地的设计方案必须综合考虑功能性、安全性、灵活性与可持续性等多方面的因素。首先,公共测试场需划分为多个专用区域,以便满足不同类型无人机的测试需求。这包括低空飞行区域、紧急着陆区、操控模拟区和监测与数据采集区等。

2502_92579126的博客 1603

深入解析CRC-16校验算法及其Verilog硬件实现

本文深入解析了CRC-16校验算法的原理及其在Verilog中的硬件实现方法。从基础的模2除法到串行和并行实现方案,详细介绍了LFSR结构、状态转移分析以及工业应用中的优化技巧。通过实际案例和性能对比,帮助开发者理解如何选择适合的CRC实现方案,确保数据传输的可靠性。

yolo5detector的博客 322

【JAVA网络编程】JAVA使用UDP实现简单SOCKET通信实例

文章目录介绍测试用例 客户端使用UDP发送字符串服务端客户端Datagram Packet类中常用API的使用测试用例 使用上述API发送数据UDP单播 介绍 在使用UDP实现Socket通信时,服务端与客户端都是使用DatagramSocket类,传输的数据要存放在DatagramPacket类中。 DatagramSocket类表示用来发送和接收数据报包的套接字。数据报套接字是包投递服务的发送或接收点。每个在数据报套接字上发送或接收的包都是单独编址和路由的。从一台机器发送到另一台机器的多个包可能选择不同

qq_41358574的博客 6031

Android:Google三方库之Adjust集成详细步骤

Android为APP添加google adjust功能

学习就是我的个性 4477

W/System.err:at java.net.PlainDatagramSocketImpl.bind(PlainDatagramSocketImpl.java:68)问题解决方法

W/System.err:at java.net.PlainDatagramSocketImpl.bind(PlainDatagramSocketImpl.java:68)问题解决方法

心若向阳,无谓悲伤的博客 2160

TDISP(TEE Device Interface Security Protocol)软件操作流程

/ 1. SPDM会话相关定义(🔶1-37、🔶1-187)// SPDM会话ID// AES-256-GCM加密密钥(TDISP要求)// 初始向量// 会话是否激活// 2. IDE流配置(🔶1-52、🔶1-625)// IDE流ID// 4个子流的AES密钥(覆盖所有子流类型)// 密钥是否已配置// 3. TDI状态与配置(🔶1-207、🔶1-210)TDI_CONFIG_UNLOCKED = 0, // 初始配置态。

inquisiter 1436

Win32逆向必备:X32dbg中窗口句柄查看与消息断点的高级用法

本文深入探讨了X32dbg在Win32逆向工程中的高级应用,重点解析窗口句柄查看与消息断点的实战技巧。通过MFC程序逆向案例,详细介绍了如何利用窗口句柄层次结构、条件断点设置及消息映射表定位等技术,快速捕获关键业务逻辑,提升逆向分析效率。

nginx7reverse的博客 1017

记一次连接池耗尽页面假死

web项目,接入500设备的管理,设备不定时主动推送日志。

qq_21732851的博客 192

Cesium圆形波纹/雷达扩散效果扩展类CircleWaveMaterialProperty

本文是基于原创内容进行部分修改,原文出处:https://blog.csdn.net/chudage11/article/details/101632482 SuperMapCesium支持该类似扩展类,以下是原生Cesium调用扩展类CircleWaveMaterialProperty说明 1.扩展类CircleWaveMaterialProperty.js import*asCesiumfrom'cesium' varCircleWaveMaterial={ Circl...

一碗老面的博客 3001

Java 日看一类(61)AbstractPlainSocketImpl类

该类继承自SocketImpl类该类引入了如下包:import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.FileDescriptor; import sun.net.ConnectionResetException; import sun.net.Ne...

github_37666068的博客 1691

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

笔记:Java DatagramSocket中的端口和DatagramPacket中的端口

在Java中进行Socket通信,总是有两个地方可以指定duank 终于悟出了

wukong1981的专栏 5231

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

DatagramSocket API 详解

此类表示用来发送和接收数据报包的套接字。 数据报套接字是包投递服务的发送或接收点。每个在数据报套接字上发送或接收的包都是单独编址和路由的。从一台机器发送到另一台机器的多个包可能选择不同的路由,也可能按不同的顺序到达。 在 DatagramSocket 上总是启用 UDP 广播发送。为了接收广播包,应该将 DatagramSocket 绑定到通配符地址。在某些实现中,将 DatagramSock

sunny_sailor的专栏 3387

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Tomcat启动报错java.net.AbstractPlainSocketImpl

Caused by: Unable to load configuration. - Class: java.net.AbstractPlainSocketImpl File: AbstractPlainSocketImpl.java Method: connect Line: 158 - java/net/AbstractPlainSocketImpl.java...

weixin_30436891的博客 688

java 获取udp地址,UDP地址已被使用?

I am following the UDP tutorials at http://docs.oracle.com/javase/tutorial/networking/datagrams/broadcasting.html ,I have copied all the code and compiled it, now If I compile the client first and the...

weixin_28692153的博客 284

java.lang.UnsatisfiedLinkError解决方法汇集(转载)

1、请查看控制台的错误信息 a:如果控制台的消息是类似 java.lang.UnsatisfiedLinkError: no MRChkLib in java.library.path,Error loading library MRChkLib 这样的错误信息,那么是因为MRChkLib.dll没有拷贝到windows的System32目录下. (MRChkLib.dll是加密锁的JAVA接...

GET知识不迷路,点赞评论加关注! 4万+

地址已在使用 java_java – UDP地址已经在使用?

我在http://docs.oracle.com/javase/tutorial/networking/datagrams/broadcasting.html关注UDP教程,我已经复制了所有代码并编译了它,现在如果我先编译客户端然后再编译服务器,服务器会在控制台中打印出来Exception in thread "main" java.net.BindException: Address alrea...

weixin_42362048的博客 203

网络通信中常见问题

1.  IP  Port 1.有关IP 的unknowhost  我还没遇到这样的情况,自己模拟也没模拟出来,主要不是很明白这个UnKnowHost 异常,我看了java.net.Socket.class 中的源码,创建对象是,会抛出这个异常,描述:  if the IP address of the host could not be determined . 我 google 翻...

lanyef的专栏 541

java hdfs kerberos 认证超时 Receive timed out

安装需要一些依赖:比如thrift,sasl,等等 Command ""D:\Program Files\PYTHON\python.exe" -u -c "import setuptools, tokenize;__file__='c:\\users\\41590\\appdata\\local\\tem...

weixin_42130167的博客 2709

【转载】struts应用在断网情况下启动报错解决办法(java/net/AbstractPlainSocketImpl.java:178:-1)...

无意间struts应用在有网络的情况下启动正常,在断网的情况下启动报错,报错代码如下图所示: SEVERE: Exception starting filter struts2 Class: java.net.AbstractPlainSocketImpl File: AbstractPlainSocketImpl.java Method: connect Line: 17...

aed97713的博客 308

java.net

java.net 一些核心方法调用路径 这里以 PlainSocketImpl 和 PlainDatagramSocketImpl 为例子 Socket Socket(String host, int port) PlainSocketImpl.native void socketCreate connect(SocketAddress endpoint) PlainSock...

u013244720的专栏 869
上一篇: Java 日看一类(59)之 IO包中的WriteAbortedException和UTFDataFormatException异常类
下一篇: Java 日看一类(61)AbstractPlainSocketImpl类
wyf95278
博客等级 码龄10年 38粉丝 71原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值