📄 serverframe.java
字号:
// 程序:多人连线服务器
// 范例文件:ServerFrame.java
import java.io.*;
import java.awt.*;
import java.net.*;
import java.util.*;
import java.awt.event.*;
public class ServerFrame extends Frame implements ActionListener
{
int ScreenWidth,ScreenHeight;
Button CloseServer;
TextArea ServerStatus;
ServerThread sThread;
public ServerFrame()
{
super("游戏服务器");
ServerStatus = new TextArea();
CloseServer = new Button("关闭服务器");
ServerStatus.setEditable(false);
CloseServer.addActionListener(this);
add(ServerStatus,BorderLayout.CENTER);
add(CloseServer,BorderLayout.SOUTH);
ScreenWidth = getToolkit().getScreenSize().width;
ScreenHeight = getToolkit().getScreenSize().height;
setSize(ScreenWidth / 2,ScreenHeight / 2);
setLocation((ScreenWidth - getWidth()) / 2,
(ScreenHeight - getHeight()) / 2);
setResizable(false);
setVisible(true);
sThread = new ServerThread(this);
sThread.start();
}
public static void main(String srgs[])
{
new ServerFrame();
}
public void actionPerformed(ActionEvent e)
{
dispose();
System.exit(0);
}
}
class ServerThread extends Thread
{
int sPort;
ServerSocket sSocket;
ServerFrame frame;
TextArea sStatus;
Vector Clients;
Vector messages;
BroadCast BroadCastWriter;
CleanDeadConnect Cleaner;
public ServerThread(ServerFrame f)
{
Clients = new Vector();
messages = new Vector();
try
{
sPort = 6633;
sSocket = new ServerSocket(sPort);
}
catch(IOException E)
{
System.out.println("发生例外: " + E);
System.out.println("无法建立服务器端口!!");
System.exit(1);
}
this.frame = f;
sStatus = frame.ServerStatus;
sStatus.append("游戏服务器已启动..\n\n");
sStatus.append(">>>>>等待连线<<<<<\n\n");
BroadCastWriter = new BroadCast(this);
BroadCastWriter.start();
Cleaner = new CleanDeadConnect(this);
Cleaner.start();
}
public void run()
{
while(true)
{
try
{
Socket cSocket = sSocket.accept();
ClientThread cThread = new ClientThread(cSocket,this);
cThread.start();
sStatus.append(cThread.getClientName() + ":");
sStatus.append(cThread.getClientAddress() + "已连线 ");
sStatus.append("目前连线数: " + ClientThread.ConnectNumber +
"\n");
synchronized(Clients)
{
Clients.addElement(cThread);
}
}
catch(IOException E)
{
System.out.println("发生例外: " + E);
System.out.println("建立客户端连线失败!");
System.exit(2);
}
}
}
public void finalize()
{
try
{
sSocket.close();
}
catch(IOException E){}
sSocket = null;
}
}
class ClientThread extends Thread
{
Socket cSocket;
PrintStream write;
BufferedReader read;
ServerThread sThread;
TextArea sStatus;
String m;
public static int ConnectNumber = 0;
public ClientThread(Socket cSocket,ServerThread sThread)
{
this.cSocket = cSocket;
this.sThread = sThread;
sStatus = sThread.frame.ServerStatus;
ConnectNumber++;
try
{
write = new PrintStream(cSocket.getOutputStream());
read = new BufferedReader(
new InputStreamReader(cSocket.getInputStream()));
}
catch(IOException E)
{
System.out.println("发生例外: " + E);
System.out.println("建立I/O管道失败!");
System.exit(3);
}
m = "新伙伴<" + getClientName() + ">加入罗!!! ";
m = m + "聊天室人数: " + ConnectNumber + " \n\n";
sThread.messages.addElement(m);
}
public void run()
{
while(true)
{
try
{
String Message = read.readLine();
synchronized(sThread.messages)
{
if(Message != null)
{
if(Message.equals("bye"))
{
ConnectNumber--;
Message = getClientName() + ":" + getClientAddress() +
"已离开 ";
sStatus.append(Message + " ");
sStatus.append("目前连线数: " + ConnectNumber + "\n");
sThread.messages.addElement(Message);
synchronized(sThread.Clients)
{
sThread.Clients.removeElement(this);
}
break;
}
else
{
Message = "来自" + getClientName() + ":" +
getClientAddress() + "\n=> " + Message + "\n";
sThread.messages.addElement(Message);
}
}
}
}
catch(IOException E)
{
break;
}
}
}
public String getClientName()
{
return cSocket.getInetAddress().getHostName();
}
public String getClientAddress()
{
return cSocket.getInetAddress().getHostAddress();
}
public void finalize()
{
try
{
read.close();
write.close();
cSocket.close();
}
catch(IOException E){}
cSocket = null;
}
}
class BroadCast extends Thread
{
ClientThread c;
ServerThread sThread;
String m;
public BroadCast(ServerThread sThread)
{
this.sThread = sThread;
}
public void run()
{
while(true)
{
try
{
Thread.sleep(3000);
}
catch(InterruptedException E){}
synchronized(sThread.messages)
{
if(sThread.messages.isEmpty())
continue;
m = (String)sThread.messages.firstElement();
sThread.messages.removeElement(m);
}
synchronized(sThread.Clients)
{
for(int i=0;i<sThread.Clients.size();i++)
{
c = (ClientThread)sThread.Clients.elementAt(i);
c.write.println(m);
}
}
}
}
}
class CleanDeadConnect extends Thread
{
ServerThread sThread;
ClientThread temp;
String m;
public CleanDeadConnect(ServerThread sThread)
{
this.sThread = sThread;
}
public void run()
{
while(true)
{
try
{
Thread.sleep(10000);
}
catch(InterruptedException E){}
synchronized(sThread.Clients)
{
for(int i=0;i<sThread.Clients.size();i++)
{
temp = (ClientThread)sThread.Clients.elementAt(i);
if(!temp.isAlive())
{
ClientThread.ConnectNumber--;
m = temp.getClientName() + ":" + temp.getClientAddress();
m = m + "已离开 目前连线数: " +
ClientThread.ConnectNumber + "\n";
sThread.frame.ServerStatus.append(m);
synchronized(sThread.messages)
{
sThread.messages.addElement(m);
}
sThread.Clients.removeElementAt(i);
}
}
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -