📄 chatserver.java
字号:
package ChatServer;
import javax.swing.*;
import java.awt.event.*;
import java.awt.Container;
import java.net.*;
import java.io.*;
import java.util.*;
public class ChatServer extends JFrame implements ActionListener
{
JTextArea txt;
JButton button;
JButton button1;
ServerSocket svrSck;
JLabel Luser;
JLabel Lpsw;
JTextField user;
JTextField psw;
JButton ok;
JTextField threadNo;
JButton kick;
Vector m_threads=new Vector();
ObjectInputStream is;
ObjectOutputStream os;
public ChatServer()
{
setResizable(false);
setTitle("Java聊天室-服务器");
getContentPane().setLayout(null);
setBounds(100, 100, 400, 400);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
txt = new JTextArea();
txt.setBounds(20,20,350,120);
getContentPane().add(txt);
button = new JButton("清屏");
button.setBounds(20,330,77,25);
getContentPane().add(button);
button.addActionListener(this);
button1 = new JButton("关闭");
button1.setBounds(290,330,77,25);
getContentPane().add(button1);
button1.addActionListener(this);
setVisible(true);
txt.setText("等待连接。。。\n");
}
public void notifyRoom()
{
//监视聊天窗口的连接变化,不
//断刷新clients数组并刷新客户端列表信息(通过sendclients函数完成)
StringBuffer people = new StringBuffer("PEOPLE");
//PEOPLE表示是客户列表信息
for (int i = 0; i < m_threads.size(); i++)
{
ServerThread c = (ServerThread) m_threads.elementAt(i);
people.append(":" + c.getID());
}
//sendClients(people);
}
public synchronized void disconnect(ServerThread c)
{
//删除 Vector m_threads 里面的由参数c指定的客户,而没有刷新客户端的名字列表
//刷新客户端名字列表工作由notifyroom来完成
try {
txt.append("系统消息: "
+ c.getID() + " 断开连接\n");
m_threads.removeElement(c);
txt.setText("目前已经有" + m_threads.size() + "用户连接");
//关掉流
c.m_in.close();
c.m_out.close();
//断开socket连接
c.m_socket.close();
}
catch (IOException e) {
txt.append("系统消息:" + "Error " + e);
}
}
public void actionPerformed(ActionEvent evt)
{
try{
if(evt.getSource() == button)
{
txt.setText("");
}
else if(evt.getSource() == button1)
{
System.exit(0);
}
else if((evt.getSource() == ok)&&user.getText().equals("admin")&&psw.getText().equals("admin"))
{
threadNo.setVisible(true);
kick.setVisible(true);
}
else if(evt.getSource() == kick)
{
int i,j;
j = Integer.parseInt(threadNo.getText());
ServerThread st1=(ServerThread)m_threads.elementAt(j);
disconnect(st1);
}
}
catch(Exception e)
{
txt.append("\n writing wrong object!");
}
}
public void runServer()
{
try
{
svrSck = new ServerSocket(5555,100);
int nid=0;
while(true)
{
//监听是否有新聊天者Chat Applet连接到聊天Server,
//线程运行到该语句会封锁,直到有新的连接产生。
Socket s=svrSck.accept();
//System.out.println("accepted");
txt.setText("accepted!");
//创建一个新的ServerThread.
ServerThread st=new ServerThread(s,m_threads);
//为该线程设置一个ID号。
st.setID(nid++);
//将该线程加入到m_threads Vector中。
m_threads.addElement(st);
//启动服务线程。
new Thread(st). start();
//通知所有ChatClient有一个新的网友加入。
for(int i=0;i<m_threads.size();i++)
{
ServerThread st1=(ServerThread)m_threads.elementAt(i);
st1.write("welcome***《 "+st.getID()+" 》***to enter chatroom!");
}
txt.setText("Listen again...");
}
}
catch(Exception e)
{
System.out.println("Server is down...");
}
}
public static void main(String[] args)
{
new ChatServer().runServer();
}
}
class ServerThread implements Runnable
{
Vector m_threads;
Socket m_socket=null;
DataInputStream m_in=null;
DataOutputStream m_out=null;
int m_nid;
//初始化该线程。
public ServerThread(Socket s,Vector threads)
{
m_socket=s;
m_threads=threads;
try
{ //构造数据输入、输出流对象
m_in=new DataInputStream(m_socket.getInputStream());
m_out=new DataOutputStream(m_socket.getOutputStream());
}
catch(Exception e)
{
e.printStackTrace();
}
}
public void run() //线程的执行体。
{
System.out.println("thread is running");
try
{
while(true)
{
String s = m_in.readUTF();
//text
try
{
StringTokenizer st = new StringTokenizer(s, ":");
String keyword = st.nextToken();
if(keyword.equals("send"))
{
for(int i=0;i<m_threads.size();i++)
{
ServerThread st1=(ServerThread)m_threads.elementAt(i);
st1.write("***《"+getID()+"》 ***说:"+s);
}
}
else
{
for(int i=0;i<m_threads.size();i++)
{
ServerThread st1=(ServerThread)m_threads.elementAt(i);
String id = String.valueOf(st1.getID());
if(id.equals(keyword))
st1.write("***《"+getID()+"》 ***说:"+s);
}
}
}
catch(NoSuchElementException e)
{
}
}
}
catch(Exception e)
{
e.printStackTrace();
}
//从m_threads Vector中删除该线程,表示该线程已经离开聊天室。
}
//将msg送回对应的客户端
public void write (String msg)
{
synchronized(m_out)
{
try
{
m_out.writeUTF(msg);
}
catch(IOException e){}
}
}
public int getID() //获得该线程的ID.
{
return m_nid;
}
public void setID(int nid) // //设置线程的ID.
{
m_nid=nid;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -