如何将一个Application 五子棋 转成 b/s 模式的 servlet + applet 程序?????????
服务器端::
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.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;
    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){
          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.sendToOthers(this, "[EXIT]"+userName);
              roomNumber=roomNum;
              writer.println(msg);
              writer.println(bMan.getNamesInRoom(roomNumber));
              bMan.sendToOthers(this, "[ENTER]"+userName);
            }    
            else writer.println("[FULL]");
          }
          else if(roomNumber>=1 && msg.startsWith("[STONE]"))
            bMan.sendToOthers(this, msg);
          else if(msg.startsWith("[MSG]"))
            bMan.sendToRoom(roomNumber, "["+userName+"]: "+msg.substring(5));
          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();
    }
  }
}

解决方案 »

  1.   

    import java.awt.*;
    import java.net.*;
    import java.io.*;
    import java.util.*;
    import java.awt.event.*;
    import java.awt.geom.*;
    class OmokBoard extends Canvas{
      public static final int BLACK=1, WHITE=-1;
      private int[][] map;
      private int size, cell;
      private String info="游戏终止";
      private int color=BLACK;
      private boolean enable=false;
      private boolean running=false;
      private PrintWriter writer;
      private Graphics gboard, gbuff;
      private Image buff;
      OmokBoard(int s, int c){
        this.size=s;this.cell=c;
        map=new int[size+2][];
        for(int i=0;i<map.length;i++)
          map[i]=new int[size+2];
        setBackground(new Color(200,200,100));
        setSize(size*(cell+1)+size, size*(cell+1)+size);
        addMouseListener(new MouseAdapter(){
          public void mousePressed(MouseEvent me){
            if(!enable)return;
            int x=(int)Math.round(me.getX()/(double)cell);
            int y=(int)Math.round(me.getY()/(double)cell);
            if(x==0 || y==0 || x==size+1 || y==size+1)return;
            if(map[x][y]==BLACK || map[x][y]==WHITE)return;
            writer.println("[STONE]"+x+" "+y);
            map[x][y]=color;
            if(check(new Point(x, y), color)){
              info="获胜.";
              writer.println("[WIN]");
            }
            else info="等对方落子.";
            repaint();
            enable=false;
          }
        });
      }
      public boolean isRunning(){
        return running; 
      }
      public void startGame(String col){
        running=true;
        if(col.equals("BLACK")){
          enable=true; color=BLACK;
          info="开始游戏....请落子.";
        }   
        else{
          enable=false; color=WHITE;
          info="开始游戏... 请等待.";
        }
      }
      public void stopGame(){
        reset();
        writer.println("[STOPGAME]");
        enable=false;
        running=false;
      }
      public void putOpponent(int x, int y){
        map[x][y]=-color;
        info="对方已落子. 请落子.";
        repaint();
      }
      public void setEnable(boolean enable){
        this.enable=enable;
      }
      public void setWriter(PrintWriter writer){
        this.writer=writer;
      }
      public void update(Graphics g){
        paint(g); 
      }
      public void paint(Graphics g){
        if(gbuff==null){
          buff=createImage(getWidth(),getHeight());
          gbuff=buff.getGraphics();  
        }    
        drawBoard(g);
      }
      public void reset(){
        for(int i=0;i<map.length;i++)
          for(int j=0;j<map[i].length;j++)
            map[i][j]=0;
        info="游戏终止";
        repaint();    
      }
      private void drawLine(){
        gbuff.setColor(Color.black);
        for(int i=1; i<=size;i++){
          gbuff.drawLine(cell, i*cell, cell*size, i*cell);
          gbuff.drawLine(i*cell, cell, i*cell , cell*size);
        }
      }
      private void drawBlack(int x, int y){
        Graphics2D gbuff=(Graphics2D)this.gbuff;
        gbuff.setColor(Color.black);
        gbuff.fillOval(x*cell-cell/2, y*cell-cell/2, cell, cell);
        gbuff.setColor(Color.white);
        gbuff.drawOval(x*cell-cell/2, y*cell-cell/2, cell, cell);
      }
      private void drawWhite(int x, int y){
        gbuff.setColor(Color.white);
        gbuff.fillOval(x*cell-cell/2, y*cell-cell/2, cell, cell);
        gbuff.setColor(Color.black);
        gbuff.drawOval(x*cell-cell/2, y*cell-cell/2, cell, cell);
      }
      private void drawStones(){
        for(int x=1; x<=size;x++)
         for(int y=1; y<=size;y++){
           if(map[x][y]==BLACK)
             drawBlack(x, y);
           else if(map[x][y]==WHITE)
             drawWhite(x, y);
         } 
      }
      synchronized private void drawBoard(Graphics g){
        gbuff.clearRect(0, 0, getWidth(), getHeight());
        drawLine();
        drawStones();
        gbuff.setColor(Color.red);
        gbuff.drawString(info, 20, 15);
        g.drawImage(buff, 0, 0, this);
      }
      private boolean check(Point p, int col){
        if(count(p, 1, 0, col)+count(p, -1, 0, col)==4)
          return true;
        if(count(p, 0, 1, col)+count(p, 0, -1, col)==4)
          return true;
        if(count(p, -1, -1, col)+count(p, 1, 1, col)==4)
          return true;
        if(count(p, 1, -1, col)+count(p, -1, 1, col)==4)
          return true;
        return false;
      }
      private int count(Point p, int dx, int dy, int col){
        int i=0;
        for(; map[p.x+(i+1)*dx][p.y+(i+1)*dy]==col ;i++);
        return i;
      }
    }
      

  2.   

    public class OmokClient extends Frame implements Runnable, ActionListener{
      private TextArea msgView=new TextArea("", 1,1,1);
      private TextField sendBox=new TextField("");
      private TextField nameBox=new TextField();
      private TextField roomBox=new TextField("0");
      private Label pInfo=new Label("待机事:  名"); 
      private java.awt.List pList=new java.awt.List();
      private Button startButton=new Button("开始对决");
      private Button stopButton=new Button("弃权");
      private Button enterButton=new Button("入场");
      private Button exitButton=new Button("去待机事");
      private Label infoView=new Label("< Thing java >", 1);
      private OmokBoard board=new OmokBoard(15,30);
      private BufferedReader reader;
      private PrintWriter writer;
      private Socket socket;
      private int roomNumber=-1;
      private String userName=null;
      public OmokClient(String title){
        super(title);
        setLayout(null);
        msgView.setEditable(false);
        infoView.setBounds(10,30,480,30);
        infoView.setBackground(new Color(200,200,255));
        board.setLocation(10,70);
        add(infoView);
        add(board);
        Panel p=new Panel();
        p.setBackground(new Color(200,255,255));
        p.setLayout(new GridLayout(3,3));
        p.add(new Label("名字:", 2));p.add(nameBox);
        p.add(new Label("房间号:", 2)); p.add(roomBox);
        p.add(enterButton); p.add(exitButton);
        enterButton.setEnabled(false);
        p.setBounds(500,30, 250,70);
        
        Panel p2=new Panel();
        p2.setBackground(new Color(255,255,100));
        p2.setLayout(new BorderLayout());
        Panel p2_1=new Panel();
        p2_1.add(startButton); p2_1.add(stopButton);
        p2.add(pInfo,"North"); p2.add(pList,"Center"); p2.add(p2_1,"South");
        startButton.setEnabled(false); stopButton.setEnabled(false);
        p2.setBounds(500,110,250,180);
        
        Panel p3=new Panel();
        p3.setLayout(new BorderLayout());
        p3.add(msgView,"Center");
        p3.add(sendBox, "South");
        p3.setBounds(500, 300, 250,250);
        
        add(p); add(p2); add(p3);
        sendBox.addActionListener(this);
        enterButton.addActionListener(this);
        exitButton.addActionListener(this);
        startButton.addActionListener(this);
        stopButton.addActionListener(this);
        addWindowListener(new WindowAdapter(){
           public void windowClosing(WindowEvent we){
             System.exit(0);
           }
        });
      }
      public void actionPerformed(ActionEvent ae){
        if(ae.getSource()==sendBox){
          String msg=sendBox.getText();
          if(msg.length()==0)return;
          if(msg.length()>=30)msg=msg.substring(0,30);
          try{  
            writer.println("[MSG]"+msg);
            sendBox.setText("");
          }catch(Exception ie){}
        }
        else if(ae.getSource()==enterButton){
          try{
            
            if(Integer.parseInt(roomBox.getText())<1){
              infoView.setText("房间号错误. 大于1");
              return; 
            }
              writer.println("[ROOM]"+Integer.parseInt(roomBox.getText()));
              msgView.setText("");
            }catch(Exception ie){
              infoView.setText("输入的事项发生错误."); 
            }
        }
        else if(ae.getSource()==exitButton){
          try{
            goToWaitRoom();
            startButton.setEnabled(false);
            stopButton.setEnabled(false);
          }catch(Exception e){}     
        }
        else if(ae.getSource()==startButton){
          try{
            writer.println("[START]");
            infoView.setText("等待对方决定.");
            startButton.setEnabled(false);
          }catch(Exception e){}
        }
        else if(ae.getSource()==stopButton){
          try{
            writer.println("[DROPGAME]");
            endGame("已弃权.");
          }catch(Exception e){}
        }
      }
      void goToWaitRoom(){
        if(userName==null){
          String name=nameBox.getText().trim();
          if(name.length()<=1 || name.length()>9){
            infoView.setText("名字错误. 2~10个字");
            nameBox.requestFocus();
            return;
          }
          userName=name;
          writer.println("[NAME]"+userName);    
          nameBox.setText(userName);
          nameBox.setEditable(false);
        }  
        msgView.setText("");
        writer.println("[ROOM]0");
        infoView.setText("已进入待机室.");
        roomBox.setText("0");
        enterButton.setEnabled(true);
        exitButton.setEnabled(false);
      }
      public void run(){
        String msg;
        try{
        while((msg=reader.readLine())!=null){
            if(msg.startsWith("[STONE]")){
              String temp=msg.substring(7);
              int x=Integer.parseInt(temp.substring(0,temp.indexOf(" ")));
              int y=Integer.parseInt(temp.substring(temp.indexOf(" ")+1));
              board.putOpponent(x, y);
              board.setEnable(true);
            }
            else if(msg.startsWith("[ROOM]")){
              if(!msg.equals("[ROOM]0")){
                enterButton.setEnabled(false);
                exitButton.setEnabled(true);
                infoView.setText(msg.substring(6)+"号房间已被进入.");
              }
              else infoView.setText("已进入待机室.");
              roomNumber=Integer.parseInt(msg.substring(6));
              if(board.isRunning()){
                board.stopGame();
              }   
            }
            else if(msg.startsWith("[FULL]")){
              infoView.setText("房间已满,禁止入内.");
            }
            else if(msg.startsWith("[PLAYERS]")){
              nameList(msg.substring(9));
            }
            else if(msg.startsWith("[ENTER]")){
              pList.add(msg.substring(7));
              playersInfo();
              msgView.append("["+ msg.substring(7)+"]入场.\n");
            }
            else if(msg.startsWith("[EXIT]")){
              pList.remove(msg.substring(6));
              playersInfo();
              msgView.append("["+msg.substring(6)+"]进入其他房间.\n");
              if(roomNumber!=0)
                endGame("对方离开.");
            }
            else if(msg.startsWith("[DISCONNECT]")){
              pList.remove(msg.substring(12));
              playersInfo();
              msgView.append("["+msg.substring(12)+"]中断连接.\n");
              if(roomNumber!=0)
                endGame("对方离开.");
            }
            else if(msg.startsWith("[COLOR]")){
              String color=msg.substring(7);
              board.startGame(color);
              if(color.equals("BLACK"))
                infoView.setText("得到黑子.");
              else
                infoView.setText("得到白子.");
              stopButton.setEnabled(true);  
            }
            else if(msg.startsWith("[DROPGAME]"))
              endGame("对方弃权.");
            else if(msg.startsWith("[WIN]"))
              endGame("获胜.");
            else if(msg.startsWith("[LOSE]"))
              endGame("失败.");
            else msgView.append(msg+"\n");
        }
        }catch(IOException ie){
         msgView.append(ie+"\n");
        }
        msgView.append("连接中断.");
      }
      

  3.   

      private void endGame(String msg){
        infoView.setText(msg);
        startButton.setEnabled(false);
        stopButton.setEnabled(false);
        try{ Thread.sleep(2000); }catch(Exception e){}
        if(board.isRunning())board.stopGame();
        if(pList.getItemCount()==2)startButton.setEnabled(true);
      }
      private void playersInfo(){
        int count=pList.getItemCount();
        if(roomNumber==0)
          pInfo.setText("待机室: "+count+"名");
        else pInfo.setText(roomNumber+" 号房: "+count+"名"); 
        if(count==2 && roomNumber!=0)
          startButton.setEnabled(true);
        else startButton.setEnabled(false); 
      }
      private void nameList(String msg){
        pList.removeAll();
        StringTokenizer st=new StringTokenizer(msg, "\t");
        while(st.hasMoreElements())
          pList.add(st.nextToken());
        playersInfo();
      }
      private void connect(){
        try{
          msgView.append("请求连接服务器.\n");
          socket=new Socket("192.168.1.28", 7777);
          msgView.append("---连接成功--.\n");
          msgView.append("请输入名字,然后进入待机室.\n");
          reader=new BufferedReader(new InputStreamReader(socket.getInputStream()));
          writer=new PrintWriter(socket.getOutputStream(), true);
          new Thread(this).start();
          board.setWriter(writer);
        }catch(Exception e){
          msgView.append(e+"\n\n连接失败..\n");  
        }  
      }
      public static void main(String[] args){
        OmokClient client=new OmokClient("网络五子棋游戏");
        client.setSize(760,560);
        client.setVisible(true);
        client.connect();
      }
    }
      

  4.   

    把你的 客户端转化为applet 就可以了。程序变动很小。
      

  5.   

    那SERVLET不用变??
    就把那个服务器端写上去?
    客户端改后直接就放在页面里运行?不要改动什么?测试时别的机子有什么要求不?
      

  6.   

    服务器端不用做任何修改,因为你使用的socket,不关心客户端在哪里,是什么。applet默认安全策略是允许链接它自己来源的网站主机的。 记得把防火墙的端口打开!
      

  7.   

    本帖最后由 java2000_net 于 2008-04-22 05:49:24 编辑
      

  8.   

    非常感谢 老紫竹 大哥
    上次的问题解决了一半!但还有一些我不是太懂,就是服务器端,我原先的想法就是把它做成一个Servlet 把客户端做成一个APPLET放在jsp里面!整个做成一个B/S模式的!现在APPLET做好了!但这个服务器端怎么搞?怎么起动它呢?不会是在MYEclipse里直接运行这个applcation程序吧,我想把它做好了像一般的JSP放在tomcat里运行 就启动Tomcat 后直接进那个有APPLet程序的页面就可以用了(问题有些菜,见笑了)