📄 server.java
字号:
import java.io.*;
import java.net.*;
import javax.swing.*;
import java.awt.*;
import java.util.*;
public class Server extends JFrame{
private ServerSocket server;//服务器套接字
private BManager bMan=new BManager();
private Random rnd= new Random();
private JTextArea jtaLog;
private JScrollPane scrollPane;
public Server()
{
jtaLog = new JTextArea();
scrollPane = new JScrollPane(jtaLog);//滚屏效果
getContentPane().add(scrollPane, BorderLayout.CENTER);//将组件添加到窗口容器中
setSize(300, 250);
setTitle("五子棋服务器端");
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
void startServer()//监听客户端连接
{
try{
server=new ServerSocket(8888);//创建了一个服务器对象
/*
*它会实现一个服务器socket。
* 一个服务器socket会等待来自客户端的连接。
* 一旦它接收到一个连接请求,它就会创建一个Socket实例来处理和客户端通讯的问题。
*/
jtaLog.append("时间:"+new Date() +'\n'+ "服务器套接字已被创建 监听端口》》》》》 " + 8888+ '\n');
while(true){
Socket socket=server.accept();//创建一个Socket对象
five_Thread thread=new five_Thread(socket);//建立一线程
thread.start();//启动线程
bMan.add(thread);//线程添加至BManager对象
jtaLog.append("连接数: "+bMan.size()+ '\n');
}
}catch(Exception e){
System.out.println(e);
}
}
public static void main(String[] args)
{
Server server=new Server();
server.startServer();//启动监听
}
class five_Thread extends Thread
{
private int roomNumber=-1;
private String userName=null;
private Socket socket;
private boolean ready=false;
//定义输入流和输出流
private BufferedReader reader;
private PrintWriter writer;//将格式化对象打印到一个文本输出流
five_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){
if(msg.startsWith("[NAME]")){
userName=msg.substring(6);
}
else if(msg.startsWith("[ROOM]")){//客户端要求进入房间号
int roomNum=Integer.parseInt(msg.substring(6));
if( !bMan.isFull(roomNum))
{
if(roomNumber!=-1)
bMan.sendTthreadhreadhers(this, "[EXIT]"+userName);
roomNumber=roomNum;
writer.println(msg);
writer.println(bMan.getNamesInRoom(roomNumber));
bMan.sendTthreadhreadhers(this, "[ENTER]"+userName);
}
else writer.println("[FULL]");
}
else if(roomNumber>=1 && msg.startsWith("[STONE]"))
bMan.sendTthreadhreadhers(this, msg);
else if(msg.startsWith("[MSG]"))
{
if(msg.subSequence(5,6).equals("a"))
{
bMan.sendToAll("["+userName+"]"+"对大家说:"+msg.substring(6));
}
else
{
bMan.sendToRoom(roomNumber, "["+userName+"]: "+msg.substring(5));
}
jtaLog.append(userName+"说:"+ msg.substring(5)+'\n');
}
else if(msg.startsWith("[START]"))
{
ready=true;
if(bMan.isReady(roomNumber))
{
int a=rnd.nextInt(2);//产生随机数,分配棋子
if(a==0)
{
writer.println("[COLOR]BLACK");
bMan.sendTthreadhreadhers(this, "[COLOR]WHITE");
}
else
{
writer.println("[COLOR]WHITE");
bMan.sendTthreadhreadhers(this, "[COLOR]BLACK");
}
}
}
else if(msg.startsWith("[STOPGAME]"))
ready=false;
else if(msg.startsWith("[DROPGAME]"))
{
ready=false;
bMan.sendTthreadhreadhers(this, "[DROPGAME]");
}
else if(msg.startsWith("[WIN]"))
{
ready=false;
writer.println("[WIN]");
bMan.sendTthreadhreadhers(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;
jtaLog.append(userName+"已断线."+ '\n');
jtaLog.append("连接人数: "+bMan.size()+ '\n');
bMan.sendToRoom(roomNumber,"[DISCONNECT]"+userName);
}catch(Exception e){}
}
}
}
class BManager extends Vector
{
BManager(){}
void add(five_Thread thread)
{
super.add(thread);
}
void remove(five_Thread thread)
{
super.remove(thread);
}
five_Thread getthread(int i)// 得到一个five_Thread对象
{
return (five_Thread)elementAt(i);
}
Socket getSocket(int i)//返回第I个socket
{
return getthread(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 getthread(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 sendToAll(String msg)
{
for(int i=0;i<size();i++)
{
sendTo(i,msg);
}
}
//发送聊天消息
void sendToRoom(int roomNum, String msg)
{
for(int i=0;i<size();i++)
if(roomNum==getRoomNumber(i))
sendTo(i, msg);
}
// 发送各种指令
void sendTthreadhreadhers(five_Thread thread, String msg)
{
for(int i=0;i<size();i++)
if(getRoomNumber(i)==thread.getRoomNumber() && getthread(i)!=thread)
sendTo(i, msg);
}
synchronized boolean isReady(int roomNum)//是否能开始游戏
{
int count=0;
for(int i=0;i<size();i++)
if(roomNum==getRoomNumber(i) && getthread(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(getthread(i).getUserName()+"\t");
return sb.toString();
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -