📄 chatserver.java
字号:
import java.io.*;
import java.awt.*;
import javax.swing.*;
import java.net.*;
import java.applet.Applet;
public class ChatServer extends Applet implements Runnable
{
Thread kicker=null;
ThreadGroup dealGroup;
JTextArea text=new JTextArea(40,35);
DefaultListModel listM = new DefaultListModel();
JList list;
int number=0;
public void init()
{
JLabel message=new JLabel(" Message Text:");
JLabel userin=new JLabel("Users:");
JList list=new JList(listM);
setLayout(new BorderLayout());
JPanel p1=new JPanel(new BorderLayout());
p1.add("North",message);
text.setEditable(false);
p1.add("Center",new JScrollPane(text));//滚动条
JPanel p2=new JPanel(new BorderLayout());
p2.add("North",userin);
p2.add("Center",new JScrollPane(list));
list.setFixedCellWidth(20);
add("Center",p1);
add("East",p2);
show();
}
public void start()
{
dealGroup=new ThreadGroup("DealThreads");
kicker=new Thread(this);
kicker.start();
}
public void stop()
{
kicker.stop();
kicker=null;
dealGroup.stop();
}
public void destroy()
{
}
public void run()
{
ServerSocket serverSocket=null;
Socket cSocket;
try
{
serverSocket=new ServerSocket(4567);//4567号端口
}
catch(IOException e)
{
System.out.println(e);
return;
}
try
{
do
{
cSocket=serverSocket.accept();
(new DealThread(dealGroup,this,cSocket,++number)).start();
}
while(true);
}
catch(IOException e)
{
System.out.println(e);
return;
}
}
public void appendText(String message)
{
text.append(message);
}
public void addUser(String userName)//增加用户名单
{
listM.addElement(userName);
}
public void removeUser(String userName)//删除用户
{
int count;
count=listM.getSize();
for(int i=0;i<count;i++)
if(userName.equals(listM.getElementAt(i)))
{
listM.removeElementAt(i);
break;
}
}
public static void main(String [] args)
{
ChatServer server=new ChatServer();
server.init();
server.start();
SFrame f=new SFrame("服务器",server);
f.setResizable(false);
f.setBackground(Color.lightGray);
f.add("Center",server);
f.resize(500,500);
f.show();
}
}
class DealThread extends Thread //用于处理数据交换
{
ChatServer server;
Socket cSocket;
DataInputStream is;
PrintStream os;
String userName;
int number;
public DealThread(ThreadGroup dG,ChatServer ser,Socket socket,int num)
{
super(dG,"DealThread");
this.server=ser;
this.cSocket=socket;
this.number=num;
}
public void run()
{
try{
is=new DataInputStream(cSocket.getInputStream());
os=new PrintStream(cSocket.getOutputStream());
String fromClient=null,toClient=null;
boolean first=true,logout=false;
userName=getData(); //获取用户名
server.addUser(userName); //添加用户
do{
int count;
if(first) //第一次收到信息
toClient=userName+"has join the chat.";
else if(fromClient.equals("Logout"))
{ //收到退出信息
logout=true;
server.removeUser(userName); //删除该用户
toClient=userName+" has left the chat.";
}
else
toClient=userName+" said:"+fromClient;
server.appendText(toClient+"\n");
count=activeCount();
Thread threads[]=new Thread[count]; //多线程
enumerate(threads); //获取所有线程
for(int i=0;i<count;i++)
if(threads[i]!=this)
{ //非本线程
((DealThread)(threads[i])).sendData(toClient);
if(first)
sendData(((DealThread)(threads[i])).getUserName()+" say hello to you!");
}
else ((DealThread)(threads[i])).sendData(toClient);
first=false;
if(logout) break;
}while((fromClient=getData())!=null);
//关闭输入输出流和套接字
os.close();
is.close();
cSocket.close();
}
catch(IOException e)
{
System.out.println("Error:"+e);
}
}
public String getUserName() //获取用户名
{
return userName;
}
public String getData() //获取数据
{
String fromClient;
try
{
fromClient=is.readLine();
}
catch(Exception e)
{
System.out.println(e);
return null;
}
return fromClient;
}
boolean sendData(String toClient)//发送数据
{
try
{
os.println(toClient);
os.flush();
}
catch(Exception e)
{
System.out.println(e);
return false;
}
return true;
}
}
class SFrame extends Frame
{
ChatServer server;
public SFrame(String Name,ChatServer server)
{
super(Name);
this.server=server;
}
public boolean handleEvent(Event e)
{
switch(e.id)
{
case Event.WINDOW_DESTROY:
server.stop();
server.destroy();
System.exit(0);
}
return super.handleEvent(e);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -