📄 omokserver.java
字号:
/*
作者:黄渊 220300124 陈烨 220300123 参考资料:JAVA编程基础、应用实例
*/
import java.net.*;
import java.io.*;
import java.util.*;
public class OmokServer{
private ServerSocket server;
private BManager bMan=new BManager(); //消息广播者
private Random rnd=new Random(); //随机确定黑棋或者白棋
public OmokServer(){}
void startServer(){ //启动服务器
try{
server=new ServerSocket(7777);
System.out.println("服务器已被创建");
while(true){
//获取与客户机连接的套字
Socket socket=server.accept();
//创建并启动线程
Omok_Thread ot=new Omok_Thread(socket);
ot.start();
//想bMan添加线程
bMan.add(ot);
System.out.println("连接数:"+bMan.size());
}
}catch(Exception e){
System.out.println(e);
}
}
//主函数
public static void main(String[] args){
OmokServer server=new OmokServer();
server.startServer();
}
//负责与客户机通信的线程类
class Omok_Thread extends Thread{
private int roomNumber=-1; //房间号
private String userName=null; //用户名
private Socket socket; //套接字
//游戏是否就绪。若ready为true,则表明游戏开始准备就绪
private boolean ready=false;
private BufferedReader reader; //输入流
private PrintWriter writer; //输出流
Omok_Thread(Socket socket){
this.socket=socket;
}
Socket getSocket(){
return socket; //获取套接字
}
int getRoomNumber(){
return roomNumber; //获取房间号
}
String getUserName(){ //获取用户名
return userName;
}
boolean isReady(){ //获取准备状态
return ready;
}
public void run(){
try{
reader=new BufferedReader(new InputStreamReader(socket.getInputStream()));
writer=new PrintWriter(socket.getOutputStream(),true);
String msg;
while((msg=reader.readLine())!=null){
//若msg以[NAME]开始
if(msg.startsWith("[NAME]")){
userName=msg.substring(6); //设定userName
}
//若 msg以[ROOM]开头,则设定房间号
else if(msg.startsWith("[ROOM]")){
int roomNum=Integer.parseInt(msg.substring(6));
if( !bMan.isFull(roomNum)){ //若房间未满员
//通知本房间的其他用户一个用户退出
if(roomNumber!=-1)
bMan.sendToOthers(this,"[EXIT]"+userName);
//指定用户的新房间号
roomNumber=roomNum;
//向用户发送消息,然后通知可以进入
writer.println(msg);
//向用户传送新房间中用户列表
writer.println(bMan.getNamesInRoom(roomNumber));
//通知新房间中某个用户入场
bMan.sendToOthers(this,"[ENTER]"+userName);
}
else writer.println("[FULL]");//通知用户该房间已满员
}
//将[STONE]消息传递给对方
else if(roomNumber>=1 && msg.startsWith("[STONE]"))
bMan.sendToOthers(this,msg);
//向房间发送对话消息
else if(msg.startsWith("[MSG]"))
bMan.sendToRoom(roomNumber,"["+userName+"]:"+msg.substring(5));
//若msg以[START]开始
else if(msg.startsWith("[START]")){
ready=true;//
//
if (bMan.isReady(roomNumber)){
//
int a=rnd.nextInt(2);
if (a==0){
writer.println("[COLOR]BLACK");
bMan.sendToOthers(this,"[COLOR]WHITE");
}
else{
writer.println("[COLOR]WHITE");
bMan.sendToOthers(this,"[COLOR]BLACK");
}
}
}
//
else if(msg.startsWith("[STOPGAME]"))
ready=false;
//
else if(msg.startsWith("[DROPGAME]")){
ready=false;
//
bMan.sendToOthers(this,"[DROPGAME]");
}
//
else if(msg.startsWith("[WIN]")){
ready=false;
//
writer.println("[WIN]");
//
bMan.sendToOthers(this,"[LOSE]");
}
}
}
catch(Exception e){
}
finally{
try{
bMan.remove(this);
if(reader!=null) reader.close();
if(writer!=null) writer.close();
if(socket!=null) socket.close();
reader=null;writer=null;socket=null;
System.out.println(userName+"已断线");
System.out.println("连接人数:"+bMan.size());
//
bMan.sendToRoom(roomNumber,"[DISCONNECT]"+userName);
}catch(Exception e){
}
}
}
}
class BManager extends Vector{
BManager(){
}
void add(Omok_Thread ot){
super.add(ot);
}
void remove(Omok_Thread ot){
super.remove(ot);
}
Omok_Thread getOT(int i){
return (Omok_Thread)elementAt(i);
}
Socket getSocket(int i){
return getOT(i).getSocket();
}
//
void sendTo(int i,String msg){
try{
PrintWriter pw =new PrintWriter(getSocket(i).getOutputStream(),true);
pw.println(msg);
}catch(Exception e){}
}
int getRoomNumber(int i){
return getOT(i).getRoomNumber();
}
synchronized boolean isFull(int roomNum){
if(roomNum==0)
return false;
//
int count=0;
for(int i=0;i<size();i++)
if(roomNum==getRoomNumber(i))count++;
if(count>=2)
return true;
return false;
}
//
void sendToRoom(int roomNum, String msg){
for(int i=0;i<size();i++)
if(roomNum==getRoomNumber(i))
sendTo(i,msg);
}
//
void sendToOthers(Omok_Thread ot , String msg){
for(int i=0;i<size();i++)
if(getRoomNumber(i)==ot.getRoomNumber()&&getOT(i)!=ot)
sendTo(i,msg);
}
//
//
synchronized boolean isReady(int roomNum){
int count=0;
for (int i=0;i<size();i++)
if(roomNum==getRoomNumber(i) && getOT(i).isReady())
count++;
if(count==2)return true;
return false;
}
//
String getNamesInRoom(int roomNum){
StringBuffer sb = new StringBuffer("[PLAYERS]");
for(int i=0;i<size();i++)
if(roomNum==getRoomNumber(i))
sb.append(getOT(i).getUserName()+"\t");
return sb.toString();
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -