public boolean handleEvent(Event evt)
{
switch (evt.id)
{
case Event.MOUSE_DOWN :
if(!chessArray.change)
{
chessArray.information ("现在不能走棋;"+chessArray.information);
return false;//如果此时不允许修改,则返回
}
if (judgePlace(evt.x,evt.y)&&evt.clickCount==1)
{//如果点击点落在棋子范围内
if(chooseCh==false&&chessArray.chArray[numy][numx]!=0)
{//如果没有选中棋子,即处在选棋状态,并且点击点有棋子
if(chessArray.chArray[numy][numx]<200)
{
chessArray.information ("请走您自己的子");
return false;
}
chooseCh=true;
int ch=chessArray.chArray[numy][numx];
numCh=judgeChoice(ch);
numxBak=numx;
numyBak=numy;
chequer[numCh].chM(LcornerX+lengthX*numx-this.lengthMin/2,LcornerY+lengthY*numy-this.lengthMin/2,
lengthMin-1,chString[ch/200][ch%100/10-1],chColor[ch/200],Color.lightGray);
//将棋子颜色改为灰色说明此棋子已被选中
chequer[numCh].repaint();
chessArray.changeCount1 =numy*10+numx;
return true;
}
if(chooseCh)
{//如果选中棋子,即处在走棋状态
if(numxBak==numx&&numyBak==numy){//如果棋子的代码相同,则认为在同一位置
//点击两次,返回
chooseCh=false;//变为允许选棋状态
walkCh(false);
return true;
}
if(!chRule())return false;//若不符合规则,返回
walkCh(true);
chooseCh=false;//变为允许选棋状态
chessArray.change=false;//数据已改动,可以发送数据
chessArray.readyOut=true;//数据已改动,可以发送数据
chessArray.information("正在发送数据......");
chessArray.changeCount2 =numy*10+numx;
return true;
}
}
return true;
default:
return false;
}
}
public boolean chRule()
{
/*此方法用来判断走棋是否合法,代码从略*/
}…………………….代码四…………………………….
上面的代码中的两个变量chessArray.changeCount1, chessArray.changeCount2应当引起您的特别注意,它们就是每次被传输的数据。为什么会是它呢?
网络数据传输应当本着这样的原则:数量少作用大,对代码四细一分析便可发现,真正有用的数据只有五个:棋子代码code算一个,始末位置坐标四个x1,x2,x3,x4。五个数据当然可以分五次进行发送,但这五个数位数实在太少,不如进行简单的运算以减少数量。
所以有:x1×10000+y1×1000+code;
x2×10+y2;
下面给出服务器与客户机的源代码,因为玩家既可能选择庄家(服务器)也可能选择挑战者(客户机),故两程序必须同时参与编译。
/* chessClient 实现客户机方面的数据接受与发送*/
import java.awt.*;import java.net.*;
import java.io.*;
import chessArray;
public class chessClient implements Runnable
{ Thread thread;
Socket socket;
String name=null;
OutputStream outS;
InputStream inS;
public chessClient(String st)
{
name=st;
thread=new Thread(this);
}
public synchronized void run()
{
try{
if(name==null)
socket=new Socket(InetAddress.getLocalHost (),1666);
else socket=new Socket(name,1666);
chessArray.information("网络连接成功,正等待庄家走棋");
System.out.println(name);
}catch(IOException e){
System.out.println(e);
return ;
}
while(true){
try{
outS=socket.getOutputStream ();
inS=socket.getInputStream ();
}catch(IOException e){
System.out.println(e);
chessArray.information("网络连接有误,对家可能已退出");
}
while(true)
try{
if(chessArray.readyOut )
{
outS.write (chessArray.changeCount1 );
outS.write (chessArray.changeCount2 );
if(chessArray.changeCount1 !=254){
chessArray.information("等待对家走棋......");
}else{
chessArray.information("已告诉庄家,等待对家走棋......");
chessArray.change=false;
}
chessArray.readyOut=false;
chessArray.readyIn=true;
}else if(chessArray.readyIn )
{
chessArray.changeCount1=inS.read ();
chessArray.changeCount2=inS.read();
if(chessArray.changeCount1==254)
{
chessArray.information("庄家已选择重下,若继续,请等待");
chessArray.changeCount1=-1;
chessArray.chA(chessArray.arrayBak);
chessArray.readyOut=false;
chessArray.repaint=true;
chessArray.netChange =false;
chessArray.change=false;
chessArray.readyIn=true;
}else
{
chessArray.netChange =true;
chessArray.readyIn=false;
}
try{
thread.sleep(1000);
}catch(InterruptedException e)
{ };
}
}catch(IOException e){
chessArray.information("网络连接有误,对家可能已退出");
}
}
}
public void start()
{ thread.start(); }
}
/* chessServer实现服务器方面的数据接受与发送*/
import java.awt.*;import java.net.*;import java.io.*;import chessArray;public class chessServer extends Dialog implements Runnable{ Thread thread;
ServerSocket server=null;
Socket socket;
OutputStream outS;
InputStream inS;
Label lb=new Label ("正在等待挑战者......");
public chessServer(Frame frbak)
{
super(frbak,"等待连接",false);
setBackground(Color.cyan);
int width=300;
int height=70;
thread=new Thread(this);
setFont(new Font("chequer",Font.BOLD,26));
this.add("Center",lb);
setBounds(chessArray.offsize.width/2-width/2,chessArray.offsize.height/2-height/2,width,height);
show();
}
public synchronized void run()
{
try{
server=new ServerSocket(1666);
}catch(IOException e){
return ;
}
while(true)
{
try{
socket=server.accept ();
this.setVisible (false);
chessArray.change =true;
chessArray.information("网络连接成功,您可以走棋了");
outS=socket.getOutputStream ();
inS=socket.getInputStream ();
}catch(IOException e){
chessArray.information("网络连接有误,对家可能已退出");
System.out.println(e);
}
/* 此处删掉部分与chessClient相同的代码*/
}
public void start()
{ thread.start(); }
}
|