📄 qq.java
字号:
/**
* @(#)QQ.java
*
*
* @author
* @version 1.00 2008/5/29
*/
import javax.swing.*;
import java.net.*;
import java.awt.*;
import java.awt.event.*;
//import java.lang.*;
import java.io.*;
import java.util.*;
public class QQ extends JFrame
{
private JPanel panel1;
private JPanel panel2;
private JPanel panel3;
private JTextArea textarea1;
private JTextArea textarea2;
private JTextField textfield1;
private JTextField textfield2;
private JTextField textfield3;
private JButton button1;
private JButton button2;
private JLabel label1;
private JLabel label2;
private JLabel label3;
private JScrollPane scrollpane1;
private JScrollPane scrollpane2;
//本机端口
public static int serverPort;
//客户机端口
public static String clientIP;
public static int clientPort;
//用于建立UDP Socket, 发送UDP数据包
public static DatagramSocket datagramsocket;
//构造函数
public QQ()
{
//创建框架窗口
JFrame frame = new JFrame("QQ");
//窗口初始位置
frame.setLocation(300, 300);
//初始化控件
panel1 = new JPanel();
panel2 = new JPanel();
panel3 = new JPanel();
textarea1 = new JTextArea(13, 36);
//使聊天记录文本框不可编辑
textarea1.setEditable(false);
//激活自动换行功能
textarea1.setLineWrap(true);
//激活断行不断字功能
textarea1.setWrapStyleWord(true);
textarea1.setForeground(Color.blue);
textarea2 = new JTextArea(3, 28);
textarea2.setLineWrap(true);
textarea2.setWrapStyleWord(true);
textfield1 = new JTextField(9);
textfield2 = new JTextField(3);
textfield3 = new JTextField(3);
//为按钮创建连接事件
button1 = new JButton("连接(C)");
button1.addActionListener(new ConnectClient());
//为连接事件设置快捷键
button1.setMnemonic(KeyEvent.VK_C);
button1.addKeyListener(new KeyboardInput());
//为按钮创建发送事件
button2 = new JButton("发送(S)");
button2.addActionListener(new SendText());
//为发送事件设置快捷键
button2.setMnemonic(KeyEvent.VK_S);
button2.addKeyListener(new KeyboardInput());
label1 = new JLabel("IP地址");
label2 = new JLabel("端口");
label3 = new JLabel("本机端口");
scrollpane1 = new JScrollPane();
scrollpane1.setViewportView(textarea1);
scrollpane2 = new JScrollPane();
scrollpane2.setViewportView(textarea2);
//面板界面布局
panel1.setLayout(new FlowLayout(FlowLayout.LEFT));
panel1.add(label1);
panel1.add(textfield1);
panel1.add(label2);
panel1.add(textfield2);
panel1.add(label3);
panel1.add(textfield3);
panel1.add(button1);
panel2.setLayout(new FlowLayout(FlowLayout.LEFT));
panel2.add(scrollpane1);
panel3.setLayout(new FlowLayout(FlowLayout.LEFT));
panel3.add(scrollpane2);
panel3.add(button2);
//框架界面布局
frame.setLayout(new BorderLayout());
frame.add(panel1, BorderLayout.NORTH);
frame.add(panel2, BorderLayout.CENTER);
frame.add(panel3, BorderLayout.SOUTH);
frame.pack();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
//连接客户机
class ConnectClient implements ActionListener
{
public void actionPerformed(ActionEvent actionevent)
{
try
{
//得到客户机的IP地址
clientIP = textfield1.getText();
//得到客户机的端口
clientPort = Integer.parseInt(textfield2.getText());
serverPort = Integer.parseInt(textfield3.getText());
//为接收数据创建线程
ReceiveText receivetext = new ReceiveText();
Thread thread1 = new Thread(receivetext);
thread1.start();
//创建UDP Socket连接
datagramsocket = new DatagramSocket();
System.out.println("连接" + clientIP + ":" + clientPort + "成功.");
}
catch(SocketException socketexception)
{
System.err.println("连接" + clientIP + ":" + clientPort + "错误");
System.exit(1);
}
}
}
//发送文本
class SendText implements ActionListener
{
public void actionPerformed(ActionEvent actionevent)
{
try
{
String sendmessage = textarea2.getText();
//判断输入文本框是否为空
if(sendmessage.equals(""))
{
textarea1.append("不能发送空消息!\n");
textarea1.selectAll();
}
else
{
//创建报文数据包
DatagramPacket datagrampacket = DataConvert.PacketConvert(sendmessage,
InetAddress.getByName(clientIP), clientPort);
//发送报文
datagramsocket.send(datagrampacket);
//聊天记录中显示消息收发时间
Calendar calendar = Calendar.getInstance();
int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH);
int date = calendar.get(Calendar.DATE);
int hour = calendar.get(Calendar.HOUR);
int minute = calendar.get(Calendar.MINUTE);
int second = calendar.get(Calendar.SECOND);
textarea1.append(year + "-" + month + "-" + date + " " + hour + ":" + minute + ":" + second + " " +
"to" + " " + clientIP + ":" + clientPort + "\n" + sendmessage + "\n");
//使聊天记录文本区滚动条自动下拉到最后
textarea1.selectAll();
System.out.println(year + "-" + month + "-" + date + " " + hour + ":" + minute + ":" + second + " " +
clientIP + ":" + clientPort + " " + "发出数据:" + sendmessage);
}
}
catch(IOException ioexception)
{
System.err.println("发送数据错误");
}
//清空输入文本区
textarea2.setText(null);
//将焦点回归输入文本区
textarea2.requestFocus();
}
}
//接收文本
//实现Runnable接口创建线程
class ReceiveText implements Runnable
{
//局部UDP Socket对象, 用于接收文本
private DatagramSocket datagramsocket;
//为报文创建字节缓冲的数组
private byte[] buffer = new byte[1000];
private DatagramPacket datagrampacket = new DatagramPacket(buffer, buffer.length);
public void run()
{
try
{
//创建数据报套接字并将其绑定到本地主机上的指定端口.
datagramsocket = new DatagramSocket(serverPort);
while(true)
{
//UDP Socket接收报文
datagramsocket.receive(datagrampacket);
//将接收到的报文数据包转化为字符串
String receivemessage = DataConvert.StringConvert(datagrampacket);
//聊天记录中显示消息收发的时间
Calendar calendar = Calendar.getInstance();
int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH);
int date = calendar.get(Calendar.DATE);
int hour = calendar.get(Calendar.HOUR);
int minute = calendar.get(Calendar.MINUTE);
int second = calendar.get(Calendar.SECOND);
//textarea1.setForeground(Color.red);
textarea1.append(year + "-" + month + "-" + date + " " + hour + ":" + minute + ":" + second + " " +
"from" + " " + clientIP + ":" + clientPort + "\n" + receivemessage + "\n");
//使聊天记录的文本区滚动条自动下拉到最后
textarea1.selectAll();
System.out.println(year + "-" + month + "-" + date + " " + hour + ":" + minute + ":" + second + " " +
clientIP + ":" + clientPort + " " + "接收数据:" + receivemessage);
}
}
catch(IOException ioexception)
{
System.err.println("接收数据错误.");
}
textarea2.requestFocus();
}
}
//键盘按键响应
class KeyboardInput implements KeyListener
{
public void keyReleased(KeyEvent e)
{
}
//键盘按下事件
public void keyPressed(KeyEvent e)
{
if(e.getKeyCode() == KeyEvent.VK_C)
{
new ConnectClient();
}
if(e.getKeyCode() == KeyEvent.VK_S)
{
new SendText();
}
}
public void keyTyped(KeyEvent e)
{
}
}
public static void main(String[] args)
{
new QQ();
}
}
//数据格式转换
class DataConvert
{
//将报文字节码转换为字符串
public static String StringConvert(DatagramPacket datagrampacket)
{
return new String(datagrampacket.getData(), 0, datagrampacket.getLength());
}
//将字符串转换为报文字节码
public static DatagramPacket PacketConvert(String string, InetAddress clientIP, int clientPort)
{
byte buffer[] = string.trim().getBytes();
return new DatagramPacket(buffer, buffer.length, clientIP, clientPort);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -