JAVA 网络编程(4) SOCKET UDP 单播聊天示例

23 篇文章 1 订阅
4 篇文章 0 订阅

单播是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();
	}
}



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值