一、关于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;
}*/
};
二、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协议的内容能够给您带来一些新的认识和思考。如果您还有其他问题,欢迎继续探索我们的网站或者与我们交流,我们将尽力为您提供满意的答案。