📄 clients.java
字号:
{ JTextField field;
JButton button;
ChangeName(String str,int x,int y)
{
JLabel input=new JLabel("请输入名字:");
field=new JTextField(6);
button=new JButton("确定");
button.addActionListener(this);
JPanel jp=new JPanel();
jp.add(input);
jp.add(field);
add(jp,BorderLayout.CENTER);
JPanel panel=new JPanel();
panel.add(button);
add(panel,BorderLayout.SOUTH);
setBounds(x,y,200,100);
setVisible(true);
}
public void actionPerformed(ActionEvent e)
{
if(e.getSource()==button)
{
clientname=field.getText().trim();
me.setName(clientname);
setVisible(false);
}
}
}
/**
* 这个内部类是用来实现用户的群聊功能
* 建立了两个线程,一个是用来发信息给服务程序的
* 线程,一个是用来接收服务程序发来的广播信息并
* 显示给用户
*
*/
public class GroupChat implements Runnable
{
MulticastSocket socket=null;
InetAddress address=null;
ChatFrameTest frame=null;
byte[] by=new byte[800];
String str;
Thread t=null;
SendMessage sendmessage=null;
boolean stop=false;
Date d=null;
GroupChat()
{
frame=new ChatFrameTest("123",Color.pink);
d=new Date();
try
{
socket=new MulticastSocket(8866);
address=InetAddress.getByName("239.253.253.2");//这些是广播通信的程序,IP是自定义的
socket.joinGroup(address);//加入广播组
}
catch(Exception e)
{
e.printStackTrace();
}
sendmessage=new SendMessage();//启动发送信息的线程
t=new Thread(this);
t.start();
}
public void run()
{
while(!stop)
{
DatagramPacket packet=new DatagramPacket(by,by.length,address,8866);
try
{
System.out.println("berfordfjdfjasaaaaaaa");
socket.receive(packet);//这个上一个用来接收服务器发来的信息
System.out.println("skdfksdfksdflsdflsdfjlsdflsldfjlsdjfksdfkdkfjlasdjk");
str=new String(packet.getData(),0,packet.getLength());
StringTokenizer st=new StringTokenizer(str,"^");
String s=st.nextToken();
if("ADD".equals(s))//如果S为ADD则说明有新的用户上线了,所以要在界面上显示,并把其个人信息保存到列表中
{
String str=st.nextToken();
StringTokenizer stt=new StringTokenizer(str,",");
int num=Integer.parseInt(stt.nextToken());
if(!isExist(num))
{
Friends f=new Friends(str,false);
list.add(f);
mainpanel.addClient(f);
mainpanel.setSize(w, ++h);
System.out.println("add friends:"+f.acountip);
}
}
else if("REMOVE".equals(s))//如果S为REMOVE则表示有用户下线了,也要在界面上显示他,并将其从列表中删除
{
mainpanel.removeCliends(st.nextToken());
mainpanel.setSize(w, --h);
System.out.println("remove a friend");
}
else if("CHAT".equals(s))//如果S为CHAT则说明是一般的群聊,显示其内容就行了
{
frame.showMessage(st.nextToken());
}
else if("SINGLECHAT".equals(s))//如果S为SINGLECHAT则说明有用户想请求单
{
StringTokenizer sstt=new StringTokenizer(st.nextToken(),",");
String ss=sstt.nextToken();
if(name.equals(ss))//如果ss和用户的用户名相同则说明是服务程序发给自己的,所以才会做处理,否则什么都不做.
{
String clientname=sstt.nextToken();//取得请求方的用户名
chatSign(clientname);//在界面上显示出来
}
}
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
/**
* 这个方法用来停止循环,关闭socket
*
*/
public void stop()
{
stop=true;
if(sendmessage.socket!=null)
{
sendmessage.socket.close();
socket=null;
}
sendmessage=null;
t=null;
if(socket!=null)
{
socket.close();
socket=null;
}
}
/**
* 这个是专门用来发送用户的信息的线程类,就是接收到一个用户发来的信息,经过处理后
* 再将信息群发
* @author 黄祖光
*/
private class SendMessage
{
DatagramSocket socket=null;
InetAddress address=null;
int port=6688;
byte[] by=new byte[800];
SendMessage()
{
try
{
socket=new DatagramSocket();
address=InetAddress.getByName(serverport);
}
catch(Exception e)
{
e.printStackTrace();
}
}
/**
* 用来发送群聊的内容
* @param s
*/
private void sendMessage(String s)
{
try
{
if(!"".equals(s))
{
by=("CHAT#"+(d.getYear()+1900)+"-"+(d.getMonth()+1)+"-"+d.getDate()+" "+d.getHours()+
":"+(d.getMinutes()+1)+":"+(d.getSeconds()+1)+"\n"+name+" :"+s).getBytes();
DatagramPacket packet=new DatagramPacket(by,by.length,address,port);
socket.send(packet);
}
else
{
frame.tshow.append("发送内容不能为空!!\n");
}
}
catch(Exception e)
{
System.out.println(e);
}
}
/**
* 这个方法是用专门发送用户单聊请求信息的
* @param s
*/
private void sendClientInf(String s)
{
try
{ byte[] b=("SINGLECHAT#"+s+","+name).getBytes();
DatagramPacket packet =new DatagramPacket(b,b.length,address,port);
socket.send(packet);
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
/**
* 这个是个群聊界面的类,用来提供群聊的界面
* @author 55
*
*/
private class ChatFrameTest extends JFrame implements ActionListener//这个聊天窗口是专门用来群聊的,用这类是为了与单独聊天区分开来
{
JTextArea tshow,twrite;
JButton send,close;
JPanel tp,bp;
String str,received,name;
Dimension dim;
int port;
boolean closed=false;
public ChatFrameTest(String name,Color color)
{
this.name=name;
setTitle("群聊");
setSize(530,300);
tshow=new JTextArea(9,45);
tshow.setFont(new Font("SansSerif",Font.BOLD,12));
tshow.setEditable(false);
JScrollPane scrollpane=new JScrollPane(tshow);
twrite=new JTextArea(3,45);
twrite.setFont(new java.awt.Font("SansSerif", Font.BOLD, 12));
twrite.setEnabled(true);
twrite.setLineWrap(true);
JScrollPane wjsp=new JScrollPane(twrite);
tp=new JPanel();
tp.setBackground(color);
//tp.setBackground(Color.orange);
tp.add(scrollpane,BorderLayout.NORTH);
tp.add(wjsp,BorderLayout.SOUTH);
add(tp,BorderLayout.CENTER);
send=new JButton("发送");
send.addActionListener(this);
close=new JButton("关闭");
close.addActionListener(this);
bp=new JPanel();
bp.setBackground(color);
bp.add(send);
bp.add(close);
add(bp,BorderLayout.SOUTH);
Toolkit kit=Toolkit.getDefaultToolkit();
dim=kit.getScreenSize();
setLocation((dim.width-500)/2,(dim.height-300)/2 );
twrite.addKeyListener(new KeyAdapter()
{
public void keyPressed(KeyEvent ke)
{
if(ke.getKeyCode()==KeyEvent.VK_ENTER&&ke.isControlDown())//当按Ctrl+Enter时就将消息发送出去
{
str=twrite.getText();
sendmessage.sendMessage(str);
str=null;
twrite.setText("");
}
}
});
addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent we)
{
new WarmDialog("谢谢使用","哈哈..").setVisible(true);
}
});
}
/**
* 用来监听按钮事件,发送消息和关闭对话框
*/
public void actionPerformed(ActionEvent ae)
{
if(ae.getSource()==send)
{
str=twrite.getText();
sendmessage.sendMessage(str);
str=null;
twrite.setText("");
}
else if(ae.getSource()==close)
{
System.out.println("groudchat is closed..");
setVisible(false);
}
}
public String getString()
{
return str;
}
/**
* 显示聊天内容
* @param str
*/
public void showMessage(String str)
{
tshow.append(str+"\n");
}
}
}
public static void main(String[] args)
{
new Clients().setResizable(true);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -