`
NewTamato
  • 浏览: 100979 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

学习笔记:flex java socket 交互

阅读更多

 目的:做一个简单的多玩家多线程的猜拳游戏。每个客户机都与服务端的一个套接字进行通信,但是各个客户机之间不进行通信。服务器受到客户机的连接请求时会创建新的套接字并使其与客户机连接。然后启动线程与客户机进行数据交换。套接字管理器是一个Vector,用于管理套接字的个数及其连接状态。
  游戏描述:玩家通过向服务器发送0,1,2这个三个数字,用来代表剪刀,锤包,袱。服务器接到信息后会随机产生0,1,2这三个数字的其中的一个。在客户机上通过比较来进行判断输赢。
  服务端:
  客户端:
  服务端代码:Server4.java
  ====================
  import java.net.*;
  import java.io.*;
  import java.util.*;
  public class Server4 {
  private ServerSocket server;
  Vector sManager=new Vector();//管理套接字的Vector
  Random rnd=new Random();//创建随机数的发生器
  public Server4(){}
  void startServer() //运行服务器
  {
  try
  {
  server=new ServerSocket(8888);
  System.out.println("服务器套接字已创建成功!");
  while(true)
  {
  Socket socket=server.accept();
  System.out.println("已经与客户机连接");
  new KBBCom_Thread(socket).start();
  sManager.add(socket);
  System.out.println("当前客户机连结数:"+sManager.size());
  }
  }catch(Exception e){}
  }
  public static void main(String[] args) {
  Server4 server=new Server4();
  server.startServer();
  }
  class KBBCom_Thread extends Thread//与客户机进行通信的线程累
  {
  Socket socket; //套接字引用变量
  private DataInputStream reader; //套接字输入流
  private DataOutputStream writer;  //套接字输出流
  KBBCom_Thread(Socket socket) //构造函数
  {
  this.socket=socket;
  }
  public void run()
  {
  try
  {
  //获取套接字的输入输出流
  reader=new DataInputStream(socket.getInputStream());
  writer=new DataOutputStream(socket.getOutputStream());
  String msg;
  //如果收到客户端发来的数据
  while((msg=reader.readUTF())!=null)
  {
  //向客户机传送0-2之间的整型随机数
  writer.writeUTF(rnd.nextInt(3)+"n");
  writer.flush();
  System.out.println("来自客户机:"+msg);
  }
  }catch(Exception e){}finally
  {
  try
  {
  sManager.remove(socket);  //删除套接字
  //关闭输入输出流及套接字
  if(reader!=null)reader.close();
  if(writer!=null)writer.close();
  if(socket!=null)socket.close();
  reader=null;
  writer=null;
  socket=null;
  //向屏幕输出相关信息
  System.out.println("客户机离开");
  System.out.println("当前客户机的连接数:"+sManager.size());
  }catch(Exception e){}
  }
  }
  }
  } 知识点:套接字管理器(Vector)会将于客户机连接的套接字添加到其列表中,在客户机断开连接后,在将相应的套接自从列表中删除,从中可以看出,客户机连接数与列表中添加套接字数目是一致的。
  Vector sManager=new Vector();
  sManager.add(socket); // 向列表添加套接字
  sManager.remove(socket); //从列表移除套接字
  sManager.size();//获取客户机连接数
  客户端代码:Client4.mxml
  ==================================================================================
  <?xml version="1.0" encoding="utf-8"?>
  <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" fontSize="12" creationComplete="initApp()" width="353" height="336">
  <mx:Script>
  <![CDATA[
  import flash.net.Socket;
  import flash.utils.ByteArray;
  import flash.events.ProgressEvent;
  private var socket:Socket=new Socket();
  private var intClient:int;//定义客户端数字出拳
  private var intServer:int; //定义服务端数字出拳
  private var intSY:int; //定义输赢判断
  private var strClient:String; //客户端文字出拳
  private var strServer:String; //服务端的文字出拳
  internal function initApp():void
  {
  socket.connect("127.0.0.1",8888);
  socket.addEventListener(Event.CONNECT,funConnect);
  socket.addEventListener(Event.CLOSE,funClose);
  socket.addEventListener(ProgressEvent.SOCKET_DATA,funSocket);
  }
  internal function funConnect(event:Event):void
  {
  myText.text+="连接已建立 n";
  }
  internal function funClose(event:Event):void
  {
  myText.text+="连接已关闭 n";
  }
  internal function sendMessage(msg:String):void
  {
  var message:ByteArray=new ByteArray();
  message.writeUTF(msg); //发送出拳数字
  socket.writeBytes(message);
  socket.flush();
  intClient=int(msg);
  switch(intClient)  //将数字转换成文字用于发布到屏幕上
  {
  case 0:
  strClient="剪刀";
  break;
  case 1:
  strClient="锤";
  break;
  case 2:
  strClient="包袱";
  break;
  }
  myText.text+="你出:"+strClient+"; ";
  myInput.text="";
  }
  internal function funSocket(event:ProgressEvent):void//接到服务器信息
  {
  var msg:String="";
  while(socket.bytesAvailable)
  {
  msg=socket.readUTF();
  intServer=int(msg);
  intSY=intClient-intServer;//通过数值判断输赢
  switch(intServer)  //将数字转换成文字用于发布到屏幕上
  {
  case 0:
  strServer="剪刀";
  break;
  case 1:
  strServer="锤";
  break;
  case 2:
  strServer="包袱";
  break;
  }
  myText.text+="服务器出:"+strServer+"; ";
  //判断输赢的算法
  if(intSY>0&&intSY<2)
  {
  myText.text+=" 结果:你赢了 n";
  }else if(intClient==intServer)
  {
  myText.text+=" 结果:平手 n";
  }else if(intSY<0&&intSY>-2)
  {
  myText.text+=" 结果:你输了 n";
  }else if(intSY>=2)
  {
  myText.text+=" 结果:你输了 n";
  }else if(intSY<=-2)
  {
  myText.text+=" 结果:你赢了 n";
  }
  myText.verticalScrollPosition = myText.maxVerticalScrollPosition;// myText滚动到最下面
  }
  }
  ]]>
  </mx:Script>
  <mx:TextArea x="10" y="32" width="331" height="263" id="myText"/>
  <mx:TextInput x="10" y="303" width="245" id="myInput"/>
  <mx:Button x="273" y="304" label="发送" id="myBtn" click="sendMessage(myInput.text)"/>
  <mx:Label x="10" y="10" text="规则:0代表剪刀;1代表锤;2代表包袱" width="331" fontWeight="bold"/>
  </mx:Application>
  这是我的学习笔记,简单的记叙了flex+java如何进行socket通信。希望对有需要的人有所帮助

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics