📄 chat1.java
字号:
package chat;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.io.*;
import java.net.*;
public class Chat1
{
private JFrame frame;
private Container contentPane;
private JTextField tf1;
private JTextArea ta,tb;
private JButton btnCon,btnSend,btnExit;
private JRadioButton rb1;
private JRadioButton rb2;
private String strbuf="";
private DatagramSocket serverSocket,clientSocket;
public Chat1()
{
frame=new JFrame("聊天室");
frame.setSize(460,460);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setResizable(false);
contentPane=frame.getContentPane();
initGUI();
}
public void initGUI()
{
contentPane.setLayout(new BorderLayout());
JPanel panel1=new JPanel(new GridLayout(3,1));
JPanel p11=new JPanel(new FlowLayout(FlowLayout.LEFT));
p11.add(new JLabel("UDP连接程序"));
JPanel p12=new JPanel(new FlowLayout(FlowLayout.LEFT));
rb1=new JRadioButton("服务器端");
rb2=new JRadioButton("客户端");
ButtonGroup bg=new ButtonGroup();
bg.add(rb1);
bg.add(rb2);
p12.add(rb1);
p12.add(rb2);
p12.add(new JLabel("连接状态"));
tf1=new JTextField(20);
tf1.setEditable(false);
p12.add(tf1);
panel1.add(p11);
panel1.add(p12);
contentPane.add(panel1,BorderLayout.NORTH);
JPanel panel2=new JPanel(new FlowLayout(FlowLayout.LEFT));
panel2.add(new JLabel("收到的信息"));
ta=new JTextArea(10,30);
ta.setEditable(false);
panel2.add(ta);
int v = ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED;
int h = ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED;
JScrollPane pane=new JScrollPane(ta,v,h);
panel2.add(pane);
contentPane.add(panel2,BorderLayout.CENTER);
JPanel panel3=new JPanel(new GridLayout(2,1));
JPanel p31=new JPanel(new FlowLayout(FlowLayout.LEFT));
p31.add(new JLabel("发送信息"));
tb=new JTextArea(3,30);
p31.add(tb);
JPanel p32=new JPanel(new FlowLayout());
btnCon=new JButton("连接");
btnSend=new JButton("发送");
btnExit=new JButton("关闭连接");
btnSend.setEnabled(false);
btnExit.setEnabled(false);
p32.add(btnCon);
p32.add(btnSend);
p32.add(btnExit);
panel3.add(p31);
panel3.add(p32);
contentPane.add(panel3,BorderLayout.SOUTH);
ActionListener listener =new ActionListener(){
public void actionPerformed(ActionEvent e)
{
//服务器端或客户端的连接
if(e.getSource()==btnCon)
{
if(rb1.isSelected()==false&&rb2.isSelected()==false)
{
tf1.setText("请选择客户端或服务器端!");
return;
}
try
{
if(rb1.isSelected()==true)
{
tb.setText("");
rb1.setEnabled(false);
rb2.setEnabled(false);
Server server=new Server();
}
if(rb2.isSelected()==true)
{
rb1.setEnabled(false);
rb2.setEnabled(false);
tb.setText("");
Client client=new Client();
}
}catch(Exception e1)
{
tf1.setText("连接错误!");
}
}
//服务器端或客户端信息的发送
if(e.getSource()==btnSend)
{
try
{
strbuf=tb.getText();
if(strbuf.length()>0)
{
ta.append(strbuf+"\n");
}
tb.setText("");
byte [] buffer=new byte[strbuf.length()];
buffer=strbuf.getBytes(); DatagramPacket packet;
if(rb1.isSelected()==true)
{
packet=new DatagramPacket(buffer,buffer.length,new InetSocketAddress("localhost",902));
serverSocket.send(packet);
}
if(rb2.isSelected()==true)
{
packet=new DatagramPacket(buffer,buffer.length,new InetSocketAddress("localhost",901));
clientSocket.send(packet);
}
}catch(Exception e1)
{
e1.printStackTrace();
}
}
//服务器端或客户端的断开
if(e.getSource()==btnExit)
{
try
{
if(rb1.isSelected()==true)
{
serverSocket.close();
Thread.currentThread().interrupt();
}
if(rb2.isSelected()==true)
{
clientSocket.close();
Thread.currentThread().interrupt();
}
tf1.setText("离线");
btnCon.setEnabled(true);
btnSend.setEnabled(false);
btnExit.setEnabled(false);
}catch(Exception e1)
{
tf1.setText("关闭时发生错误!");
}
}
}
};
btnCon.addActionListener(listener);
btnSend.addActionListener(listener);
btnExit.addActionListener(listener);
}
//实现服务器端信息接收的成员内部类
public class Server implements Runnable
{
public Server()
{
(new Thread(this)).start();
}
public void run()
{
String s;
try
{
btnCon.setEnabled(false);
serverSocket=new DatagramSocket(901);
ta.setText(InetAddress.getLocalHost().getHostName()+"port:901"+"\n");
tf1.setText("连接中");
btnSend.setEnabled(true);
btnExit.setEnabled(true);
while(true)
{
//接收
byte [] buffer=new byte[256];
DatagramPacket packet=new DatagramPacket(buffer,buffer.length);
serverSocket.receive(packet);
s=new String(packet.getData());
s=s.trim();
if(s.length()>0)
{
ta.append("Client: "+s+"\n");
}
}
}catch(Exception e1)
{
e1.printStackTrace();
}
}
}
//实现客户端信息接收的多线程内部类
public class Client implements Runnable
{
public Client()
{
(new Thread(this)).start();
}
public void run()
{
DatagramPacket packet;
String s;
try
{
btnCon.setEnabled(false);
clientSocket=new DatagramSocket(902);
ta.setText(InetAddress.getLocalHost().getHostName()+"port:902"+"\n");
tf1.setText("连接中");
btnSend.setEnabled(true);
btnExit.setEnabled(true);
while(true)
{
//接收
byte [] buffer=new byte[256];
packet=new DatagramPacket(buffer,buffer.length);
clientSocket.receive(packet);
s=new String(packet.getData());
s=s.trim();
if(s.length()>0)
{
ta.append("server: "+s+"\n");
}
}
}catch(Exception e)
{
e.printStackTrace();
}
}
}
public void go()
{
frame.setVisible(true);
}
public static void main(String args[])
{
(new Chat1()).go();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -