单播是UDP支持的一种
单播的时候,作为接收方要指定自己的接收端口。作为发送方,发送的报文要指定接收者的IP地址和port
下面的示例代码,只要在两台电脑启动的程序都是将目的地址指向对方的IP,端口互换,就可以两个聊天窗口发送消息
/**
* UDP单播聊天示例
*/
public class ChatJFrame extends JFrame implements ActionListener
{
private String userName;
private InetAddress destAddr;
private int destport;
private JTextArea rcvTextArea;
private JTextField sendTextField;
/**
* @param userName 用户名
* @param host 对方的IP地址
* @param destHost 对方的端口
* @param rcvPort 接收的端口
* @throws Exception
*/
public ChatJFrame(String userName, String destHost, int destPort, int rcvPort)
{
try(DatagramSocket socket = new DatagramSocket(rcvPort);) {
this.setTitle(userName+":"+InetAddress.getLocalHost()+":"+rcvPort);
this.setBounds(320, 240, 360, 240);
this.setDefaultCloseOperation(3);
this.rcvTextArea = new JTextArea();
this.getContentPane().add(new JScrollPane(rcvTextArea));
JPanel panel = new JPanel();
this.getContentPane().add(panel,"South");
this.sendTextField = new JTextField(10);
sendTextField.addActionListener(this);
panel.add(sendTextField);
JButton button_send = new JButton("send");
panel.add(button_send);
button_send.addActionListener(this);
this.setVisible(true);
this.userName = userName;
this.destAddr = InetAddress.getByName(destHost);
this.destport = destPort;
rcvTextArea.append("user:"+userName+"\r\n"
+"本机接受端口为"+rcvPort+"\n"
+"本机发送的目的端口为"+destPort+"\n"
+"本机发送的目的IP为"+destAddr+"\n");
byte data[] = new byte[512];
DatagramPacket pack = new DatagramPacket(data, data.length);
while(socket!=null)
{
socket.receive(pack);
int length = pack.getLength();
String message = new String(pack.getData(),0,length);
rcvTextArea.append(message+"\r\n");
}
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void actionPerformed(ActionEvent e)
{
{
byte buffer[] = (userName+":"+sendTextField.getText()).getBytes();//convert the string to byte
try(DatagramSocket socket = new DatagramSocket();)
{
DatagramPacket pack = new DatagramPacket(buffer, buffer.length,destAddr,destport);
socket.send(pack);
rcvTextArea.append("I:"+sendTextField.getText()+"\n");
sendTextField.setText("");
}
catch (Exception e2)
{
e2.printStackTrace();
}
}
}
public static void main(String arg[]) throws Exception
{
new Thread(()->{new ChatJFrame("n", "localhost", 3001, 3002);}).start();
//new Thread(()->{new ChatJFrame("m", "localhost", 3002, 3001);}).start();
}
}