package com.mingrisoft;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Font;
import java.awt.Frame;
import java.awt.Image;
import java.awt.MenuItem;
import java.awt.PopupMenu;
import java.awt.SystemTray;
import java.awt.TrayIcon;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.net.URL;
import java.net.UnknownHostException;
import java.text.DateFormat;
import java.util.Date;
import java.util.Vector;
import javax.swing.DefaultComboBoxModel;
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.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
public class ChatClientFrame extends JFrame {
private JTextField tf_newUser;
private JList user_list;
private JTextArea ta_info;
private JTextField tf_send;
private ObjectOutputStream out;// 声明输出流对象
private boolean loginFlag = false;// 为true时表示已经登录,为false时表示未登录
public static void main(String args[]) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
ChatClientFrame frame = new ChatClientFrame();
frame.setVisible(true);
frame.createClientSocket();// 调用方法创建套接字对象
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
public void createClientSocket() {
try {
Socket socket = new Socket("192.168.1.122", 1982);// 创建套接字对象
out = new ObjectOutputStream(socket.getOutputStream());// 创建输出流对象
new ClientThread(socket).start();// 创建并启动线程对象
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
class ClientThread extends Thread {
Socket socket;
public ClientThread(Socket socket) {
this.socket = socket;
}
public void run() {
try {
BufferedReader in = new BufferedReader(new InputStreamReader(
socket.getInputStream()));// 创建输入流对象
DefaultComboBoxModel model = (DefaultComboBoxModel) user_list
.getModel();// 获得列表框的模型
while (true) {
String info = in.readLine().trim();// 读取信息
if (!info.startsWith("MSG:")) {// 接收到的不是消息
if (info.startsWith("退出:")) {// 接收到的是退出消息
model.removeElement(info.substring(3));// 从用户列表中移除用户
} else {// 接收到的是登录用户
boolean itemFlag = false;// 标记是否为列表框添加列表项,为true不添加,为false添加
for (int i = 0; i < model.getSize(); i++) {// 对用户列表进行遍历
if (info.equals((String) model.getElementAt(i))) {// 如果用户列表中存在该用户名
itemFlag = true;// 设置为true,表示不添加到用户列表
break;// 结束for循环
}
}
if (!itemFlag) {
model.addElement(info);// 将登录用户添加到用户列表
}
}
} else {// 如果获得的是消息,则在文本域中显示接收到的消息
DateFormat df = DateFormat.getDateInstance();// 获得DateFormat实例
String dateString = df.format(new Date()); // 格式化为日期
df = DateFormat.getTimeInstance(DateFormat.MEDIUM);// 获得DateFormat实例
String timeString = df.format(new Date()); // 格式化为时间
String sendUser = info.substring(4,info.indexOf(":发送给:"));// 获得发送信息的用户
String receiveInfo = info.substring(info.indexOf(":的信息是:")+6);// 获得接收到的信息
ta_info.append(" "+sendUser + " " +dateString+" "+timeString+"\n "+receiveInfo+"\n");// 在文本域中显示信息
ta_info.setSelectionStart(ta_info.getText().length()-1);// 设置选择起始位置
ta_info.setSelectionEnd(ta_info.getText().length());// 设置选择的结束位置
tf_send.requestFocus();// 使发送信息文本框获得焦点
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
private void send() {
if (!loginFlag) {
JOptionPane.showMessageDialog(null, "请先登录。");
return;// 如果用户没登录则返回
}
String sendUserName = tf_newUser.getText().trim();// 获得登录用户名
String info = tf_send.getText();// 获得输入的发送信息
if (info.equals("")) {
return;// 如果没输入信息则返回,即不发送
}
Vector<String> v = new Vector<String>();// 创建向量对象,用于存储发送的消息
Object[] receiveUserNames = user_list.getSelectedValues();// 获得选择的用户数组
if (receiveUserNames.length <= 0) {
return;// 如果没选择用户则返回
}
for (int i = 0; i < receiveUserNames.length; i++) {
String msg = sendUserName + ":发送给:" + (String) receiveUserNames[i]
+ ":的信息是: " + info;// 定义发送的信息
v.add(msg);// 将信息添加到向量
}
try {
out.writeObject(v);// 将向量写入输出流,完成信息的发送
out.flush();// 刷新输出缓冲区
} catch (IOException e) {
e.printStackTrace();
}
DateFormat df = DateFormat.getDateInstance();// 获得DateFormat实例
String dateString = df.format(new Date()); // 格式化为日期
df = DateFormat.getTimeInstance(DateFormat.MEDIUM);// 获得DateFormat实例
String timeString = df.format(new Date()); // 格式化为时间
String sendUser = tf_newUser.getText().trim();// 获得发送信息的用户
String receiveInfo = tf_send.getText().trim();// 显示发送的信息
ta_info.append(" "+sendUser + " " +dateString+" "+timeString+"\n "+receiveInfo+"\n");// 在文本域中显示信息
tf_send.setText(null);// 清空文本框
ta_info.setSelectionStart(ta_info.getText().length()-1);// 设置选择的起始位置
ta_info.setSelectionEnd(ta_info.getText().length());// 设置选择的结束位置
tf_send.requestFocus();// 使发送信息文本框获得焦点
}
/**
* Create the frame
*/
public ChatClientFrame() {
super();
setTitle("聊天室客户端");
setBounds(100, 100, 385, 288);
final JPanel panel = new JPanel();
getContentPane().add(panel, BorderLayout.SOUTH);
final JLabel label = new JLabel();
label.setText("输入聊天内容:");
panel.add(label);
tf_send = new JTextField();
tf_send.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
send();// 调用方法发送信息
}
});
tf_send.setPreferredSize(new Dimension(180, 25));
panel.add(tf_send);
没有合适的资源?快使用搜索试试~ 我知道了~
Java经典编程300例源代码
共2471个文件
class:515个
java:448个
classpath:296个
需积分: 50 40 下载量 57 浏览量
2019-08-01
09:43:39
上传
评论 2
收藏 28.36MB ZIP 举报
温馨提示
Java经典编程300例源代码
资源推荐
资源详情
资源评论
收起资源包目录
Java经典编程300例源代码 (2471个子文件)
orcl17.bat 848B
ChatClientFrame.class 8KB
BreakPointSuperveneFrame.class 7KB
ServerSocketFrame.class 6KB
ServerSocketFrame.class 6KB
ServerSocketFrame.class 6KB
ClientSocketFrame.class 6KB
ClientSocketFrame.class 6KB
ClientSocketFrame.class 6KB
DateSilder.class 6KB
TableSelectModeTest.class 6KB
VoteSystem.class 6KB
ClientOneToOne_ClientFrame.class 6KB
SynchronizedBankFrame.class 5KB
Notepad.class 5KB
Calculator.class 5KB
ControlFormStatus.class 5KB
ThreadPriorityTest.class 5KB
TableColumnWidthTest.class 5KB
ClientSocketFrame.class 5KB
InfoInputDialog.class 5KB
SearchTable.class 5KB
ClientSocketFrame.class 5KB
ArrayExample.class 5KB
SuperFun.class 5KB
FontChooser.class 5KB
ServerSocketFrame.class 5KB
ServerSocketFrame.class 5KB
DatabaseClientFrame.class 4KB
ServerSocketFrame.class 4KB
CurstomNameSave.class 4KB
SortArray.class 4KB
ClientSocketFrame.class 4KB
ClientSocketFrame.class 4KB
MessageDialog.class 4KB
ReverseSort.class 4KB
ProxySelectorFrame.class 4KB
ServerSocketFrame.class 4KB
DiningPhilosophersFrame.class 4KB
DatabaseServerFrame.class 4KB
ClientSocketFrame.class 4KB
ChatServerFrame.class 4KB
ChatServerFrame$ServerThread.class 4KB
UserProxyFrame.class 4KB
GainAllIpFrame.class 4KB
ServerSocketFrame.class 4KB
TransactionFrame.class 4KB
QuickSort.class 4KB
JListTest.class 4KB
SynchronizedBankFrame.class 4KB
RaceFrame.class 4KB
SynchronizedBankFrame.class 4KB
SelectSort.class 4KB
SingleThreadDownloadFrame.class 4KB
InternetContentFrame.class 4KB
ColorChooser.class 4KB
DownloadSoft.class 4KB
FrameIcon.class 4KB
ResizeTableTest.class 4KB
ArrayMinValue.class 4KB
CustomSelectFileType.class 4KB
ClientOneToMany_ClientFrame.class 4KB
PicPreviewFileSelectDialog.class 4KB
SortedTable.class 4KB
TipOfDay.class 4KB
ToolTipHeaderTableExample.class 4KB
JCheckBoxTest.class 4KB
MultiThreadDownFrame.class 3KB
ClientOneToOne_ServerFrame$ServerThread.class 3KB
StopThreadTest.class 3KB
CharCount.class 3KB
JRadioButtonTest.class 3KB
MessageDialogIcon.class 3KB
JPasswordFieldTest.class 3KB
InsertSort.class 3KB
BubbleSort.class 3KB
ChatClientFrame$ClientThread.class 3KB
GetDescribe.class 3KB
ImageViewer.class 3KB
StartFormByLClosePosition.class 3KB
PopupMenuTest.class 3KB
CheckPhoneNum.class 3KB
ArrayCreateTable.class 3KB
SevenStar.class 3KB
StringConvert.class 3KB
CheckUsername.class 3KB
CustomDialog.class 3KB
Philosopher.class 3KB
StringUtils.class 3KB
CheckBoxArray.class 3KB
Test.class 3KB
HorizontalMenuTest.class 3KB
RandomBackgroundImage.class 3KB
InternetSizeFrame.class 3KB
ClassDeclarationViewer.class 3KB
ServerSocketFrame.class 3KB
ToolTipListTest.class 3KB
JComboBoxTest.class 3KB
ToolBarTest.class 3KB
ClientOneToMany_ServerFrame.class 3KB
共 2471 条
- 1
- 2
- 3
- 4
- 5
- 6
- 25
资源评论
普通网友
- 粉丝: 20
- 资源: 71
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功