package com.qq.main;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.TextArea;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.IOException;
import java.util.Vector;
import javax.swing.DefaultListModel;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
public class GroupChat extends JFrame {
TextArea oldMessageArea;
TextArea sendMessageArea;
JList<String> userlist;
JScrollPane userListPane;
JButton btsend;
JButton btClosed;
String doubleClickedName;
Client client;
String clientName;
JLabel userlistTitle;
Vector<String> users;
String listName;
DefaultListModel<String> listModel;
private JButton button_1;
private JButton button_2;
// 只要服务器端有消息,就将消息显示到oldMessageTextArea
class showOldMessageThread implements Runnable {
public void run() {
boolean flag = true;
while (flag) {
try {
// 接收群聊服务器端回发过来的消息
String serverOutput = client.br.readLine() + "\r\n";
if (serverOutput.endsWith("抖了你一下")) {
doudong();
}
if (!serverOutput.startsWith("私聊") && !serverOutput.startsWith("*")
&& !(serverOutput.substring(serverOutput.indexOf(":") + 1).equals("\r\n"))) {
String s1 = serverOutput.replace('说', ' ');
String s = s1.replaceAll("�", "\r\n ");
oldMessageArea.append(s);
}
// 添加客户端的用户在线列表
if (!serverOutput.startsWith("*") && !serverOutput.startsWith("私聊")
&& (serverOutput.indexOf("说") != -1)) {
listName = serverOutput.substring(0, serverOutput.indexOf('说'));
// 如果JList中有相同名字的用户,则不添加,否则添加
if (!users.contains(listName)) {
System.out.println("用户" + listName + "上线了");
users.add(listName);
userlist.setListData(users);
}
}
// 判断服务器回发过来的消息是不是以"私聊"开头的,是的话就提取出这两个用户名
if (serverOutput.startsWith("私聊")) {
String siliaoName1 = serverOutput.substring(serverOutput.indexOf("*") + 1,
serverOutput.indexOf("和"));
String siliaoName2 = serverOutput.substring(serverOutput.indexOf("和") + 1,
serverOutput.indexOf("\r"));
String siliaoBenshen = "";
String siliaoDuixiangName = "";
if (siliaoName1.equals(clientName)) {
siliaoBenshen = siliaoName1;
siliaoDuixiangName = siliaoName2;
} else {
siliaoBenshen = siliaoName2;
siliaoDuixiangName = siliaoName1;
}
// 判断这两个名字中是否有与自己同名的,有的话就弹出个私聊窗口
if (siliaoName1.equals(clientName) || siliaoName2.equals(clientName)) {
new SingleChat(siliaoBenshen + "和" + siliaoDuixiangName).setVisible(true);
}
}
} catch (IOException e1) {
System.out.println("读取服务器端消息出错");
}
}
}
}
GroupChat(final String clientName) {
addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
// if () {
//
// }
client.ps.println(clientName + " 下线 " + Time.gettime());
client.ps.flush();
dispose();
}
@Override
public void windowOpened(WindowEvent e) {
client.ps.println(clientName + " 上线 " + Time.gettime());
client.ps.flush();
}
});
setResizable(false);
this.clientName = clientName;
client = new Client(clientName);
this.setTitle("欢迎您:" + clientName);
Toolkit tk = Toolkit.getDefaultToolkit();
Dimension screenSize = tk.getScreenSize();
int x = (int) screenSize.getWidth();
int y = (int) screenSize.getHeight();
this.setBounds((x - 600) / 2, (y - 600) / 2, 529, 430);
this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
// 设置已经发出去的消息窗口的属性
oldMessageArea = new TextArea();
oldMessageArea.setFont(new Font("楷体", Font.PLAIN, 14));
oldMessageArea.setEnabled(false);
oldMessageArea.setBounds(19, 22, 359, 256);
// 设置准备发送消息窗口的属性
sendMessageArea = new TextArea(3, 3);
sendMessageArea.setFont(new Font("楷体", Font.PLAIN, 16));
sendMessageArea.setBounds(19, 284, 360, 70);
sendMessageArea.addKeyListener(new KeyAdapter() {
public void keyTyped(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_ENTER) {
String s1 = sendMessageArea.getText();
if (s1.equals("")) {
JOptionPane.showMessageDialog(null, "发送内容不能为空");
} else {
String s = s1.replaceAll("\r\n", "�");
client.ps.println(clientName + "说:" + s + " " + Time.gettime());
sendMessageArea.setText("");
}
}
}
});
// new 一个GroupChat时,此线程启动,获取服务器端回发的消息
new Thread(new showOldMessageThread()).start();
// 设置<发送>按钮的属性
btsend = new JButton("发送");
btsend.setForeground(new Color(0, 0, 255));
btsend.setFont(new Font("楷体", Font.PLAIN, 16));
btsend.setBounds(308, 360, 70, 30);
// 注册<发送>按钮的点击事件
btsend.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
// upLine.setEnabled(false);
String s1 = sendMessageArea.getText();
if (s1.equals("")) {
JOptionPane.showMessageDialog(null, "发送内容不能为空");
} else {
String s = s1.replaceAll("\r\n", "�");
client.ps.println(clientName + "说:" + s + " " + Time.gettime());
sendMessageArea.setText("");
}
}
});
// 设置<关闭>按钮的属性
btClosed = new JButton("关闭");
btClosed.setForeground(new Color(0, 0, 255));
btClosed.setFont(new Font("楷体", Font.PLAIN, 16));
btClosed.setBounds(207, 360, 70, 30);
// 注册<关闭>按钮的点击事件下线提醒
btClosed.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
client.ps.println(clientName + " 下线 " + Time.gettime());
client.ps.flush();
dispose();
}
});
// 设置用户列表JList属性
userlist = new JList();
userlist.setFont(new Font("楷体", Font.PLAIN, 16));
userlist.setBounds(400, 20, 200, 600);
users = new Vector();
// 注册JList的点击事件
userlist.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
if (e.getClickCount() == 2) {
if (GroupChat.this.userlist.getSelectedValue().toString().equals(clientName)) {
JOptionPane.showMessageDialog(null, "不能和自己聊天");
} else {
String SingleChatName = "私聊" + "*" + clientName + "和"
+ GroupChat.this.userlist.getSelectedValue().toString();
client.ps.println(SingleChatName);
}
}
}
});
// 设置用户列表JScrollPane的属性
userListPane = new JScrollPane(userlist, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
userListPane.setBounds(395, 22, 119, 256);
getContentPane().setLayout(null);
// 将所有组件添加到窗体上
getContentPane().add(oldMessageArea);
getContentPane().add(sendMessageArea);
getContentPane().add(btsend);
getContentPane().add(btClosed);
getContentPane().add(userListPane);
// 设置用户列表的标题
userlistTitle = new JLabel(" 我的好友");
userlistTitle.set
没有合适的资源?快使用搜索试试~ 我知道了~
java基于Socket的网络通信
共60个文件
class:36个
jpg:12个
java:9个
需积分: 9 16 下载量 30 浏览量
2015-12-23
11:57:07
上传
评论
收藏 1.65MB ZIP 举报
温馨提示
可以直接运行ServerView运行服务器和客户端
资源推荐
资源详情
资源评论
收起资源包目录
JavaSE_.zip (60个子文件)
JavaSE_
bin
images
44261.jpg 178KB
1.jpg 168KB
445631.jpg 104KB
1277922.jpg 161KB
1245071.jpg 136KB
1182592.jpg 95KB
com
qq
server
ServerView$2.class 1KB
Server$HandleSocket.class 2KB
ServerView$1.class 753B
ServerView.class 4KB
ServerView$3$1.class 906B
Server.class 2KB
Server$SocketListener.class 1KB
ServerView$3.class 840B
regist
UserInformation.class 2KB
RegistView$4.class 811B
RegistView.class 5KB
RegistView$2.class 814B
RegistView$6.class 868B
RegistView$5.class 2KB
RegistView$1.class 806B
RegistView$3.class 1KB
main
SingleChat.class 3KB
MainView$1.class 687B
GroupChat$1.class 1KB
GroupChat$4.class 1KB
MainView$2.class 2KB
GroupChat$3.class 2KB
Time.class 573B
GroupChat$7.class 677B
SingleChat$2.class 714B
GroupChat$8.class 1KB
SingleChat$1.class 1KB
GroupChat$5.class 2KB
GroupChat$showOldMessageThread.class 3KB
MainView.class 4KB
SingleChat$showOldMessageThread.class 3KB
GroupChat$9.class 968B
GroupChat.class 6KB
GroupChat$2.class 2KB
Client.class 2KB
GroupChat$6.class 677B
.settings
org.eclipse.core.resources.prefs 155B
src
images
44261.jpg 178KB
1.jpg 168KB
445631.jpg 104KB
1277922.jpg 161KB
1245071.jpg 136KB
1182592.jpg 95KB
com
qq
server
Server.java 3KB
ServerView.java 4KB
regist
UserInformation.java 1KB
RegistView.java 7KB
main
MainView.java 6KB
GroupChat.java 11KB
SingleChat.java 5KB
Time.java 249B
Client.java 1KB
.project 409B
.classpath 232B
共 60 条
- 1
资源评论
点角的时光
- 粉丝: 7
- 资源: 7
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功