2025-05-24

常用類構造方法 參數傳遞 
 
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 
        } 
 
    } 
 
}   

摘自  心飛揚

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *