📄 serveoneclient.java
字号:
import java.io.*;
import java.net.*;
/**
* <p>Title: chess server</p>
* <p>Description: chess server</p>
* <p>Copyright: Copyright (c) 2003</p>
* <p>Company: e-top</p>
* @author cylix
* @version 1.0
*/
public class ServeOneClient extends Thread{
private Socket socket;
private String player=null;
protected ObjectInputStream in;
protected ObjectOutputStream out;
public ServeOneClient(Socket s)
throws IOException {
//声明Socket实例
socket = s;
//构造网络输入流
in =new ObjectInputStream(
socket.getInputStream());
//构造网络输出流
out = new ObjectOutputStream(
socket.getOutputStream());
//调用run()方法
start();
}
public void run() {
Message obj=new Message();
while (true) {
try {
obj =(Message)in.readObject();
//调用doMessage()方法向程序写入消息对象
doMessage(obj);
}catch(ClassNotFoundException er){}
catch(IOException e){}
}
}
/**
* 处理 messages对象封装的信息
*/
public int doMessage(Message msg){
switch(msg.type){
case 1:{//建立到服务器的新连接
sendNewPlayer(msg); //客户端必须发出 type==10的响应
addPlayer(msg); // msg.msg == 新玩家的名字
break;
}
case 2:{// 落子
putChessman(msg);
break;
}
case 3:{//响应对方的请求
requestAnother(msg);
break;
}
case 4:{
denyRequest(msg);
break;
}
case 5:{
acceptRequest(msg);
break;
}
case 6:{//发送胜利消息
checkVictory(msg);
break;
}
case 7:{//发送断开连接
getdisconnect(msg);
break;
}
case 8:{//保存游戏
break;
}
case 12:{//设置信息
boolean flag=true;
setting(msg,flag);
break;
}
case 13:{
boolean flag=false;
setting(msg,flag);
break;
}
case 19:{
playerRefresh(msg);
break;
}
case 20:{
try{
this.out.writeObject(msg);
}catch(IOException e){
e.printStackTrace();
}
break;
}
default:{
}
}
return 0;
}
/**
* 判断游戏并且更新客户端棋盘
*/
public void getdisconnect(Message msg){
Group gg = null;
Player pp = null;
String str=null;
for(int i=0;i<Server.groupList.size();i++){
gg = (Group)Server.groupList.get(i);
if(this.equals(gg.selfSocket)==true){
msg.type=6;
try{
gg.playerSocket.out.writeObject(msg);
}catch(IOException e){
e.printStackTrace();
}
sendLeftMsg(gg.self);
Server.groupList.remove(gg);
return;
}
if(this.equals(gg.playerSocket)==true){
msg.type=6;
try{
gg.selfSocket.out.writeObject(msg);
}catch(IOException e){
e.printStackTrace();
}
sendLeftMsg(gg.player);
Server.groupList.remove(gg);
return;
}
}
for(int i=0;i<Server.playerList.size();i++){
pp = (Player)Server.playerList.get(i);
if(this.equals(pp.selfSocket)==true){
break;
}
}
sendLeftMsg(pp.self);
Server.playerList.remove(pp);
updateClient();
}
private void sendLeftMsg(String str){
char cc;
for(int i=0;i<50;i++){
cc=str.charAt(i);
if(cc!='\0')
System.out.print(cc);
else break;
}
System.out.print(" has left server ...\n");
}
/**
* 拒绝游戏请求
*/
public void denyRequest(Message msg){
String denyName=null;
Player pp=null;
for(int i=0;i<Server.playerList.size();i++){
pp = (Player)Server.playerList.get(i);
if(this.equals(pp.selfSocket)==true){
denyName = new String(pp.self);
break;
}
}
for(int i=0;i<Server.playerList.size();i++){
pp = (Player)Server.playerList.get(i);
if(arrayMatchString(msg.msg,pp.self)==true){
Message ms = new Message();
ms.type=4;
strToCharArray(denyName,ms.msg);
try{
pp.selfSocket.out.writeObject(ms);
}catch(IOException er){
er.printStackTrace();
}
break;
}
}
}
/**
* B 接受 A的请求,服务器更新客户端列表
* type ==5 msg == A的名字
*/
public void acceptRequest(Message msg){
Player pps=null,ppd=null;//ppd = B pps = A
String acceptName=null;
for(int i=0;i<Server.playerList.size();i++){
ppd = (Player)Server.playerList.get(i);
if(this.equals(ppd.selfSocket)==true){
break;
}
}
for(int i=0;i<Server.playerList.size();i++){
pps = (Player)Server.playerList.get(i);
if(arrayMatchString(msg.msg,pps.self)==true){
break;
}
}
Message ss = new Message();
ss.type=14; // 设置B的颜色
ss.color=msg.color;
try{
ppd.selfSocket.out.writeObject(ss);
}catch(IOException e){
e.printStackTrace();
}
ss.type=5; // B接受A的请求
strToCharArray(ppd.self,ss.msg);
try{
pps.selfSocket.out.writeObject(ss);
}catch(IOException e){
e.printStackTrace();
}
//服务器更新 Arraylist
Group p1 = new Group();
p1.self=new String(pps.self);
p1.selfSocket = pps.selfSocket;
p1.selfColor = pps.color;
p1.player = new String(ppd.self);
p1.playerSocket = ppd.selfSocket;
if(p1.selfColor==1){
p1.playerColor = 2;
}else{
p1.playerColor = 1;
}
p1.Setting = pps.setting;
Server.groupList.add(p1);
if(Server.playerList.size()==2){
msg.type=15;
try{
pps.selfSocket.out.writeObject(msg);
ppd.selfSocket.out.writeObject(msg);
}catch(IOException e){
e.printStackTrace();
}
}
Server.playerList.remove(pps);
Server.playerList.remove(ppd);
updateClient();
}
/**
* 更新各户端列表
*/
public void updateClient(){
Message msg = new Message();
Player pp = null,ppm = null;
for(int i=0;i<Server.playerList.size();i++){
pp = (Player)Server.playerList.get(i);
msg.type=15;
try{
pp.selfSocket.out.writeObject(msg);
}catch(IOException e){
e.printStackTrace();
}
for(int j=0;j<Server.playerList.size();j++){
ppm=(Player)Server.playerList.get(j);
strToCharArray(ppm.self,msg.msg);
msg.type=9;
try{
pp.selfSocket.out.writeObject(msg);
}catch(IOException e){
e.printStackTrace();
}
}
}
}
/**
* 判断是否字符串与字符数组匹配
* @param arr
* @param str
* @return
*/
private boolean arrayMatchString(char []arr,String str){
for(int i=0; i<50 && str.charAt(i)!='\0';i++){
if(arr[i]!=str.charAt(i))
return false;
}
return true;
}
/**
* 响应对方的请求
*/
public void requestAnother(Message msg){
Player pp = null; // 接收端
Player spp = null; // 发送端
String senderName=null;
// 得到发送方的名字
for(int i=0;i<Server.playerList.size();i++){
spp = (Player)Server.playerList.get(i);
if(this.equals(spp.selfSocket)==true){
senderName = new String(spp.self);
break;
}
}
for(int i=0;i<Server.playerList.size();i++){
pp = (Player)Server.playerList.get(i);
if(arrayMatchString(msg.msg,pp.self)==true){
Message ms = new Message();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -