📄 servermain.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.ServerSocket;
import java.net.Socket;
import java.util.Vector;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextArea;
import javax.swing.JTextField;
public class ServerMain extends JFrame implements ActionListener{
ListTable ltaOnline; //在线用户的列表
JTextArea jtaChats; //聊天记录的显示区
JTextField jtfChat; //发言内容的输入框
JTextField jtfObject; //发言针对对象
JLabel jlaOnlineSum; //在线人数
JButton jbuKick; //“踢”按钮
JButton jbuSend; //“发言”按钮
ConnectPond cpoOnline; //联接池对象
Vector vecConnectListener; //连接监听对象存放向量
public ServerMain() {
//初始化主界面
super("Xiang的聊天室的服务器端");
this.setSize(620,500);
Container conMain=this.getContentPane();
this.setDefaultCloseOperation(3);
jtaChats=new JTextArea();
ltaOnline=new ListTable();
cpoOnline=new ConnectPond();
JPanel jpaDown=new JPanel();
jbuKick=new JButton("踢");
jbuKick.addActionListener(this);
jbuSend=new JButton("发言");
jbuSend.addActionListener(this);
jlaOnlineSum=new JLabel("0");
jtfChat=new JTextField(25);
jtfObject=new JTextField(" 所有人 ");
jtfObject.setEditable(false);
jpaDown.add(jbuKick);
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);
ltaOnline.addElement("所有人");
vecConnectListener=new Vector();
this.validate();
//建立连接
listenConnect();
}
void listenConnect(){
ServerSocket ssoConnect = null; //用于监听连接到服务器的连接
Socket socConnect=null; //临时存放新得到的连接套接字
BufferedReader breTemp=null; //临时存放新建连接的输入流
PrintWriter pwrTemp=null; //临时存放新建连接的输出流
String strTemp=null; //字符串临时变量
int intSum=1; //更改用户昵称用到的变量
try {
ssoConnect = new ServerSocket(4000); //检测本机的4000端口
} catch (IOException ex1) {
System.out.println("建立ServerSocket失败!");
}
while (true){ //永久循环检测
try {
socConnect = ssoConnect.accept(); //检测到新连接赋值
} catch (IOException ex) {
System.out.println("建立Socket失败!");
}
try { //获取输入输出流
breTemp = new BufferedReader(new InputStreamReader(socConnect.
getInputStream()));
pwrTemp=new PrintWriter(socConnect.getOutputStream(),true);
} catch (IOException ex2) {
System.out.println("获取IO流失败!");
}
int intOnlineSum=ltaOnline.getSum()+1; //计算给客户端发送的在线聊友列表
//的数目,“所有人”项一并统计在内
pwrTemp.println(""+intOnlineSum); //发送数目
for (int i=0;i<intOnlineSum;i++){ //发送具体昵称
pwrTemp.println(ltaOnline.isName(i));
}
try {
strTemp=breTemp.readLine(); //接收用户定义的昵称
if (ltaOnline.isBeing(strTemp)){ //判断昵称已经存在
strTemp+="克隆"+(intSum++)+"代"; //改名
pwrTemp.println("TRUE"); //通知客户端接收新昵称
pwrTemp.println(strTemp); //向客户端发送新昵称
}
else
pwrTemp.println("FALSE"); //昵称没有重复
jtaChats.append("系统广播:欢迎"+strTemp+"来到本聊天室\n");
} catch (IOException ex3) {
System.out.println("读数据失败!");
}
ltaOnline.addElement(strTemp); //将新来者加入到在线人员列表
cpoOnline.add(socConnect); //将新来者加入到联接池
ConnectListen cliTemp=new ConnectListen(socConnect,this); //为新来者建立一个监听对象
cliTemp.start();
vecConnectListener.addElement(cliTemp); //保存监听对象
jlaOnlineSum.setText(""+ltaOnline.getSum()); //更新在线人数
cpoOnline.sendAll("ADD"); //通知所有在线客户端增加一个聊友
cpoOnline.sendAll(strTemp); //通知所有在线客户端新聊友的昵称
cpoOnline.sendAll("系统广播:欢迎"+strTemp+"来到本聊天室");
}
}
class ListTable extends JPanel implements MouseListener{
private BaTable jtaMain; //用于显示聊友昵称的表
private Vector vecHead, //表头
vecData; //数据体
ListTable(){
super();
vecHead=new Vector();
vecData=new Vector();
vecHead.add("asdsssssssss");
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);
}
void refurbish(){
this.setVisible(false);
this.setVisible(true);
}
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 ServerMain();
}
public void actionPerformed(ActionEvent e) {
if (e.getSource()==jbuSend){ //点击“发言”按钮
if (jtfObject.getText().trim().equals("所有人")){ //发言对象是所有人
cpoOnline.sendAll("服务器公告:"+jtfChat.getText());
jtaChats.append("服务器公告:"+jtfChat.getText()+"\n");
}
else { //发言对象是某个聊友
cpoOnline.sendTo(ltaOnline.getIndex(jtfObject.getText().trim())-1,
"管理员对你说:"+jtfChat.getText());
jtaChats.append("管理员对"+jtfObject.getText()+"说:"+jtfChat.getText()+"\n");
}
}
if (e.getSource()==jbuKick){ //点击“踢”按钮
if(jtfObject.getText().trim().equals("所有人")){ //企图踢"所有人"
jtaChats.append("把所有都踢走了就没人陪你聊天了:(");
}
else { //“请”某个聊友出聊天室
int intObject=ltaOnline.getIndex(jtfObject.getText().trim())-1; //得到其序号
cpoOnline.sendTo(intObject,"你被管理员请请出了聊天室"); //给该聊友发送“请帖”
jtaChats.append(jtfObject.getText().trim()+"被管理员请出了聊天室\n");
ltaOnline.delElement(jtfObject.getText().trim()); //服务器在线人员列表删除目标
// ltaOnline.refurbish();
jlaOnlineSum.setText(""+ltaOnline.getSum()); //更新在线人数
cpoOnline.remove(intObject); //连接池中删除相应连接
ConnectListen cliTemp=(ConnectListen)vecConnectListener.get(intObject); //获得对其的监听对象
vecConnectListener.remove(intObject); //删除监听该连接的对象
cliTemp.booKick=true; //在目标的监听对象中标识为被踢
try {
cliTemp.socket.close(); //关闭该连接
} catch (IOException ex) {
}
cpoOnline.sendAll("DEL"); //通知在线客户端删除一个聊友
cpoOnline.sendAll(jtfObject.getText().trim()); //发送该聊友的昵称
cpoOnline.sendAll(jtfObject.getText().trim()+"被管理员请出了聊天室");
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -