/**
* 微小型局域网聊天室客户端
* */
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.StringTokenizer;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.ScrollPaneConstants;
public class Client extends JFrame {
JPanel np = new JPanel();
JPanel ep = new JPanel();
JPanel epp = new JPanel();
JPanel wp = new JPanel();
JLabel userName = new JLabel("用户昵称:");
JTextField userJTF = new JTextField(10);
JTextField yourMsg = new JTextField(17);
JButton login = new JButton("登录");
JButton exit = new JButton("退出");
JButton sendJB = new JButton("发送");
JTextArea userMsg = new JTextArea(15, 30);
JTextArea userList = new JTextArea(15, 10);
JComboBox jcb;
PrintStream ps;
Socket socket;
StringBuffer sb;
String loginName;
InputStreamReader isr;
// 界面设置
public Client() {
Container cti = this.getContentPane();
cti.setBackground(Color.white);
// 用户登录块
login.addActionListener(new ButtonShiJian());
exit.addActionListener(new ButtonShiJian());
userJTF.setBorder(BorderFactory.createLineBorder(new Color(122, 138, 153), 1));
userJTF.setText("汉字不能超过4个,英文不能超过8个!");
np.add(userName);
np.add(userJTF);
np.add(login);
np.add(exit);
np.setBackground(Color.white);
cti.add(np, BorderLayout.NORTH);
// 消息显示块
JScrollPane userMsgScroll = new JScrollPane(userMsg);
userMsgScroll.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
userMsg.setEditable(false);
userMsgScroll.setBorder(BorderFactory.createTitledBorder("消息显示区"));
userMsgScroll.setBackground(Color.white);
ep.add(userMsgScroll, null);
userMsg.setLineWrap(true);
yourMsg.setBorder(BorderFactory.createLineBorder(new Color(122, 138,153), 1));
epp.add(yourMsg, null);
sendJB.addActionListener(new ButtonShiJian());
epp.add(sendJB, null);
jcb = new JComboBox();
jcb.setBounds(0, 0, 20, 20);
epp.add(jcb, null);
jcb.addItem("大家");
epp.setBackground(Color.white);
ep.setBackground(Color.white);
ep.add(epp, null);
cti.add(ep, BorderLayout.CENTER);
// 用户列表块
JScrollPane userListScroll = new JScrollPane(userList);
userListScroll.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
userListScroll.setBorder(BorderFactory.createTitledBorder("在线用户"));
userListScroll.setBackground(Color.white);
wp.add(userListScroll, BorderLayout.CENTER);
wp.setBackground(Color.white);
userList.setEditable(false);
userList.setLineWrap(true);
cti.add(wp, BorderLayout.EAST);
// 设置主窗体
this.setTitle("欢迎进入JAVA一条虫的聊天室!");
this.setDefaultCloseOperation(3);
this.setBounds(500, 50, 485, 415);
this.setResizable(false);
this.setVisible(true);
}
public static void main(String[] args) {
new Client();
}
// 接收及发送消息
class allMsg extends Thread {
Socket socket;
BufferedReader br;
allMsg(Socket socket) {
this.socket = socket;
}
public void run() {
while (true) {
try {
isr = new InputStreamReader(socket.getInputStream());
br = new BufferedReader(isr);
String msg = br.readLine();
clMsg(msg);
} catch (IOException e) {
userMsg.append("和服务器的连接断开!\n");
try {
socket.close();
break;
} catch (IOException e1) {
// TODO 自动生成catch语句
e1.printStackTrace();
}
e.printStackTrace();
}
}
}
}
public void clMsg(String msg) {
if (msg != null) {
StringTokenizer st = new StringTokenizer(msg, ":");
String word = st.nextToken();
String[] str = new String[2];
// 接收消息,更新用户列表
if (word.equals("userList")) {
jcb.removeAllItems();
jcb.addItem("大家");
userList.setText("");
while (st.hasMoreTokens()) {
String string = st.nextToken();
jcb.addItem(string + "\n");
userList.append(string + "\n");
}
// 如果取出的名字和自己的相同,这个就是别人发给你的密语
} else if (word.equals(userJTF.getText().trim())) {
int i = 0;
while (st.hasMoreTokens()) {
str[i] = st.nextToken();
i++;
}
userMsg.append(str[0] + "悄悄对您说:" + str[1] + "\n");
// 如果取出的名字是大家,就是群发公共消息
} else if (word.equals("大家")) {
int i = 0;
while (st.hasMoreTokens()) {
str[i] = st.nextToken();
i++;
}
userMsg.append(str[0] + " 对 " + word + " 说:" + str[1] + "\n");
}
}
}
// 定义按钮事件
class ButtonShiJian implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
loginName = userJTF.getText();
// 登录,getSource最初按下的对象
if (e.getSource() == login) {
// 如果用户名不为空
if (!loginName.equals("") && loginName.length() < 9) {
try {
socket = new Socket(InetAddress.getLocalHost(), 5168);
if (socket != null) {
ps = new PrintStream(socket.getOutputStream());
sb = new StringBuffer("login:");
// 把你的登录名加到去,变成"login:loginName",loginName是得到的登录名
sb.append(loginName);
ps.println(sb);
ps.flush();
// 使按登录按钮,名字输入框不可操作
userJTF.setEnabled(false);
login.setEnabled(false);
userMsg.setText("");
allMsg am = new allMsg(socket);
am.start();
}
} catch (UnknownHostException e1) {
// TODO 自动生成catch语句
e1.printStackTrace();
} catch (IOException e1) {
// TODO 自动生成catch语句
e1.printStackTrace();
}
} else {
userMsg.append("名字错语或者英文的长度大于8!");
}
// 发送消息
} else if (e.getSource() == sendJB) {
// 依次取出接收者的名字、发送者的名字、内容
String str01 = ((String) jcb.getSelectedItem()).trim();
String str02 = userJTF.getText().trim();
String str03 = yourMsg.getText();
if (!str03.equals("")) {
sb = new StringBuffer(str01 + ":" + str02 + ":" + str03);
if (str01 != "大家") {
userMsg.append("您 " + "悄悄对 " + str01 + " 说:" + str03 + "\n");
}
ps.println(sb);
ps.flush();
yourMsg.setText("");
} else {
userMsg.append("请不要刷屏!谢谢!\n");
}
// 退出
} else if (e.getSource() == exit) {
try {
// 发送退出信号和登录名
ps.println(new StringBuffer("exitLogin:" + userJTF.getText()));
ps.flush();
socket.close();
// 使登录按钮和名字输入框恢复可操作状态
login.setEnabled(true);
userJTF.setEnabled(true);
userMsg.setText("和服务器的连接断开!\n");
} catch (IOException e1) {
// TODO 自动生成catch语句
e1.printStackTrace();
}
}
}
}
}
JAVA一条虫小型聊天室.rar
需积分: 0 79 浏览量
2009-01-06
23:14:16
上传
评论
收藏 57KB RAR 举报
北境守護
- 粉丝: 1
- 资源: 12
最新资源
- 基于python的高性能爬虫程序,使用了多线程+缓存+xpath实现的,这里以彼-岸图库为例,实现,仅用于学习交流
- 中分辨率成像光谱仪(MODIS)烧毁面积产品信息MODIS-C6-BA-User-Guide-1.2.pdf
- Screenshot_20240427_172613_com.huawei.browser.jpg
- 关于学习Python的相关资源网站链接及相关介绍.docx
- (HAL库)基于STM32F103C8T6的温控PID系统[Dht11、ESP8266、无线透传、L298N……]
- VoLTE高丢包优化指导书.xlsx
- Rust资源文件.zip
- 前后端分离实践:使用 React 和 Express 搭建完整登录注册流程
- gradle-publish-to-MavenLocal.zip
- 10份网络优化创新案例.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈