採用 UDP 協定實作簡易聊天室,核心元件:
public class Message implements Serializable {
private String msg, id, destId;
public Message(String msg, String id, String destId) {
this.msg = msg; this.id = id; this.destId = destId;
}
// getter 方法...
}
public class Sender extends Thread {
private DatagramSocket socket;
private DatagramPacket packet;
public Sender(Message msg) throws IOException {
this.msg = msg;
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writeObject(msg);
oos.flush();
byte[] data = bos.toByteArray();
packet = new DatagramPacket(data, data.length,
InetAddress.getByName(msg.getDestId()), 7002);
socket = new DatagramSocket(7000);
}
public void run() {
try { socket.send(packet); } catch (IOException e) { e.printStackTrace(); }
finally { socket.close(); }
}
}
public class Receiver extends Thread {
private DatagramSocket socket;
private DatagramPacket packet;
private byte[] buf = new byte[500];
public Receiver() throws SocketException {
socket = new DatagramSocket(7002);
packet = new DatagramPacket(buf, buf.length);
}
public void run() {
try {
while (true) {
socket.receive(packet);
ObjectInputStream ois = new ObjectInputStream(
new ByteArrayInputStream(buf));
Message msg = (Message) ois.readObject();
System.out.println(msg.getId() + ": " + msg.getMessage());
}
} catch (Exception e) { e.printStackTrace(); }
}
}
ByteArrayOutputStream + ObjectOutputStream 實現物件序列化此為教學級範例,生產環境需加入訊息確認、重傳、心跳偵測、加密等機制。