?? serverframe.java
字號:
// 程序:多人聯機服務器
// 范例文件:ServerFrame.java
import java.io.*;
import java.awt.*;
import java.net.*;
import java.util.*; //為了建立Vector實體
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(); //建立TextArea
CloseServer = new Button("關閉服務器"); //建立Button
ServerStatus.setEditable(false); //TextArea為不可編輯
CloseServer.addActionListener(this); //注冊按鈕的事件處理方法
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); //建立服務器主線程
sThread.start(); //啟動線程
}
public static void main(String srgs[])
{
new ServerFrame(); //建立游戲服務器窗口
}
//=====實現ActionListener界面=====================================
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(); //建立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); //加入Vector
}
}
catch(IOException E) //發生異常的話
{
System.out.println("發生異常: " + E);
System.out.println("建立客戶端聯機失敗!");
System.exit(2); //離開程序
}
}
}
public void finalize()
{
try
{
sSocket.close(); //關閉服務器程序聯機
}
catch(IOException E){}
sSocket = null; //釋放資源
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -