⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 omokserver.java

📁 一个JAVA实现的用于网络对战的五子棋服务器端程序
💻 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 + -