常用類構造方法 參數傳遞
DatagramPacket(byte[] buf, int length); //沒有地址信息的數據報構造器,用於接收端,等著接受無需指向地址,這個很好理解
DatagramPacket(byte[] buf,int length ,InetAddress address,int port);//有地址信息,用於發送端,發送到一個特定Ip上的特定端口上
DatagramSocket();//該Socket構造器無需制定端口號,用於發送端
DatagramSocket(int port);//該構造器用於接收端,綁定一個特定的本地端口.the port number can then be specified in a datagram packet destined for this socket.
void close();//
void receive(DatagramPacket p);
void send(DatagramPacket p);
void setSoTimeout(int timeout); //單位是秒,設定最長等待時間
//receiver.java
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
public class Receiver {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
final int MAXLEN = 100;
byte[] buffer = new byte[MAXLEN];//字符數組初始化
//byte[] buffer=new String().getBytes();//初始化字節數組
DatagramSocket ds = new DatagramSocket(2345);//接收端初始化Socket的時候一般需要綁定一個本地端口
DatagramPacket dp = new DatagramPacket(buffer,buffer.length);
//註意DS和DP的構造方法分別有兩種,一種是參數裡面有地址信息,一種是無地址信息,比如
//DatagramSocket 接收端需要端口信息,來綁定一個本地端口,以方便發送端制定特定的端口
//而DatagramPacket得接收端不需要地址信息,而發送端則需要地址信息,這裡需要形象記憶,才能不搞混
ds.receive(dp);
int len=dp.getLength();
System.out.println(len+" bytes received.\n");
String s = new String(dp.getData(),0,len);//字節流轉化為字符串的構造方法
System.out.println(dp.getAddress()+"at port"+dp.getPort()+" says:"+s);
} catch (SocketException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
//sender.java
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;
public class Sender {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
InetAddress receiveHost = InetAddress.getByName("localHost");//類靜態方法
DatagramSocket theSocket = new DatagramSocket();
String message = "Hello world!";
byte[]data = message.getBytes();
//data = theLine.getBytes();
DatagramPacket thePacket =new DatagramPacket(data,data.length,receiveHost,2345);
theSocket.send(thePacket);
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}catch (SocketException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
需要總結的幾點Java小知識,
字符串轉為整形函數:int receiverPort = Integer.parseInt(arg[1]);
字符串轉為字節流 byte [] buffer = message.getBytes();
字節流轉化為字符串 String message = new String(buffer);
字節數組初始化:byte[] buffer = new byte[MAX_SIZE];
獲得數據報的相關信息,dp.getAddress();
dp.getPort();
改進版本二
//MyDatagramSocket.java
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
public class MyDatagramSocket extends DatagramSocket{
final int MAX_LEN = 100;
public MyDatagramSocket(int portNum) throws SocketException {
super(portNum);
// TODO Auto-generated constructor stub
}
public void sendMessage(InetAddress receiveHost,int receivePort,String message) throws IOException{
byte[] buffer = message.getBytes();
DatagramPacket datagram = new DatagramPacket(buffer,buffer.length,receiveHost,receivePort);
this.send(datagram);
}
public String receiveMessage() throws IOException{
byte[] buffer = new byte[MAX_LEN];
DatagramPacket datagram = new DatagramPacket(buffer,buffer.length);
this.receive(datagram);
String message = new String(buffer);
return message;
}
}
//ReceiverToSocket.java
import java.io.IOException;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;
public class ReceiverToSender {
/**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
if(args.length!=4)
System.out.println("Need four parameters!");
else{
InetAddress receiverHost = InetAddress.getByName(args[0]);
int receiverPort = Integer.parseInt(args[1]);
int myPort = Integer.parseInt(args[2]);
String message = args[3];
MyDatagramSocket mds = new MyDatagramSocket(myPort);
System.out.println(mds.receiveMessage());//不能和下一句調換,
//因為啟動的時候先啟動這個類,receive()方法是阻塞式的,所以會
//停留在此舉,而不會發送下面的信息,另一端還未打開,所以如果現在就
//發送的話,會出現數據報丟失現象
mds.sendMessage(receiverHost, receiverPort, message);
mds.close();
}
}
}
//SenderToReceiver.java
import java.io.IOException;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;
public class SenderToReceiver {
/**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
if(args.length!=4)
System.out.println("Need four parameters!");
else{
InetAddress receiveHost = InetAddress.getByName(args[0]);
int receivePort = Integer.parseInt(args[1]);
int myPort= Integer.parseInt(args[2]);
String message = args[3];
MyDatagramSocket mds = new MyDatagramSocket(myPort);//此處標志自己的端口號,因為此例子是雙向信息傳遞
mds.sendMessage(receiveHost, receivePort, message);
System.out.println(mds.receiveMessage());
mds.close();//記得關閉socket
}
}
}
摘自 心飛揚