本文主要是讲解Java udp的使用,话不多说直接上代码!
package Main;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.util.Scanner;
public class Udp {
private static DatagramSocket ds = null;
static String send;
static String address = "192.168.0.121";
static DatagramPacket dp;
static Scanner sc;
public static void send(String s) {
try {
dp = new DatagramPacket(s.getBytes(), 0, s.getBytes().length);
dp.setAddress(InetAddress.getByName(address));
dp.setPort(10000);
} catch (UnknownHostException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
try {
ds.send(dp);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void main(String[] args) {
init();
while (true) {
send = sc.next();
send(send);
}
}
private static void init() {
// TODO Auto-generated method stub
sc = new Scanner(System.in);
try {
ds = new DatagramSocket(8999);
} catch (SocketException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
我这里主要是定义了两个类,一个类就叫”UDP”(名字有点古怪,凑合看吧^_^),也就是上面这代码。这个类是用来发送的UDP数据(DatagramePacket)的。
接下来就是用来接收数据的类了
package UDP;
import java.io.IOException;
import java.lang.ref.PhantomReference;
import java.lang.ref.ReferenceQueue;
import java.lang.ref.WeakReference;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
public class Harry {
private static byte[] bytes=null;
static DatagramPacket packet=null;
static DatagramSocket ds=null;
private static String show="";
public static void receive(){
try {
ds=new DatagramSocket(10000);
} catch (SocketException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
while (true) {
re();
System.out.println(show);
}
}
public static void main(String[] args) {
receive();
}
public static void re(){
bytes=new byte[1024];
packet=new DatagramPacket(bytes, 0,bytes.length);
try {
ds.receive(packet);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
show=new String(packet.getData(),0,packet.getData().length);
}
}
我给它起了一个好听的名字:”harry”,这个类里面就是用到了DatagramSocket 对象ds的receive()方法,这个方法就是用来接收发来的数据的。
不管是发的类还是接收的类,为了让他们能够一直发送或者一直接收,我就将他们的核心代码都放在了while(true){}中了。
说一个小插曲,之前把bytes=new byte[1024];
这句放在了while(true){}代码段之前,结果接收到的数据总是含有上一段接收的数据的”残留“,比如上一次发的”hhhh“,第二次发”ha“,显示出来是”hahh“,这主要是因为byte数组没有清空,然后导致后面的连个”h“的内容还是保留着的,修改之后结果让人满意。还是设计的时候自己考虑不周啊。