源代碼: https://git.oschina.net/chesian/Chat-UDP
一、實驗環境
編程語言:Java1.8(運行在JVM(Java Virsual Machine))
開發工具:eclipce
測試環境:局域網
二、實驗目的
社會已經進入信息時代,網絡技術在飛速發展.大量應用都依賴於從一個主機向多個主機或者從多個主機向多個主機發送同一信息的能力,在Internet上分佈的數目可能達數十萬臺,這些都需要更高的帶寬,並且大大超出了單播的能力.一種能最大限度地利用現有帶寬的重要技術是IP組播.
三、組播聊天程序的實現:
package cn.gdut.edu.udp;
/**
* 該程序實現了簡單組播聊天功能;
* 步驟:
* 1、利用java.net包中的MulticastSocket生成對象s;
* 2、設置組播地址group=InetAddress.getByName("228.9.6.8");
* 3、加入組播s.joinGroup(group);
* 4、將要發送的所有信息封裝成一個數據報data=DatagramPacket的一個實例;
* 5、數據報的頭部放入聊天人的別名name;
* 6、發送處理好的數據包:s.send(data);
* 7、創建一個接受數據報的隊列recv:DatagramPacket(buf, buf.length),隊列大小爲100字節;
* 8、創建一個監聽線程,線程中執行數據包的接受功能:s.receive(recv);
* 9、聊天記錄可以手動保存至”Note.txt”文件中;
* 作者:chen
*/
import java.net.*;
import java.awt.event.*;
import java.awt.*;
import java.io.*;
import javax.swing.*;
public class MutilCast {
public static void main(String[] args) {
MulticastSocket s = null;
InetAddress group = null;
JPanel northPanel = new JPanel();
JPanel southPanel = new JPanel();
JPanel namePanel = new JPanel(new FlowLayout());
JLabel sendLabel = new JLabel("發送內容:");
JLabel nameChangeLabel = new JLabel("給自己起個名字:");
final JTextField nameSpace = new JTextField(20);
final JTextArea messageArea = new JTextArea("", 20, 20);
final JTextField sendField = new JTextField(30);
JScrollPane message = new JScrollPane(messageArea);
JButton sendButton = new JButton("發送");
JButton saveButton = new JButton("保存記錄");
JButton clearUpButton = new JButton("清空面板");
Box centerBox = Box.createVerticalBox();
namePanel.add(nameChangeLabel);
namePanel.add(nameSpace);
centerBox.add(namePanel);
centerBox.add(message);
// 實現組播數據傳送的配置信息
try {
group = InetAddress.getByName("228.9.6.8");
} catch (UnknownHostException e1) {
System.out.println("組播地址綁定失敗");
}
try {
s = new MulticastSocket(6789);
} catch (IOException e1) {
System.out.println("組播地址創建失敗");
}
try {
s.joinGroup(group);
} catch (IOException e1) {
System.out.println("組播地址加入失敗");
}
// end實現組播數據傳送的配置信息
// “發送”按鈕實現信息功能的發送部分
class SendMsg implements ActionListener {
String msg = null;
MulticastSocket s = null;
InetAddress group = null;
public SendMsg(MulticastSocket s, InetAddress group) {
this.s = s;
this.group = group;
}
public void actionPerformed(ActionEvent e) {
try {
// 如果名字爲空 給出提示信息
if (nameSpace.getText().isEmpty())
JOptionPane.showMessageDialog(null, "請一定要取別名!");
else {
// 如果名字不爲空 則把名字添加到數據報頭
msg = (nameSpace.getText() + "說:" + sendField.getText());
DatagramPacket data = new DatagramPacket(
msg.getBytes(), msg.getBytes().length, group,
6789);
s.send(data);
}
} catch (IOException e1) {
System.out.println("發送失敗");
}
}
}
// 實現數據報的接受線程
class recevMsg extends Thread {
MulticastSocket s = null;
public recevMsg(MulticastSocket s) {
this.s = s;
};
public void run() {
byte[] buf = new byte[100];
DatagramPacket recv = new DatagramPacket(buf, buf.length);
try {
while (true) {
s.receive(recv);
String str = new String(recv.getData());
String line = System.getProperty("line.separator");
messageArea.append(str);
messageArea.append(line);
}
} catch (IOException e1) {
System.out.println("接受失敗");
}
}
}
// 聊天記錄的保存 保存在當前位置下的"Note.txt"文件中
class SaveMsg implements ActionListener {
String msg = null;
String line = System.getProperty("line.separator");
public void actionPerformed(ActionEvent e) {
try {
msg = messageArea.getText();
FileOutputStream Note = new FileOutputStream("Note.txt");
messageArea.append("記錄已經保存在Note.txt");
Note.write(msg.getBytes());
messageArea.append(line);
Note.close();
} catch (IOException e1) {
System.out.println("發送失敗");
}
}
}
// 清除面板上的聊天記錄
class ClearMsg implements ActionListener {
public void actionPerformed(ActionEvent e) {
try {
messageArea.setText("");
} catch (Exception e1) {
System.out.println("清空失敗");
}
}
}
JFrame mutilCastFrame = new JFrame("組播聊天工具");
northPanel.add(sendLabel);
northPanel.add(sendField);
northPanel.add(sendButton);
southPanel.add(saveButton);
southPanel.add(clearUpButton);
mutilCastFrame.getContentPane().add(northPanel, "North");
mutilCastFrame.getContentPane().add(southPanel, "South");
mutilCastFrame.getContentPane().add(centerBox, "Center");
mutilCastFrame.setDefaultCloseOperation(mutilCastFrame.EXIT_ON_CLOSE);
sendButton.addActionListener(new SendMsg(s, group));
saveButton.addActionListener(new SaveMsg());
clearUpButton.addActionListener(new ClearMsg());
mutilCastFrame.setSize(500, 500);
mutilCastFrame.setLocation(200, 200);
mutilCastFrame.show();
recevMsg r = new recevMsg(s);
r.start();
}
}