导读:
  Java语言的简洁和完美,以及java网络功能的优越性是每个java体验者所体会的感受。笔者在闲暇之余,开发出网络中国象棋(以下简称象棋)程序,在此愿与广大java编程爱好者共享,做以介绍供大家参考。如有问题可与我联系:
  网络象棋程序主要功能有象棋室(多象棋桌)功能、观棋功能、悔棋功能、下棋聊天功能、调取残局文件对弈功能、方便的人性化图形界面操作等功能。由象棋服务和客户端Applet组成,Applet实现象棋室的显示,象棋桌的显示和走步判断以及用户的一些操作如悔棋、认输等功能的实现。为考虑资源使用情况和界面美观,象棋桌采用使用高效和优化的双缓冲图形界面处理技术,使用户操作更舒适,更方便。以下依次详细介绍象棋服务和客户端的实现过程。
  首先介绍象棋服务,它是运行在服务器端的用于处理和转发用户登录到象棋室,进入离开游戏桌,走棋,悔棋,认输,退出等等应用。
  1、登录处理:
  //定义登录连接处理类
  

package sunstudio.chess.event; 

  import java.util.*; 

  import java.net.*; 

  import java.io.*; 

  import sunstudio.util.*; 

  import sunstudio.*; 

  public class ChessLogin implements Runnable{ 

   

  ServerSocket ss=null; 

  boolean isrunning=true; 

  Vector listeners=new Vector(); 

  int guestid=0; 

   

  public ChessLogin(ChessServer s){ 

  ss=s.ss; 

  addLoginListener(s); 

  new Thread(this).start(); 

  } 

  public void run(){ 

  while(isrunning){ 

  try{ 

  Socket socket=ss.accept(); 

  String un=chkLogin(socket.getInputStream()); 

  if(un!=null)notifyListener(guestid++,un,socket); 

  }catch(IOException e){} 

  } 

  } 

  public void addLoginListener(LoginListener l){ 

  listeners.addElement(l); 

  } 

  void notifyListener(int userid,String username,Socket sock){ 

  LoginEvent evt=new LoginEvent(userid,username,sock); 

  for(Enumeration enu=listeners.elements();enu.hasMoreElements();){ 

  ((LoginListener)enu.nextElement()).onLoginEvent(evt); 

  } 

  } 

  public String chkLogin(InputStream is)throws IOException{ 

  byte[] head=new byte[12]; 

  HttpInputStream.readBytes(is,12,head); 

  int cmdtype=head[0]; 

  int totalsize=Convert.byteToShort(head[1],head[2]); 

  if(totalsize==0)return null; 

  byte[] data=new byte[totalsize]; 

  HttpInputStream.readBytes(is,totalsize,data); 

  //System.out.print("type="+cmdtype+",totalsize="+totalsize+",username="+parseLoginData(data)); 

  return parseLoginData(data); 

  } 

  public String parseLoginData(byte[] d){ 

  return new String(d); 

  } 

  public static int byteToInt(byte j,byte k,byte m,byte n){ 

  int a =j&0xff; 

  int b =k&0xff; 

  int c =m&0xff; 

  int d =n&0xff; 

  return (d<<24|c<<16|b<<8|a); 

  } 

  } 

  //定义登录连接事件类 

  package sunstudio.chess.event; 

  import java.net.*; 

  public class LoginEvent{ 

  public int userID; 

  public String username; 

  public Socket socket; 

   

  public LoginEvent(int userID,String username,Socket sock){ 

  this.userID=userID; 

  this.username=username; 

  this.socket=sock; 

  } 

  } 

  //登录监听接口 

  package sunstudio.chess.event; 

  public interface LoginListener{ 

  public void onLoginEvent(LoginEvent evt); 

  } 

  (待续......)


  
  Java语言的简洁和完美,以及java网络功能的优越性是每个java体验者所体会的感受。笔者在闲暇之余,开发出网络中国象棋(以下简称象棋)程序,在此愿与广大java编程爱好者共享,做以介绍供大家参考。如有问题可与我联系:网络象棋程序主要功能有象棋室(多象棋桌)功能、观棋功能、悔棋功能、下棋聊天功能、调取残局文件对弈功能、方便的人性化图形界面操作等功能。由象棋服务和客户端Applet组成,Applet实现象棋室的显示,象棋桌的显示和走步判断以及用户的一些操作如悔棋、认输等功能的实现。为考虑资源使用情况和界面美观,象棋桌采用使用高效和优化的双缓冲图形界面处理技术,使用户操作更舒适,更方便。以下依次详细介绍象棋服务和客户端的实现过程。 首先介绍象棋服务,它是运行在服务器端的用于处理和转发用户登录到象棋室,进入离开游戏桌,走棋,悔棋,认输,退出等等应用。 1、登录处理://定义登录连接处理类 package sunstudio.chess.event; import java.util.*; import java.net.*; import java.io.*; import sunstudio.util.*; import sunstudio.*; public class ChessLogin implements Runnable{ ServerSocket ss=null; boolean isrunning=true; Vector listeners=new Vector(); int guestid=0; public ChessLogin(ChessServer s){ ss=s.ss; addLoginListener(s); new Thread(this).start(); } public void run(){ while(isrunning){ try{ Socket socket=ss.accept(); String un=chkLogin(socket.getInputStream()); if(un!=null)notifyListener(guestid++,un,socket); }catch(IOException e){} } } public void addLoginListener(LoginListener l){ listeners.addElement(l); } void notifyListener(int userid,String username,Socket sock){ LoginEvent evt=new LoginEvent(userid,username,sock); for(Enumeration enu=listeners.elements();enu.hasMoreElements();){ ((LoginListener)enu.nextElement()).onLoginEvent(evt); } } public String chkLogin(InputStream is)throws IOException{ byte[] head=new byte[12]; HttpInputStream.readBytes(is,12,head); int cmdtype=head[0]; int totalsize=Convert.byteToShort(head[1],head[2]); if(totalsize==0)return null; byte[] data=new byte[totalsize]; HttpInputStream.readBytes(is,totalsize,data); //System.out.print("type="+cmdtype+",totalsize="+totalsize+",username="+parseLoginData(data)); return parseLoginData(data); } public String parseLoginData(byte[] d){ return new String(d); } public static int byteToInt(byte j,byte k,byte m,byte n){ int a =j&0xff; int b =k&0xff; int c =m&0xff; int d =n&0xff; return (d<<24|c<<16|b<<8|a); }}//定义登录连接事件类 package sunstudio.chess.event; import java.net.*; public class LoginEvent{ public int userID; public String username; public Socket socket; public LoginEvent(int userID,String username,Socket sock){ this.userID=userID; this.username=username; this.socket=sock; }}//登录监听接口 package sunstudio.chess.event; public interface LoginListener{ public void onLoginEvent(LoginEvent evt);}(待续......)