?? serverframe.java
字號(hào):
// 程序:多人聯(lián)機(jī)服務(wù)器
// 范例文件:ServerFrame.java
import java.io.*;
import java.awt.*;
import java.net.*;
import java.util.*; //為了建立Vector實(shí)體
import java.awt.event.*;
public class ServerFrame extends Frame implements ActionListener
{
int ScreenWidth,ScreenHeight;
Button CloseServer;
TextArea ServerStatus;
ServerThread sThread;
public ServerFrame() //創(chuàng)建方法
{
super("游戲服務(wù)器"); //建立服務(wù)器窗口
ServerStatus = new TextArea(); //建立TextArea
CloseServer = new Button("關(guān)閉服務(wù)器"); //建立Button
ServerStatus.setEditable(false); //TextArea為不可編輯
CloseServer.addActionListener(this); //注冊(cè)按鈕的事件處理方法
add(ServerStatus,BorderLayout.CENTER); //加入TextArea
add(CloseServer,BorderLayout.SOUTH); //加入Button
//將窗口置于屏幕中央,寬度與高度皆為屏幕一半
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); //建立服務(wù)器主線程
sThread.start(); //啟動(dòng)線程
}
public static void main(String srgs[])
{
new ServerFrame(); //建立游戲服務(wù)器窗口
}
//=====實(shí)現(xiàn)ActionListener界面=====================================
public void actionPerformed(ActionEvent e) //當(dāng)按鈕按下時(shí)
{
dispose();
System.exit(0); //關(guān)閉窗口
}
}
class ServerThread extends Thread //服務(wù)器主線程
{
int sPort; //服務(wù)器接口
ServerSocket sSocket; //服務(wù)器插座
ServerFrame frame;
TextArea sStatus;
Vector Clients; //儲(chǔ)存聯(lián)機(jī)客戶端
Vector messages; //儲(chǔ)存客戶端訊息
BroadCast BroadCastWriter; //廣播訊息線程
CleanDeadConnect Cleaner; //清除中斷聯(lián)機(jī)線程
public ServerThread(ServerFrame f)
{
Clients = new Vector(); //建立Vector實(shí)體
messages = new Vector();
try
{
sPort = 6633; //指定接口
sSocket = new ServerSocket(sPort); //建立服務(wù)器插座
}
catch(IOException E) //建立失敗的話...
{
System.out.println("發(fā)生異常: " + E);
System.out.println("無法建立服務(wù)器插座!!");
System.exit(1); //結(jié)束程序
}
this.frame = f;
sStatus = frame.ServerStatus;
sStatus.append("游戲服務(wù)器已啟動(dòng)..\n\n");
sStatus.append(">>>>>等待聯(lián)機(jī)<<<<<\n\n");
BroadCastWriter = new BroadCast(this); //建立廣播線程
BroadCastWriter.start(); //啟動(dòng)
Cleaner = new CleanDeadConnect(this); //建立清除中斷聯(lián)機(jī)線程
Cleaner.start(); //啟動(dòng)
}
public void run()
{
while(true) //等待建立聯(lián)機(jī)的循環(huán)
{
try
{
Socket cSocket = sSocket.accept(); //等待聯(lián)機(jī)
//若聯(lián)機(jī)成功則建立可用來和客戶端溝通的線程
ClientThread cThread = new ClientThread(cSocket,this);
cThread.start(); //啟動(dòng)線程
//在服務(wù)器窗口中加入聯(lián)機(jī)訊息
sStatus.append(cThread.getClientName() + ":");
sStatus.append(cThread.getClientAddress() + "已聯(lián)機(jī) ");
sStatus.append("目前聯(lián)機(jī)數(shù): " + ClientThread.ConnectNumber +
"\n");
synchronized(Clients) //同步處理
{
Clients.addElement(cThread); //加入Vector
}
}
catch(IOException E) //發(fā)生異常的話
{
System.out.println("發(fā)生異常: " + E);
System.out.println("建立客戶端聯(lián)機(jī)失敗!");
System.exit(2); //離開程序
}
}
}
public void finalize()
{
try
{
sSocket.close(); //關(guān)閉服務(wù)器程序聯(lián)機(jī)
}
catch(IOException E){}
sSocket = null; //釋放資源
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -