1、ChatFrame.java
- package forfun.udp;
- import java.awt.*;
- import java.awt.event.*;
- import java.io.*;
- import java.net.*;
- import java.util.*;
- import javax.swing.*;
- public class ChatFrame extends JFrame {
- private String title = null; //显示框的标题
- private int inPort; //接收端口
- private int outPort; //发送端口
- private JTextArea ta; //显示文本框
- private JTextArea inTa; //输入文本框
- private JButton sendButton; //发送按钮
- private JButton exitButton; //退出按钮
- private JLabel addrLabel; //显示要连接的IP地址
- private JTextField addrTf; //输入要连接的IP地址
- private JButton connectButton; //连接到指定的IP地址
- private JButton resetButton; //设置重新要连接的IP地址
- private int x = 230;
- private int y = 200;
- private int width = 550;
- private int height = 650;
- private String address = "localhost"; //设置默认IP地址
- public ChatFrame(String title) { //构造函数,为Frame加上一title
- this.title = title;
- launch();
- }
- public void setPort(int inPort, int outPort) { //设置输入、输出端口
- this.inPort = inPort;
- this.outPort =outPort;
- }
- public void launch() { //设置界面
- int rows = 5;
- int columns = 30;
- int hgap = 8;
- int vgap = 8;
- setBounds(x, y, width, height);
- ta = new JTextArea();
- inTa = new JTextArea(rows, columns);
- ta.setEditable(false);
- sendButton = new JButton("Send");
- sendButton.setEnabled(false);
- sendButton.setToolTipText("ctrl+enter can also send the information!!"); //显示sendButton的提示信息
- sendButton.addActionListener(new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- send();
- inTa.setText("");
- }
- });
- inTa.addKeyListener(new KeyAdapter() {
- public void keyPressed(KeyEvent e) {
- if((e.getKeyCode() == KeyEvent.VK_ENTER) && ((e.getModifiers() & KeyEvent.CTRL_MASK) == KeyEvent.CTRL_MASK) && sendButton.isEnabled()) { //判断按键是否为ctrl+enter
- send();
- inTa.setText("");
- }
- }
- });
- exitButton = new JButton("exit");
- exitButton.addActionListener(new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- System.exit(0);
- }
- });
- addrLabel = new JLabel("Address:");
- addrTf = new JTextField();
- connectButton = new JButton("Connectoin");
- connectButton.addActionListener(new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- resetButton.setEnabled(true);
- connectButton.setEnabled(false);
- sendButton.setEnabled(true);
- address = addrTf.getText().trim();
- addrTf.setEditable(false);
- }
- });
- resetButton = new JButton("Rest");
- resetButton.setEnabled(false);
- resetButton.addActionListener(new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- resetButton.setEnabled(false);
- connectButton.setEnabled(true);
- sendButton.setEnabled(false);
- addrTf.setEditable(true);
- ta.setText("");
- }
- });
- JPanel addrPanel = new JPanel(); //装有地址输入控件的jPanel
- JPanel crPanel = new JPanel(); //装有connection和reset 按钮的JPanel
- crPanel.setLayout(new FlowLayout(FlowLayout.CENTER, 2, 2));
- crPanel.add(connectButton);
- crPanel.add(resetButton);
- addrPanel.setLayout(new BorderLayout(5, 5));
- addrPanel.add(addrLabel, BorderLayout.WEST);
- addrPanel.add(addrTf, BorderLayout.CENTER);
- addrPanel.add(crPanel, BorderLayout.EAST);
- JPanel panel = new JPanel(); //底部Jpanel,装有buttonJpanel、inScroll
- panel.setLayout(new BorderLayout());
- JPanel buttonPanel = new JPanel(); //装有按钮的JPanel,装在panel中
- buttonPanel.setLayout(new FlowLayout(FlowLayout.RIGHT, hgap, vgap));
- buttonPanel.add(sendButton);
- buttonPanel.add(exitButton);
- JScrollPane inScroll = new JScrollPane(inTa);
- panel.add(inScroll);
- panel.add(buttonPanel, BorderLayout.SOUTH);
- this.setLayout(new BorderLayout());
- JScrollPane scroll = new JScrollPane(ta);
- this.add(addrPanel, BorderLayout.NORTH);
- this.add(scroll);
- this.add(panel, BorderLayout.SOUTH);
- new Thread(new ReceiveThread()).start();
- }
- public void send() { //发送信息
- String str = inTa.getText().trim();
- byte[] bytes = str.getBytes();
- InetAddress addr = null;
- try {
- addr = InetAddress.getByName(address);
- DatagramPacket packet = new DatagramPacket(bytes, bytes.length, addr, outPort); //数据发送包,设置发送包的目标地址和发送的端口号
- DatagramSocket dgSocket = new DatagramSocket();
- dgSocket.send(packet);
- ta.append("/ntime:" + getTime() + " I say:/n" + "" + str);
- bytes = null;
- } catch (UnknownHostException e) {
- e.printStackTrace();
- } catch (SocketException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- public String getTime() { //获取当前时间
- String time = null;
- Calendar calendar = Calendar.getInstance();
- int hour = calendar.get(Calendar.HOUR);
- int minute = calendar.get(Calendar.MINUTE);
- int second = calendar.get(Calendar.SECOND);
- int amOrpm = calendar.get(Calendar.AM_PM);
- time = new String(hour + ":" + minute + ":" + second + " " + amOrpm);
- return time;
- }
- class ReceiveThread implements Runnable { //接收信息
- public void run() {
- DatagramPacket packet = null;
- DatagramSocket dgSocket = null;
- try {
- dgSocket = new DatagramSocket(inPort); //数据接收包,设置接收包的端口号
- while(true) {
- byte[] bytes = new byte[30];
- packet = new DatagramPacket(bytes, bytes.length);
- dgSocket.receive(packet);
- String str = new String(bytes);
- ta.append("/ntime: " + getTime() + " ");
- ta.append("other says:/n" + "" + str);
- ta.setCaretPosition(ta.getText().length());
- Thread.sleep(100);
- }
- } catch (SocketException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- }
- }
2.ChatA.java
- package forfun.udp;
- import javax.swing.*;
- public class ChatA {
- public static void main(String[] args) {
- String title = "chatFrame";
- int inPort = 8880;
- int outPort = 8888;
- ChatFrame cf = new ChatFrame(title);
- cf.setPort(inPort, outPort);
- cf.setVisible(true);
- cf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
- }
- }
3.ChatB.java
- package forfun.udp;
- import javax.swing.*;
- public class ChatB {
- public static void main(String[] args) {
- String title = "chatFrame";
- int inPort = 8888;
- int outPort = 8880;
- ChatFrame cf = new ChatFrame(title);
- cf.setPort(inPort, outPort);
- cf.setVisible(true);
- cf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
- }
- }