您的位置:首页 > 编程语言 > Java开发

Java的UDP通信

2012-06-03 23:31 232 查看




/**
*UDPServer
*@author Winty wintys@gmail.com
*@version 2008-12-15
*/
import java.io.*;
import java.net.*;

class UDPServer{
public static void main(String[] args)throws IOException{
DatagramSocket server = new DatagramSocket(5050);

byte[] recvBuf = new byte[100];
DatagramPacket recvPacket
= new DatagramPacket(recvBuf , recvBuf.length);

server.receive(recvPacket);

String recvStr = new String(recvPacket.getData() , 0 , recvPacket.getLength());
System.out.println("Hello World!" + recvStr);

int port = recvPacket.getPort();
InetAddress addr = recvPacket.getAddress();
String sendStr = "Hello ! I'm Server";
byte[] sendBuf;
sendBuf = sendStr.getBytes();
DatagramPacket sendPacket
= new DatagramPacket(sendBuf , sendBuf.length , addr , port );

server.send(sendPacket);

server.close();
}
}

/**

*UDPClient

*@author Winty wintys@gmail.com

*@version 2008-12-15

*/

import java.io.*;

import java.net.*;

class UDPClient{

public static void main(String[] args)throws IOException{

DatagramSocket client = new DatagramSocket();

String sendStr = "Hello! I'm Client";

byte[] sendBuf;

sendBuf = sendStr.getBytes();

InetAddress addr = InetAddress.getByName("127.0.0.1");

int port = 5050;

DatagramPacket sendPacket

= new DatagramPacket(sendBuf ,sendBuf.length , addr , port);

client.send(sendPacket);

byte[] recvBuf = new byte[100];

DatagramPacket recvPacket

= new DatagramPacket(recvBuf , recvBuf.length);

client.receive(recvPacket);

String recvStr = new String(recvPacket.getData() , 0 ,recvPacket.getLength());

System.out.println("收到:" + recvStr);

client.close();

}

}

=========================================================================================
用户数据报(UDP)是网络信息传输的一种形式。在《网络编程之了解TCP/UDP网络协议 》一文中已经讲到了UDP通信和TCP通信的不同,UDP传输数据快,但是不稳定。使用UDP通信时,用户无法知道数据能否正确到达主机,也不能确定到达目的地的顺序是否和发送顺序相同。虽然UDP是不可靠的,但是对于一些可以容忍小错误的信息传输,此时可以考虑UDP。 UDP的通信模式为:1.数据打包(数据包)。将数据包发往目的地。
2.接收比人发的数据包,然后读数据包内容。 UDP数据包发送步骤: 1.使用DatagramSocket()创建一个数据包套接字。
2.使用DatagramPacket()创建要发送的数据包。 3.使用DatagramSocket()类的send()方法发送数据包。 UDP数据包接收步骤: 1.使用DatagramSocket(int
port)创建一个数据包套接字,绑定到指定端口。 2.使用DatagramPacket()创建字节数组接收数据包。 3.使用DatagramPacket()类的receive()方法接受数据包。 关于DatagramSocket类DatagramSocket类建立UDP程序的套接字。每个在数据报套接字上发送或接收的包都是单独编址和路由的。
方法1. new DatagramSocket();//创建绑定到本地主机上任何可用的端口 方法2. new DatagramSocket(int port);//创建绑定到本地主机上指定的端口 方法3. new DatagramSocket(int port,InetAddress address);//创建绑定的指定本地地址,方法适用于多块网卡和多个IP地址。 关于DatagramPacket类 此类表示数据报包,数据报包用来实现无连接包投递服务。每条报文只根据该包包含的信息,从一台计算机路由到另一台计算机。
方法1. new DatagramPacket(byte[] buf,int length);//指定接收长度创建对象。 方法2. new DatagramPacket(byte[] buf,int length,InetAddress address,int port);//指定数据包内存空间大小,同时指定数据包发送目标地址和端口。 以下程序演示如何实现,服务端接受数据,再发送数据。客户端发送数据,再接收数据。 服务器端代码:
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;

public class UDPServer {

public static void main(String[] args) {
DatagramSocket server;
try {
server = new DatagramSocket(9999);
byte[] buf = new byte[100];
DatagramPacket packet = new DatagramPacket(buf, buf.length);
server.receive(packet);
String str = new String(packet.getData(), 0, buf.length);
System.out.println("Hello!" + str);
int port = packet.getPort();
InetAddress address = packet.getAddress();
String str1 = "我是服务器,我广播信息给你";
byte[] sendBuf;
sendBuf = str1.getBytes();
DatagramPacket sendpacket = new DatagramPacket(sendBuf,
sendBuf.length, address, port);
server.send(sendpacket);
server.close();
} catch (Exception e) {

e.printStackTrace();
}

}

}

客户端代码:
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;

public class UDPClient {

public static void main(String[] args) {
DatagramSocket client;
try {
client = new DatagramSocket();
String sendStr = "你好,我是客户机";
byte[] sendBuf;
sendBuf = sendStr.getBytes();
InetAddress address = InetAddress.getByName("127.0.0.1");
int port = 9999;
DatagramPacket sendpacket = new DatagramPacket(sendBuf,
sendBuf.length, address, port);
client.send(sendpacket);
byte[] recBuf = new byte[100];
DatagramPacket recpacket = new DatagramPacket(recBuf, recBuf.length);
client.receive(recpacket);
String str = new String(recpacket.getData(), 0, recBuf.length);
System.out.println("收到:" + str);
client.close();
} catch (Exception e) {

e.printStackTrace();
}

}

}

执行结果: 服务端收到信息->Hello!你好,我是客户机. 客户端收到信息->我是服务器,我广播信息给你
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: