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

📄 serveoneclient.java

📁 基于java具备人工智能的
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
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 + -