javaudp防阻塞

Java中基于UDP的非阻塞编程

configureBloging(false)

然后注册监视器,selector.open();

得到句柄;selectionKey key=(SelectionKey)selector.selected();

javaudp防阻塞

java udp 请求会阻塞吗

java中UDP通信,两边都接收不了,都是阻塞状态,要先运行UdpServer2,因为它是服务器

JAVA问题 UDP协议中的端口问题

在Java中操纵UDP

使用位于JDK中Java.net包下的DatagramSocket和DatagramPacket类,可以非常方便地控制用户数据报文。

在描述它们之前,必须了解位于同一个位置的InetAddress类。InetAddress实现了Java.io. Serializable接口,不允许继承。它用于描述和包装一个Internet IP地址,通过三个方法返回InetAddress实例:

getLocalhost():返回封装本地地址的实例。

getAllByName(String host):返回封装Host地址的InetAddress实例数组。

getByName(String host):返回一个封装Host地址的实例。其中,Host可以是域名或者是一个合法的IP地址。

DatagramSocket类用于创建接收和发送UDP的Socket实例。和Socket类依赖SocketImpl类一样,DatagramSocket类的实现也依靠专门为它设计的DatagramScoketImplFactory类。DatagramSocket类有3个构建器:

DatagramSocket():创建实例。这是个比较特殊的用法,通常用于客户端编程,它并没有特定监听的端口,仅仅使用一个临时的。

DatagramSocket(int port):创建实例,并固定监听Port端口的报文。

DatagramSocket(int port, InetAddress localAddr):这是个非常有用的构建器,当一台机器拥有多于一个IP地址的时候,由它创建的实例仅仅接收来自LocalAddr的报文。

值得注意的是,在创建DatagramSocket类实例时,如果端口已经被使用,会产生一个SocketException的异常抛出,并导致程序非法终止,这个异常应该注意捕获。DatagramSocket类最主要的方法有4个:

Receive(DatagramPacket d):接收数据报文到d中。receive方法产生一个“阻塞”。

Send(DatagramPacket d):发送报文d到目的地。

SetSoTimeout(int timeout):设置超时时间,单位为毫秒。

Close():关闭DatagramSocket。在应用程序退出的? 焙颍?ǔ;嶂鞫?头抛试矗?乇誗ocket,但是由于异常地退出可能造成资源无法回收。所以,应该在程序完成时,主动使用此方法关闭Socket,或在捕获到异常抛出后关闭Socket。

“阻塞”是一个专业名词,它会产生一个内部循环,使程序暂停在这个地方,直到一个条件触发。

DatagramPacket类用于处理报文,它将Byte数组、目标地址、目标端口等数据包装成报文或者将报文拆卸成Byte数组。应用程序在产生数据包是应该注意,TCP/IP规定数据报文大小最多包含65507个,通常主机接收548个字节,但大多数平台能够支持8192字节大小的报文。DatagramPacket类的构建器共有4个:

DatagramPacket(byte[] buf, int length, InetAddress addr, int port):从Buf数组中,取出Length长的数据创建数据包对象,目标是Addr地址,Port端口。

DatagramPacket(byte[] buf, int offset, int length, InetAddress address, int port):从Buf数组中,取出Offset开始的、Length长的数据创建数据包对象,目标是Addr地址,Port端口。

DatagramPacket(byte[] buf, int offset, int length):将数据包中从Offset开始、Length长的数据装进Buf数组。

DatagramPacket(byte[] buf, int length):将数据包中Length长的数据装进Buf数组。

DatagramPacket类最重要的方法就是getData()了,它从实例中取得报文的Byte数组编码。

关于java UDP方面的一些问题

我把我的代码借鉴给你..不知道能不能够帮助你..!!!自己原创的

UDPServer.java:

import java.net.*;

import java.util.*;

public class UDPServer extends Thread {

private static final int PORT=10000 ;

private static final int DATA_LEN=2046 ;

private byte []buff =new byte[DATA_LEN];

UDPClient.java:

import java.net.*;

import java.util.*;

public class UDPClient extends Thread {

private static final int PORT=10000 ;

private static final int DATA_LEN=2046 ;

private byte []buff =new byte[DATA_LEN];

private DatagramSocket socket ;

private DatagramPacket inpacket =new DatagramPacket(buff,buff.length);

private DatagramPacket outpacket ;

public void run() {

int i =0;

try{

socket=new DatagramSocket();

outpacket =new DatagramPacket(new byte[0] ,0,

InetAddress.getByName(“127.0.0.1”),PORT);

Scanner sc =new Scanner(System.in);

while(sc.hasNextLine()){

byte [] buff1 =sc.nextLine().getBytes();

outpacket.setData(buff1);

socket.send(outpacket);

socket.receive(inpacket);

System.out.println(new String(buff,0,inpacket.getLength()));

}

}catch(Exception e){

e.printStackTrace();

}

}

public static void main(String []args){

new UDPClient().start();

}

/*public UDPServer (DatagramSocket socket ,DatagramPacket inpacket,

DatagramPacket outpacket) {

this.socket = socket ;

this.inpacket = inpacket ;

this.outpacket = outpacket ;

}*/

};

MulticastSocketTest.java:

import java.awt.*;

import java.net.*;

import java.io.*;

import java.util.*;

//让该类实现Runnable接口,该类的实例可作为线程的target

public class MulticastSocketTest implements Runnable

{

//使用常量作为本程序的多点广播IP地址

private static final String BROADCAST_IP

= “230.0.0.1”;

//使用常量作为本程序的多点广播目的的端口

public static final int BROADCAST_PORT = 30000;

//定义每个数据报的最大大小为4K

private static final int DATA_LEN = 4096;

//定义本程序的MulticastSocket实例

private MulticastSocket socket = null;

private InetAddress broadcastAddress = null;

private Scanner scan = null;

//定义接收网络数据的字节数组

byte[] inBuff = new byte[DATA_LEN];

//以指定字节数组创建准备接受数据的DatagramPacket对象

private DatagramPacket inPacket =

new DatagramPacket(inBuff , inBuff.length);

//定义一个用于发送的DatagramPacket对象

private DatagramPacket outPacket = null;

public void init()throws IOException

{

try

{

//创建用于发送、接收数据的MulticastSocket对象

//因为该MulticastSocket对象需要接收,所以有指定端口

socket = new MulticastSocket(BROADCAST_PORT);

broadcastAddress = InetAddress.getByName(BROADCAST_IP);

//将该socket加入指定的多点广播地址

socket.joinGroup(broadcastAddress);

//设置本MulticastSocket发送的数据报被回送到自身

socket.setLoopbackMode(false);

//初始化发送用的DatagramSocket,它包含一个长度为0的字节数组

outPacket = new DatagramPacket(new byte[0] , 0 ,

broadcastAddress , BROADCAST_PORT);

//启动以本实例的run()方法作为线程体的线程

new Thread(this).start();

//创建键盘输入流

scan = new Scanner(System.in);

//不断读取键盘输入

while(scan.hasNextLine())

{

//将键盘输入的一行字符串转换字节数组

byte[] buff = scan.nextLine().getBytes();

//设置发送用的DatagramPacket里的字节数据

outPacket.setData(buff);

//发送数据报

socket.send(outPacket);

}

}

finally

{

socket.close();

}

}

public void run()

{

try

{

while(true)

{

//读取Socket中的数据,读到的数据放在inPacket所封装的字节数组里。

socket.receive(inPacket);

//打印输出从socket中读取的内容

System.out.println(“聊天信息:” + new String(inBuff , 0 ,

inPacket.getLength()));

}

}

//捕捉异常

catch (IOException ex)

{

ex.printStackTrace();

try

{

if (socket != null)

{

//让该Socket离开该多点IP广播地址

socket.leaveGroup(broadcastAddress);

//关闭该Socket对象

socket.close();

}

System.exit(1);

}

catch (IOException e)

{

e.printStackTrace();

}

}

}

public static void main(String[] args)

throws IOException

{

new MulticastSocketTest().init();

}

}

private DatagramSocket socket ;

private DatagramPacket inpacket ;

private DatagramPacket outpacket ;

public void run() {

int i =0;

try{

socket=new DatagramSocket(PORT);

while(true){

inpacket=new DatagramPacket(buff,buff.length);

socket.receive(inpacket) ;

System.out.println(new String(buff,0,inpacket.getLength()));

byte [] sedData =new String(“数据信息:”+i).getBytes();

outpacket =new DatagramPacket(sedData,sedData.length,inpacket.getSocketAddress());

socket.send(outpacket);

i++ ;

}

}catch(Exception e){

e.printStackTrace();

}

}

public static void main(String []args){

new UDPServer().start();

}

/*public UDPServer (DatagramSocket socket ,DatagramPacket inpacket,

DatagramPacket outpacket) {

this.socket = socket ;

this.inpacket = inpacket ;

this.outpacket = outpacket ;

}*/

};

本文来自投稿,不代表【】观点,发布者:【

本文地址: ,如若转载,请注明出处!

举报投诉邮箱:253000106@qq.com

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2024年3月28日 11:43:09
下一篇 2024年3月28日 11:50:17

相关推荐

  • javaudp组播,javaudp组播发送

    组播协议是基于UDP协议传输,还是TCP协议 首先看TCP/UDP的英文缩写可以知道,他们都有一个P字母,也就是协议的英文,说明他们都是表示一种协议的规则。 传输层:主要使网络程序进行通信,在进行网络通信时,可以采用TCP协议,也可以采用UDP协议。应用层:主要负责应用程序的协议,例如HTTP协议、FTP协议等。 一般是TCP协议,可以确保传输的安全性,会帮…

    2024年5月20日
    4100
  • javaudp文件,java中udp

    java中UDP文件传输怎么实现? 1、使用UDP协议进行文件传输不能保证正确性,很容易发生丢包的情况。建议在进行较大文件传输的时候使用TCP的Socket和ServerSocket类进行传输。 2、UDP协议 用户数据报协议UDP(User Datagram Protocol)是无连接传输层协议,提供应用程序之间传送数据报的基本机制。UDP报文的格式 每个…

    2024年5月17日
    4100
  • javaudp心跳程序,java socket 心跳

    将client.java改写成基于UDP协议的通信程序 UDP,即User Datagram Protocol(用户数据报协议),传输层协议。 您将学习如何使用Java编程语言进行UDP协议的开发,包括UDP套接字编程、数据报的发送和接收、错误处理等。此外,书中还讲解了与UDP协议相关的一些高级主题,如多播通信和DatagramChannel等。 Udp是面…

    2024年5月9日
    4200
  • javaudp组包(Javaudp)

    今天给各位分享javaudp组包的知识,其中也会对Javaudp进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧! 本文目录一览: 1、UDP数据包是什么?2、java怎么实现JSON打包UDP3、一个简单java实现udp通信 UDP数据包是什么? UDP协议的全称是用户数据报,在网络中它与TCP协议一样用于处理数据包。在OSI模型中,…

    2024年4月4日
    5600
  • javaudp通信(java udp通信)

    本篇文章给大家谈谈javaudp通信,以及java udp通信对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。 本文目录一览: 1、java udp通信中文乱码2、javaudp一直传输怎么回事3、java和C#之间UDP通信问题4、java UDP通信中十六进制的接收与发送5、TCP和UDP通信有什么区别 如何分别用java实现? java udp通…

    2024年4月2日
    4800
  • javaudp多路分解

    TCP的多路复用和分解 1、首部包括源端口号和目的端口号,它用于多路复用/多路分解来自或送至上层应用的数据。另外,TCP首部也包括校验和字段。报文段首部还包含下列字段: 32比特的序号字段和32比特的确认号字段。这些字段被TCP发送方和接收方用来实现可靠数据传输服务。 2、全双工操作: TCP 进程能够同时发送和接收包。TCP 中的多路技术:大量同时发生的上…

    2024年3月20日
    4400
  • javaudp中文

    Java语言应用中实现UDP协议编程的方法? 1、使用DatagramPacket的方法,提取数据。关闭资源。 2、在java中想要实现上述两种协议通信,可采用socket建立连接,socket可以理解为码头,其实是套接字,这里简单说下,就好比两个城市运输货物,通过码头走货一样。 3、数据报套接字:使用传输层UDP协议 UDP,即User Datagram …

    2024年3月19日
    4200
  • javaudp外网通信 – java udp tcp

    java中UDP文件传输怎么实现? 使用UDP协议进行文件传输不能保证正确性,很容易发生丢包的情况。建议在进行较大文件传输的时候使用TCP的Socket和ServerSocket类进行传输。 我记忆中可靠的传输应该类似TCP的三次握手:发送方向接收方发送一个随机数。接收方收到随机数后将其+1,再回传给发送方。 UDP协议 用户数据报协议UDP(User Da…

    2024年3月18日
    4200
  • javaudp发送文件-java post发送文件

    如何用java实现UDP的可靠传输 发送方向接收方发送一个随机数。接收方收到随机数后将其+1,再回传给发送方。发送方收到随机数判断其是否被+1,如果是代表双方的传递线路是通畅的,可以正式开始传送数据。 \x0d\x0a在java中想要实现上述两种协议通信,可采用socket建立连接,socket可以理解为码头,其实是套接字,这里简单说下,就好比两个城市运输货…

    2024年3月17日
    3700
  • javaudp服务器设计-java服务器搭建

    java中UDP文件传输怎么实现? 发送方向接收方发送一个随机数。接收方收到随机数后将其+1,再回传给发送方。发送方收到随机数判断其是否被+1,如果是代表双方的传递线路是通畅的,可以正式开始传送数据。 } 将这个函数的返回值用一个静态变量保存起,以备我们在日后UDPchat.java上使用,同时我们将其放入到用户登录时的USer表中port列下。 \x0d\…

    2024年3月16日
    4800

发表回复

登录后才能评论



关注微信