×

【Java 基础篇】Java UDP通信详解_java udp协议

前端技术网 前端技术网 发表于2024-01-29 01:03:19 浏览1563 评论0

抢沙发发表评论

一、关于java UDP方面的一些问题

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

UDPServer.java:

【Java 基础篇】Java UDP通信详解_java udp协议

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];

【Java 基础篇】Java UDP通信详解_java udp协议

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;

}*/

};

二、java udp发送和接收端口问题

你是在同一台电脑上测试吧,那肯定不行的,因为一个端口只能给一个程序使用,而你发送要用到1000端口,接收又要用到1000端口,所以肯定是冲突的,但是你用2台电脑测试就不会了。同样,你先建一个1000端口的server,你再建一个1000端口的server同样会报错。ps:你在开了tomcat的情况下,开一个8080的server试试,一样会报错,这是常识。

三、java中UDP,DCP TCP与IP的区别是什么

不知道楼主是什么意思,UDP,DCP TCP与IP都是传输协议吧,那和Java有什么关系呢?

1. IP

是网络层中最重要的协议。

IP层接收由更低层(网络接口层例如以太网设备驱动程序)发来的数据包,并把该数据包发送到更高层---TCP或UDP层;相反,IP层也把从TCP或UDP层接收来的数据包传送到更低层。IP数据包是不可靠的,因为IP并没有做任何事情来确认数据包是按顺序发送的或者没有被破坏。IP数据包中含有发送它的主机的地址(源地址)和接收它的主机的地址(目的地址)。

高层的TCP和UDP服务在接收数据包时,通常假设包中的源地址是有效的。也可以这样说,IP地址形成了许多服务的认证基础,这些服务相信数据包是从一个有效的主机发送来的。IP确认包含一个选项,叫作IP source routing,可以用来指定一条源地址和目的地址之间的直接路径。对于一些TCP和UDP的服务来说,使用了该选项的IP包好象是从路径上的最后一个系统传递过来的,而不是来自于它的真实地点。这个选项是为了测试而存在的,说明了它可以被用来欺骗系统来进行平常是被禁止的连接。那么,许多依靠IP源地址做确认的服务将产生问题并且会被非法入侵。

2. TCP

如果IP数据包中有已经封好的TCP数据包,那么IP将把它们向‘上’传送到TCP层。TCP将包排序并进行错误检查,同时实现虚电路间的连接。TCP数据包中包括序号和确认,所以未按照顺序收到的包可以被排序,而损坏的包可以被重传。

TCP将它的信息送到更高层的应用程序,例如Telnet的服务程序和客户程序。应用程序轮流将信息送回TCP层,TCP层便将它们向下传送到IP层,设备驱动程序和物理介质,最后到接收方。

面向连接的服务(例如Telnet、FTP、rlogin、X Windows和SMTP)需要高度的可靠性,所以它们使用了TCP。DNS在某些情况下使用TCP(发送和接收域名数据库),但使用UDP传送有关单个主机的信息。

3.UDP

UDP与TCP位于同一层,但对于数据包的顺序错误或重发。因此,UDP不被应用于那些使用虚电路的面向连接的服务,UDP主要用于那些面向查询---应答的服务,例如NFS。相对于FTP或Telnet,这些服务需要交换的信息量较小。使用UDP的服务包括NTP(网落时间协议)和DNS(DNS也使用TCP)。

欺骗UDP包比欺骗TCP包更容易,因为UDP没有建立初始化连接(也可以称为握手)(因为在两个系统间没有虚电路),也就是说,与UDP相关的服务面临着更大的危险。

4.DCP?是不是写错了,应该是CDP吧!~

思科发现协议(CDP:Cisco Discovery Protocol)思科发现协议 CDP基本上是用来获取相邻设备的协议地址以及发现这些设备的平台。CDP也可为路由器的使用提供相关接口信息。CDP是一种独立媒体协议,运行在所有思科本身制造的设备上,包括路由器、网桥、接入服务器和交换机。需要注意的是,CDP是工作在 Layer 2的协议,默认情况下,每60秒以 01-00-0c-cc-cc-cc为目的地址发送一次组播通告,当达到180秒的holdtime上限后仍未获得邻居设备的通告时,将清除邻居设备信息。

文章分享到这里,希望我们关于【Java 基础篇】Java UDP通信详解_java udp协议的内容能够给您带来一些新的认识和思考。如果您还有其他问题,欢迎继续探索我们的网站或者与我们交流,我们将尽力为您提供满意的答案。