📄 chat1.java
字号:
package com.chat;
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;
public class Chat1
{
private JFrame f;
private Container contentPane;
private JTextField tf1;
private JTextField tfIP;
private JRadioButton rb1,rb2;
private JButton btnCon,btnSend,btnExit;
private JTextArea ta,tb;
private JLabel labelIP;
private String strbuf="";
private DatagramSocket serverSocket,clientSocket;
private MulticastSocket multiSocket;
private String userName;
private String clientName;
public Chat1()
{
f=new JFrame("ChatRoom");
contentPane=f.getContentPane();
f.setSize(460,460);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setResizable(false);
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 Connect program"));
JPanel p12=new JPanel(new FlowLayout(FlowLayout.LEFT));
ButtonGroup bg=new ButtonGroup();
rb1=new JRadioButton("群聊");
rb2=new JRadioButton("私聊");
bg.add(rb1);
bg.add(rb2);
p12.add(rb1);
p12.add(rb2);
p12.add(new JLabel("连接状态"));
tf1=new JTextField(14);
p12.add(tf1);
JPanel p13=new JPanel(new FlowLayout(FlowLayout.RIGHT));
labelIP=new JLabel("请输入对方 IP ");
tfIP=new JTextField(14);
p13.add(labelIP);
p13.add(tfIP);
panel1.add(p11);
panel1.add(p12);
panel1.add(p13);
contentPane.add(panel1,BorderLayout.NORTH);
JPanel panel2=new JPanel(new FlowLayout());
panel2.add(new JLabel("Received Msg"));
ta=new JTextArea(10,30);
panel2.add(ta);
ta.setEditable(false);
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());
p31.add(new JLabel("Send Msg"));
tb=new JTextArea(4,30);
p31.add(tb);//此行不可以放在71行*******
int v1=ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED;
int h1=ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED;
JScrollPane pane1=new JScrollPane(tb,v1,h1);
p31.add(pane1);
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 rb1Listener=new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
if(rb1.isSelected());
labelIP.setText("这是群组地址 请点击连接");
tfIP.setText("228.5.6.7");
}
};
ActionListener rb2Listener=new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
if(rb2.isSelected());
labelIP.setText("请输入对方 IP地址");
tfIP.setText("");
}
};
rb1.addActionListener(rb1Listener);
rb2.addActionListener(rb2Listener);
ActionListener listener=new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
if(e.getSource()==btnCon)
{
if(rb1.isSelected()==false &&rb2.isSelected()==false)
{
tf1.setText("plese choose ServerEnd or ClientEnd!");
return;
}
try
{
if(rb1.isSelected())
{
tb.setText("");
rb1.setEnabled(false);
rb2.setEnabled(false);
tfIP.setText("228.5.6.7");
userName=JOptionPane.showInputDialog("清输入用户名");
Server server=new Server();
}
if(rb2.isSelected())
{
tb.setText("");
rb1.setEnabled(false);
rb1.setEnabled(false);
clientName=JOptionPane.showInputDialog("清输入用户名");
Client client=new Client();
}
}
catch(Exception e1)
{
e1.printStackTrace();
}
}
if(e.getSource()==btnSend)
{
strbuf=tb.getText();
try
{
byte[] buffer=new byte[strbuf.length()*2];
buffer=strbuf.getBytes();
DatagramPacket packet;
if(rb1.isSelected())
{
tb.setText("");
serverSocket=new DatagramSocket();
packet=new DatagramPacket(buffer,buffer.length,InetAddress.getByName(tfIP.getText()),6003);
serverSocket.send(packet);
}
if(rb2.isSelected())
{
if(strbuf.length()>0)
{
ta.append(clientName+": "+strbuf+"\n");
}
tb.setText("");
packet=new DatagramPacket(buffer,buffer.length,InetAddress.getByName(tfIP.getText()),6002);
clientSocket.send(packet);
}
}
catch(Exception e1)
{
e1.printStackTrace();
}
}
if(e.getSource()==btnExit)
{
try
{
tf1.setText("offLine");
btnSend.setEnabled(false);
btnExit.setEnabled(false);
rb1.setEnabled(true);
rb2.setEnabled(true);
ta.setText("");
tb.setText("");
btnCon.setEnabled(true);
if(rb1.isSelected())
{
serverSocket.close();
Thread.currentThread().interrupt();
}
if(rb2.isSelected())
{
clientSocket.close();
Thread.currentThread().interrupt();
}
}
catch(Exception e1)
{
e1.printStackTrace();
}
}
}
};
btnSend.addActionListener(listener);
btnCon.addActionListener(listener);
btnExit.addActionListener(listener);
}
class Server implements Runnable
{
public Server()
{
Thread t=new Thread(this);
t.start();
}
public void run()
{
String s;
InetAddress group=null;
multiSocket=null;
try
{
tf1.setText("已连接");
btnCon.setEnabled(false);
group=InetAddress.getByName("228.5.6.7");
multiSocket=new MulticastSocket(6003);
multiSocket.joinGroup(group);
btnSend.setEnabled(true);
btnExit.setEnabled(true);
while(true)
{
byte[] buffer=new byte[512];
DatagramPacket packet=new DatagramPacket(buffer,buffer.length);
multiSocket.receive(packet);
Thread.sleep(500);
//System.out.println("****************");//此句输不出,没有接收到数据包
String data=new String(packet.getData());
String ip=packet.getAddress().getHostAddress();
int port=packet.getPort();
//ta.append("from "+ip+" port "+port+"says \n"+data.trim()+"\n");
ta.append(userName+":says \n"+data.trim()+"\n");
}
}
catch(Exception e)
{
e.printStackTrace();
}
finally
{
if(multiSocket != null) try{multiSocket.close();}catch(Exception e){e.printStackTrace();}
}
}
}
class Client implements Runnable
{
public Client()
{
new Thread(this).start();
}
public void run()
{
String s;
try
{
btnCon.setEnabled(false);
clientSocket=new DatagramSocket(6002);
ta.append(InetAddress.getLocalHost().getHostName()+"port "+6000+"\n");
btnSend.setEnabled(true);
btnExit.setEnabled(true);
tf1.setText("connectint...");
while(true)
{
byte[] buffer=new byte[512];
DatagramPacket packet=new DatagramPacket(buffer,buffer.length);
clientSocket.receive(packet);
s=new String(packet.getData());
s=s.trim();
if(s.length()>0)
{
//ta.append("\n"+"\nfrom "+packet.getAddress().getHostAddress()+s+"\n");
ta.append(clientName+":says"+s+"\n");
}
Thread.sleep(500);
}
}
catch(Exception e)
{
e.printStackTrace();
}
finally
{
if(clientSocket != null) try{clientSocket.close();}catch(Exception e){e.printStackTrace();}
}
}
}
public void go()
{
f.setVisible(true);
}
public static void main(String[] args)
{
new Chat1().go();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -