Java UDP通訊聊天程式
阿新 • • 發佈:2018-11-02
編寫兩個新的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();
}
}
結果: