1. 程式人生 > >Java UDP通訊聊天程式

Java UDP通訊聊天程式

 編寫兩個新的VC程式,完成以下功能:
 一個程式為服務端,建立UDP服務端套接字。
 另外一個程式為客戶端,建立UDP客戶端套接字。
 這兩個新程式可以互聯,完成一個基於TCP/IP網路的文字聊天程式。

因為TCP需要三次握手,所以只能一來一回的實現聊天程式,而UDP可以只負責傳送不管對方有沒有接到,可以實現更符合現實中的聊天模式,即可以一端傳送多條資訊。

檔案存放格式:
在這裡插入圖片描述
Send_Thread.java

package UDP;

import java.io.IOException;
import java.net.DatagramPacket;
import
java.net.DatagramSocket; import java.net.InetSocketAddress; import java.util.Scanner; public class Send_Thread extends Thread{ //傳送的socket端 private DatagramSocket sender = null; //待發送的目標地址,InetSocketAddress用來儲存IP套接字地址 private InetSocketAddress address = null; //接收鍵盤輸入 Scanner scan =
new Scanner(System.in); //建構函式 public Send_Thread(DatagramSocket sender, InetSocketAddress address) { this.sender = sender; this.address = address; } public void run() { try { while (true) { //輸入待發送的內容 String input = scan.
nextLine(); if (input.equals("quit")) break; byte[] data = null; data = input.getBytes("UTF-8"); //建立UDP資料報 DatagramPacket pack = new DatagramPacket(data, data.length, address); sender.send(pack); } System.out.println("聊天結束"); } catch (IOException e) { e.printStackTrace(); } } }

Receive_Thread.java

package UDP;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;

public class Receive_Thread extends Thread{

    private static final int MAX_RECEIVE_BUFFER = 1024;  //最大接收快取
    private DatagramSocket server;    //DatagramSocket類用來建立伺服器和客戶端
    private DatagramPacket packet;    //DatagramPacket類用來存入和解包UDP資料
    byte[] buffer = new byte[MAX_RECEIVE_BUFFER];
    //建構函式
    public Receive_Thread(DatagramSocket server) {
        this.server = server;
        packet = new DatagramPacket(buffer, buffer.length);
    }

    public void run() {
        try {
            String s = null;
            while (true) {
                //接收資料包
                server.receive(packet);
                s = new String(packet.getData(), packet.getOffset(), packet.getLength(), "UTF-8");
                //將接收的資料列印到控制檯
                System.out.println(packet.getAddress() + "/" + packet.getPort() + ":" + s);
                packet.setLength(buffer.length);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

Create.java

package UDP;

import java.net.DatagramSocket;
import java.net.InetSocketAddress;

public class Create {   //建立
    private int DEST_PORT = 0;
    private int SEND_PORT = 0;
    private int RECE_PORT = 0;
    private String IP = null;
    //建構函式儲存IP和埠
    public Create(int DEST_PORT, int SEND_PORT, int RECE_PORT, String IP) {
        this.DEST_PORT = DEST_PORT;
        this.SEND_PORT = SEND_PORT;
        this.RECE_PORT = RECE_PORT;
        this.IP = IP;
    }
    public void run(){
        try {
            System.out.println("輸入quit以結束聊天");
            Send_Thread send_thread = null;
            Receive_Thread receive_thread = null;
            InetSocketAddress address = null;
            //建立待接受資料包的目的機的埠號和IP地址
            address = new InetSocketAddress(IP, DEST_PORT);
            //建立傳送的Socket端
            DatagramSocket sendsocket = new DatagramSocket(SEND_PORT);
            //建立接受的Socket端
            DatagramSocket recesocket = new DatagramSocket(RECE_PORT);
            //傳送執行緒建立
            send_thread = new Send_Thread(sendsocket, address);
            //接受執行緒的建立
            receive_thread = new Receive_Thread(recesocket);

            send_thread.start();  //開啟執行緒
            receive_thread.start();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Client.java

package UDP;

public class Client {

    private static final int DEST_PORT = 8888;
    private static final int SEND_PORT = 10000;
    private static final int RECE_PORT = 6666;
    private static final String IP = "127.0.0.1";

    public static void main(String[] args) {
        Create client = new Create(DEST_PORT,SEND_PORT,RECE_PORT,IP);
        client.run();
    }
}

Server.java

package UDP;

public class Server {

    private static final int DEST_PORT = 6666;
    private static final int SEND_PORT = 10001;
    private static final int RECE_PORT = 8888;
    private static final String IP = "127.0.0.1";

    public static void main(String[] args) {
        Create client = new Create(DEST_PORT,SEND_PORT,RECE_PORT,IP);
        client.run();
    }
}

結果:
在這裡插入圖片描述
在這裡插入圖片描述