UDP

UDP数据报通信

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;

public class UDPChat implements Runnable, ActionListener {
	JTextArea showArea;
	JLabel lbl1, lbl2, lbl3;
	JTextField msgText, sendPortText, receivePortText, IPAddressText;
	JFrame mainJframe;
	JButton sendBtn, startBtn;
	JScrollPane JSPane;
	JPanel pane1, pane2;
	Container con;
	Thread thread = null;
	DatagramPacket sendPack, receivePack;
	DatagramSocket sendSocket, receiveSocket;
	private InetAddress sendIP;
	private int sendPort, receivePort;
	private byte inBuf[], outBuf[];
	public static final int BUFSIZE = 1024;

	public UDPChat() {
		mainJframe = new JFrame("聊天--UDP协议");
		con = mainJframe.getContentPane();
		showArea = new JTextArea();
		showArea.setEditable(false);
		showArea.setLineWrap(true);
		lbl1 = new JLabel("接收端口号:");
		lbl2 = new JLabel("发送端口号:");
		lbl3 = new JLabel("对方的地址:");
		sendPortText = new JTextField();
		sendPortText.setColumns(5);
		receivePortText = new JTextField();
		receivePortText.setColumns(5);
		IPAddressText = new JTextField();
		IPAddressText.setColumns(8);
		startBtn = new JButton("开始");
		startBtn.addActionListener(this);
		pane1 = new JPanel();
		pane1.setLayout(new FlowLayout());
		pane1.add(lbl1);
		pane1.add(receivePortText);
		pane1.add(lbl2);
		pane1.add(sendPortText);
		pane1.add(lbl3);
		pane1.add(IPAddressText);
		pane1.add(startBtn);
		JSPane = new JScrollPane(showArea);
		msgText = new JTextField();
		msgText.setColumns(40);
		msgText.setEditable(false);
		msgText.addActionListener(this);
		sendBtn = new JButton("发送");
		sendBtn.setEnabled(false);
		sendBtn.addActionListener(this);
		pane2 = new JPanel();
		pane2.setLayout(new FlowLayout());
		pane2.add(msgText);
		pane2.add(sendBtn);
		con.add(pane1, BorderLayout.NORTH);
		con.add(JSPane, BorderLayout.CENTER);
		con.add(pane2, BorderLayout.SOUTH);
		mainJframe.setSize(600, 400);
		mainJframe.setVisible(true);
		mainJframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}

	public static void main(String[] args) {
		new UDPChat();
	}

	@Override
	public void actionPerformed(ActionEvent e) {
		try {
			if (e.getSource() == startBtn) {
				inBuf = new byte[BUFSIZE];
				sendPort = Integer.parseInt(sendPortText.getText());
				sendIP = InetAddress.getByName(IPAddressText.getText());
				sendSocket = new DatagramSocket();
				receivePort = Integer.parseInt(receivePortText.getText());
				receivePack = new DatagramPacket(inBuf, BUFSIZE);
				receiveSocket = new DatagramSocket(receivePort);
				thread = new Thread(this);
				thread.setPriority(Thread.MIN_PRIORITY);
				thread.start();
				startBtn.setEnabled(false);
				sendBtn.setEnabled(true);
				msgText.setEditable(true);
			} else {
				outBuf = msgText.getText().getBytes();
				sendPack = new DatagramPacket(outBuf, outBuf.length, sendIP,
						sendPort);
				sendSocket.send(sendPack);
				showArea.append("我说:" + msgText.getText() + "\n");
				msgText.setText(null);

			}
		} catch (UnknownHostException e1) {
			showArea.append("无法连接到指定地址\n");
		} catch (SocketException e1) {
			showArea.append("无法打开指定端口\n");
		} catch (IOException e1) {
			showArea.append("发送数据失败\n");
		}
	}

	@Override
	public void run() {
		String msgstr;
		while (true) {
			try {
				receiveSocket.receive(receivePack);
				msgstr = new String(receivePack.getData(), 0, receivePack
						.getLength());
				showArea.append("对方说:" + msgstr + "\n");
			} catch (IOException e1) {
				showArea.append("接受数据出错\n");
			}
		}
	}

}


截图:



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值