📄 chat.java
字号:
package UDPchat;
/**
* Title: Chat类<br>
* Description: 基于UDP的聊天程序,用于泸州职业技术学院电信系Java课程教学示范。
* Copyright:(c)2007 www.luzhou.net<br>
* Company: 泸州职业技术学院电信系
* @author 华卫
* @version 1.00
*/
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.ScrollPaneConstants;
/*
* 第一个问题:我们这个网络程序能够给自己发送数据吗?当然可以,就像一个人非常孤单,
* 自己可以给自己写信,一个网络程序也是可以给自己发送数据的,只要在上面的IP文本框
* 中输入自己主机的地址,你就能够收到自己发给自己的数据了。
*
* 第二个问题:如何发送广播数据?只能在同一个网段中发送广播数据,将该网段IP地址的
* 主机号部分的每个二进制位都设置为1,这个IP地址就是这个网段的广播地址了,如果我们
* 发送数据的目标地址是这个网段的广播地址,这个网段上的所有主机都可以接收到发送的
* 数据。假设我的主机所在的网络号是192.168.0,子网掩码是255.255.255.0,所以,
* 这个网段的广播地址就是192.168.0.255。如果子网掩码是255.255.254.0,那么,
* 这个网段的广播地址就是192.168.1.255。在下面这个程序中,只要在IP文本框中输入
* 指向自己网段的广播地址,你也能收到你发送的数据,因为不管发送方是谁,只要是广播
* 数据,你的主机都能接收。 *
*/
public class Chat extends JFrame{
static final int PORT = 8137;
//声明组件
JPanel panel1,panel2;
JTextArea txtContent,txtInput;
JTextField txtIP;
JScrollPane panContent,panInput;
JButton btnClose,btnSend;
JLabel lblInputIP;
//声明数据报套接字
DatagramSocket ds;
//声明屏幕宽度和高度变量
int screenWidth,screenHeight;
public static void main(String[] args) {
new Chat();
}
public Chat(){
super("我的聊天室");
//变量赋值
screenWidth=(int)Toolkit.getDefaultToolkit().getScreenSize().getWidth();
screenHeight=(int)Toolkit.getDefaultToolkit().getScreenSize().getHeight();
//创建组件
panel1=new JPanel();
panel2=new JPanel();
txtContent=new JTextArea(15,60);
txtInput=new JTextArea(3,60);
lblInputIP=new JLabel("输入接收方的IP地址:");
txtIP=new JTextField("",20);
panContent=new JScrollPane(txtContent,ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED,ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
panInput=new JScrollPane(txtInput,ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED,ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
btnClose=new JButton("关闭");
btnSend=new JButton("发送");
//添加组件
getContentPane().add(panContent,"Center");
getContentPane().add(panel1,"South");
panel1.setLayout(new GridLayout(0,1));
panel1.add(panInput);
panel1.add(panel2);
panel2.add(lblInputIP);
panel2.add(txtIP);
panel2.add(btnSend);
panel2.add(btnClose);
//设置组件属性
txtContent.setEditable(false);
txtContent.setFont(new Font("宋体",Font.PLAIN,13));
txtInput.setFont(new Font("宋体",Font.PLAIN,15));
txtContent.setLineWrap(true);
txtInput.setLineWrap(true);
txtInput.requestFocus();
setSize(600,500);
setLocation((screenWidth-getWidth())/2, (screenHeight-getHeight())/2); //让窗口在屏幕居中
setVisible(true);
try {
ds=new DatagramSocket(PORT); //定义数据报套接字
} catch (SocketException e1) {
e1.printStackTrace();
}
//接收程序代码在一个新线程中完成,这样,在接收处于阻塞状态时,不会影响到程序的发送部分。
new Thread(new Runnable(){
public void run() {
byte[] buffer=new byte[1024];
DatagramPacket dp=new DatagramPacket(buffer,1024); //定义数据包
while(true){
try {
ds.receive(dp); //接收数据包
if(dp.getLength()>0){
txtContent.append(dp.getAddress().getHostName()+">"+new String(buffer,0,dp.getLength())+"\n");
}
else{
JOptionPane.showMessageDialog(null, "不能发送空信息!","聊天室",JOptionPane.WARNING_MESSAGE);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}).start();
////////////////////////////////////////////
//注册监听器,编写事件代码
btnSend.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
try {
byte[] buffer=txtInput.getText().getBytes();
DatagramPacket dp=new DatagramPacket(buffer,buffer.length,InetAddress.getByName(txtIP.getText()),PORT);
ds.send(dp); //发送数据包
txtInput.setText("");
txtInput.requestFocus();
} catch (IOException ie) {
JOptionPane.showMessageDialog(null, "未知主机异常,你输入的IP地址无效!","聊天室",JOptionPane.ERROR_MESSAGE);
txtIP.requestFocus();
}
}
});
btnClose.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
});
addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.exit(0);
}
});
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -