1. 程式人生 > >Java 基於UDP的Socket網路程式設計的入門及示例

Java 基於UDP的Socket網路程式設計的入門及示例

前言:天吶!這兩天上班就像走鋼絲啊,老大家裡出事請假一週,手機關機,底層無人照看,機器又忙著定標,技術盲老闆事事問我這個底層小白。做人好難吶。。。還是祝願老大家裡沒有大礙吧,也保佑自己明天能安然度過。。保佑保佑。
原文出處:http://blog.csdn.net/u014158743/article/details/52928781

udp協議實現資料的基本傳送與接收

UdpReceive

/**
 * 使用 udp協議實現資料的接收
 * 1:建立Socket端點,實現資料的接收,同時要監聽埠
 * 2:建立用來接收資料的資料報包
 * 3:使用 Socket的接收功能接收資料
 * @throws
IOException */
public static void main(String[] args) throws IOException { System.out.println("接收方啟動....."); //1:建立Socket端點,實現資料的接收 DatagramSocket socket = new DatagramSocket(22222); //2:建立了一個空的資料報包用來接收資料 byte[] arr = new byte[1024]; DatagramPacket packet = new DatagramPacket(arr, arr.length); //3:使用 Socket的接收功能接收資料
//接收資料就是從網路讀取資料 socket.receive(packet); //解析接收的資料 //解析資料 byte[] data = packet.getData();//得到接收的資料 String shuju = new String(data,0,packet.getLength()); //得到傳送方的ip地址 InetAddress address = packet.getAddress(); String ip = address.getHostAddress(); //得到傳送方傳送資料使用的埠 int
port = packet.getPort(); System.out.println(ip+":"+port+":"+shuju); socket.close(); }

UdpSend

/**
 * 使用udp協議實現資料的傳送
 * 1:建立 Socket端點,實現資料的傳送
 * 2:明確要傳送的資料
 * 3:把要傳送的資料打成資料報包
 * 4:使用 Socket的傳送功能傳送資料
 * @throws IOException 
 */
public static void main(String[] args) throws IOException {

    System.out.println("傳送方啟動.....");
    //1:建立 Socket端點,實現資料的傳送
    DatagramSocket socket  = new DatagramSocket();//明確了協議

    //2:明確要傳送的資料
    String ss ="明天放假";
    byte[] data = ss.getBytes();

    //3:把要傳送的資料打成資料報包
    //資料報包指明瞭傳送的資料,接收資料的主機的Ip地址物件,接收資料的主機使用哪個埠接收
    DatagramPacket dp = new DatagramPacket(data,data.length, InetAddress.getByName("192.168.1.212"), 22222);

    //4:使用 Socket的傳送功能傳送資料
    //傳送資料就是向網路輸出資料,所以內部使用了輸出流
    socket.send(dp);

    socket.close();

}

使用udp實現一直髮送資料與接收資料

UdpSend

/**
 * 使用udp實現傳送方可以一直髮送
 * 1:建立 Socket端點
 * 2:迴圈讀取鍵盤輸入的資料,把每次讀取的資料發出去
 * 3:關閉 Socket
 * @throws IOException 
 */
public static void main(String[] args) throws IOException {
     System.out.println("方式方啟動.....");
        DatagramSocket s = new DatagramSocket();

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String line = null;
        while((line = br.readLine())!=null)
        {
         if("over".equals(line))
             break;
         byte[] arr = line.getBytes();

         DatagramPacket packet = new DatagramPacket(arr, arr.length, InetAddress.getByName("192.168.1.212"),33333);

         s.send(packet);
        }

        br.close();
        s.close();    
}

UdpReceive

/**
 *  使用udp實現接收方可以一直接收
 * @throws IOException 
 */
public static void main(String[] args) throws IOException {
    System.out.println("接收方啟動....");
    DatagramSocket s = new DatagramSocket(33333);

    while(true)
    {
        byte[] arr = new byte[1024];

        DatagramPacket packet = new DatagramPacket(arr, arr.length);

        s.receive(packet);

        String data = new String(packet.getData(),0,packet.getLength());
        String ip = packet.getAddress().getHostAddress();
        System.out.println(ip+":"+data);
    }

    //s.close();
}

使用udp實現一個聊天程式

傳送的同時可以接收 建立一個執行緒負責傳送資料 建立一個執行緒負責接收資料

public class UdpChat {
    public static void main(String[] args) throws SocketException {

        DatagramSocket sendSocket = new DatagramSocket();
        DatagramSocket receiveSocket = new DatagramSocket(44444);

        new Thread(new Send(sendSocket)).start();
        new Thread(new Receive(receiveSocket)).start();

    }

}

// 定義傳送執行緒的任務
class Send implements Runnable {
    private DatagramSocket socket;

    public Send(DatagramSocket socket) {
        this.socket = socket;
    }

    @Override
    public void run() {
        // 任務是可以一直髮送資料

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String line = null;

        try {
            while ((line = br.readLine()) != null) {
                byte[] data = line.getBytes();

                DatagramPacket packet = new DatagramPacket(data, data.length,
                        InetAddress.getByName("192.168.1.212"), 44444);

                socket.send(packet);

                if ("baibai".equals(line)) {
                    break;
                }
            }
            br.close();
            socket.close();

        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}

// 定義接收執行緒的任務
class Receive implements Runnable {
    private DatagramSocket socket;

    public Receive(DatagramSocket socket) {
        this.socket = socket;
    }

    @Override
    public void run() {

        // 可以一直接收資料的任務
        try {
            while(true)
            {
                byte[] data = new byte[1024];
                DatagramPacket packet = new DatagramPacket(data, data.length);
                socket.receive(packet);
                String  shuju = new String(packet.getData(),0,packet.getLength());
                String  ip = packet.getAddress().getHostAddress();

                if("baibai".equals(shuju))
                {
                    System.out.println(ip+"離開了聊天室");
                }
                System.out.println(ip+":"+shuju);
            }

        } catch (IOException e) {
            e.printStackTrace();
        }

    }

}

晚安,祝工作順利。