📄 clientmain.java
字号:
package cr;
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Vector;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextArea;
import javax.swing.JTextField;
/*
*聊天室客户端的初始化类
*/
public class ClientMain extends JFrame implements ActionListener,Runnable{
ListTable ltaOnline; //在线用户的列
JTextArea jtaChats; //聊天记录的显示区
JTextField jtfChat; //发言内容的输入框
JTextField jtfObject; //发言针对对象
JLabel jlaOnlineSum; //在线人数
String strInetAddress; //存放服务器地址
PrintWriter pwrTemp=null; //与服务器相连接的输出流
BufferedReader breTemp=null;
Thread t;
public ClientMain() {
//初始化主界面
super("Xiang的聊天室的客户端");
this.setSize(620,500);
Container conMain=this.getContentPane();
this.setDefaultCloseOperation(3);
jtaChats=new JTextArea();
ltaOnline=new ListTable();
JPanel jpaDown=new JPanel();
JButton jbuSend=new JButton("发言");
jbuSend.addActionListener(this);
jlaOnlineSum=new JLabel("0");
jtfChat=new JTextField(25);
jtfObject=new JTextField(" 所有人 ");
jtfObject.setEditable(false);
jpaDown.add(new JLabel("对:"));
jpaDown.add(jtfObject);
jpaDown.add(new JLabel("说:"));
jpaDown.add(jtfChat);
jpaDown.add(jbuSend);
jpaDown.add(new JLabel("在线人数:"));
jpaDown.add(jlaOnlineSum);
conMain.add(new JScrollPane(jtaChats),BorderLayout.CENTER);
conMain.add(ltaOnline,BorderLayout.EAST);
conMain.add(jpaDown,BorderLayout.SOUTH);
this.setVisible(true);
this.validate();
//以下是要求用户输入服务器IP的对话框
JTextField jtfInetAddress=new JTextField();
JOptionPane.showMessageDialog(this,jtfInetAddress,"请输入服务器端的IP地址",JOptionPane.INFORMATION_MESSAGE);
strInetAddress=jtfInetAddress.getText().trim();
//建立连接
listenConnect();
}
//与服务器建立连接并进行通信
void listenConnect(){
Socket socConnect=null; //与服务器连接的套接字
String strTemp=""; //临时字符串变量
InetAddress iadTemp=null; //服务器地址对象
ClientConnectListen ccl=new ClientConnectListen();
// int intSum=1;
try {
iadTemp = InetAddress.getByName(strInetAddress); //创建服务器地址对象
try {
socConnect = new Socket(iadTemp,4000); //创建与服务器连接的套接字
try { //获取与服务器连接的输入输出流
breTemp = new BufferedReader(new InputStreamReader(socConnect.
getInputStream()));
pwrTemp=new PrintWriter(socConnect.getOutputStream(),true);
//获取在线聊友列表并起一个合法的昵称
if (this.getOnlineList()==false){ //在这个过程中出现异常给出提示
jtaChats.append("获取在线聊友列表或与服务器通信时失败!"+"\n");
}
} catch (IOException ex2) {
jtaChats.append("获取IO流失败!"+"\n"); //获取IO流出现异常给出提示
}
} catch (IOException ex) {
jtaChats.append("建立Socket失败!"+"\n"); //建立Socket出现异常给出提示
}
} catch (UnknownHostException ex1) {
jtaChats.append("你所输入的IP无效!"+"\n"); //所输入的IP无效则给出提示
}
ccl= new ClientConnectListen(socConnect,this);
ccl.start();
// while(true){
// ExecutorService exec=Executors.newCachedThreadPool();
// try {
//
// String result=exec.submit(new Listenwords(breTemp)).get();
// if (result.equals("ADD")){ //“ADD”消息的下一次消息发送的是要添加的聊友昵称
// ltaOnline.addElement(breTemp.readLine()); //加到在线聊友昵称列表
// // ltaOnline.refurbish(); //刷新显示
// jlaOnlineSum.setText(""+ltaOnline.getSum()); //更新在线人数
// }
// else {
// if (result.equals("DEL")){ //“DEL”消息的下一次消息发送的是要删除的聊友昵称
// ltaOnline.delElement(breTemp.readLine()); //在线聊友昵称列表中删除
// // ltaOnline.refurbish(); //刷新显示
// jlaOnlineSum.setText(""+ltaOnline.getSum()); //更新在线人数
// }
// else {
// jtaChats.append(result+ "\n"); //聊天信息追加到聊天记录区
// }
// }
// } catch (InterruptedException e) {
// jtaChats.append("接收服务器信息时出错,可能是服务器已关闭\n");
// } catch (ExecutionException e) {
// jtaChats.append("接收服务器信息时出错,可能是服务器已关闭\n");
// } catch (IOException e) {
// jtaChats.append("接收服务器信息时出错,可能是服务器已关闭\n");
// }
// }
}
// public void runTask(){
// if(null==t){
// t=new Thread(this){
// public void run(){
// try {
// String strTempq;
// while ((strTemp=breTemp.readLine())!=null) {
// if (strTemp.equals("ADD")){ //“ADD”消息的下一次消息发送的是要添加的聊友昵称
// ltaOnline.addElement(breTemp.readLine()); //加到在线聊友昵称列表
// // ltaOnline.refurbish(); //刷新显示
// jlaOnlineSum.setText(""+ltaOnline.getSum()); //更新在线人数
// }
// else {
// if (strTemp.equals("DEL")){ //“DEL”消息的下一次消息发送的是要删除的聊友昵称
// ltaOnline.delElement(breTemp.readLine()); //在线聊友昵称列表中删除
// // ltaOnline.refurbish(); //刷新显示
// jlaOnlineSum.setText(""+ltaOnline.getSum()); //更新在线人数
// }
// else {
// jtaChats.append(strTemp+ "\n"); //聊天信息追加到聊天记录区
// }
// }
// sleep(10);
// }
// }catch (IOException ex) {
//
// } catch (InterruptedException e) {
// jtaChats.append("接收服务器信息时出错,可能是服务器已关闭\n");
// }
// }
// };
// }
// }
//获取在线聊友列表并起一个合法的昵称
public boolean getOnlineList(){
boolean booTemp=true; //标记本方法是否正常执行的变量
try{
String strTemp=""; //字符串临时变量
strTemp=breTemp.readLine(); //获取在线聊友人数
int intTemp=Integer.parseInt(strTemp); //转换为整型
for (int i=0;i<intTemp;i++){ //循环获取在线聊友昵称
strTemp=breTemp.readLine().trim();
ltaOnline.addElement(strTemp);
}
// ltaOnline.refurbish(); //刷新列表显示
//提示用户输入一个昵称
JTextField jtfName=new JTextField(25);
JOptionPane.showMessageDialog(this,jtfName,
"请输入您的昵称,注意最好不要取已经在使用的",JOptionPane.INFORMATION_MESSAGE);
String strName=jtfName.getText().trim();
pwrTemp.println(strName);
if (breTemp.readLine().equals("TRUE")){ //用户所取的昵称有重复
strName=breTemp.readLine(); //接收服务器强制更改后的昵称
jtaChats.append("由于您的昵称已经有人在使用,所以被服务器强制改为:"+strName+"\n"); //提示用户
}
}catch(IOException ex){booTemp=false;} //出现异常置标志为FALSE
return booTemp;
}
//定义在线聊友列表的内嵌类
class ListTable extends JPanel implements MouseListener{
private BaTable jtaMain; //用于显示聊友昵称的表
private Vector vecHead, //表头
vecData; //数据体
ListTable(){
super();
vecHead=new Vector();
vecData=new Vector();
// Vector vecRow=new Vector();
vecHead.add("");
jtaMain=new BaTable(vecData,vecHead); //创建一个初始列表
jtaMain.addMouseListener(this); //加鼠标监听
this.add(jtaMain);
}
//在表中增加一个聊友昵称
void addElement(String strElement){
Vector vecRow=new Vector();
vecRow.add(strElement);
vecData.add(vecRow);
jtaMain.revalidate();
}
//在表中删除一个聊友昵称
void delElement(String strElement){
Vector vecRow=new Vector();
vecRow.add(strElement);
vecData.removeElement(vecRow);
jtaMain.revalidate();
}
//获取列表中的人数
int getSum(){
return vecData.size()-1; //减去“所有人”项
}
//判断某个昵称是否有人在使用
boolean isBeing(String strElement){
Vector vecRow=new Vector();
vecRow.add(strElement);
return vecData.contains(vecRow);
}
//获取某个序号的聊友昵称
String isName(int intTemp){
Vector vecRow=(Vector)vecData.get(intTemp);
return (String)vecRow.get(0);
}
//获取某个昵称的聊友的序号
int getIndex(String strName){
Vector vecRow=new Vector();
vecRow.add(strName);
return vecData.indexOf(vecRow);
}
public void mouseClicked(MouseEvent e) {
}
public void mousePressed(MouseEvent e) {
//在聊友列表中点击某个聊友时,将其昵称填入到聊天对象框中
jtfObject.setText((String)jtaMain.getValueAt(jtaMain.getSelectedRow(),0));
}
public void mouseReleased(MouseEvent e) {
}
public void mouseEntered(MouseEvent e) {
}
public void mouseExited(MouseEvent e) {
}
}
//继承一个JTable,将表项的缺省模式改为不可编辑
public class BaTable extends JTable{
public BaTable(){super();} //缺省构造方法
public BaTable(Vector data, Vector head){ //向量构造方法
super(data,head);
}
public boolean isCellEditable(int row,int column){
return false; } //表项不可编辑
}
public static void main(String args[]){
new ClientMain();
}
public void actionPerformed(ActionEvent e) {
pwrTemp.println(jtfObject.getText().trim()+"\1"+jtfChat.getText());
//将发言内容发送到服务器,聊天对象与发言内容之间用“\1”分割
}
public void run() {
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -