蒋金阳 发表于 2009-6-10 03:36:51

Flex和java的socket通信三

(三)多客户通信<br /><br />目的:做一个简单的多玩家多线程的猜拳游戏。每个客户机都与服务端的一个套接字进行通信,但是各个客户机之间不进行通信。服务器受到客户机的连接请求时会创建新的套接字并使其与客户机连接。然后启动线程与客户机进行数据交换。套接字管理器是一个Vector,用于管理套接字的个数及其连接状态。<br /><br />游戏描述:玩家通过向服务器发送0,1,2这个三个数字,用来代表剪刀,锤包,袱。服务器接到信息后会随机产生0,1,2这三个数字的其中的一个。在客户机上通过比较来进行判断输赢。<br /><br />服务端代码:Server4.java<br />========================================= 复制内容到剪贴板 代码:<br />import java.net.*;<br />import java.io.*;<br />import java.util.*;<br /><br />public class Server4 {<br />private ServerSocket server;<br />Vector sManager=new Vector();//管理套接字的Vector<br />Random rnd=new Random();//创建随机数的发生器<br /><br />public Server4(){}<br />void startServer() //运行服务器<br />{<br />try<br />{<br />server=new ServerSocket(8888);<br />System.out.println(&quot;服务器套接字已创建成功!&quot;);<br />while(true)<br />{<br />Socket socket=server.accept();<br />System.out.println(&quot;已经与客户机连接&quot;);<br />new KBBCom_Thread(socket).start();<br />sManager.add(socket);<br />System.out.println(&quot;当前客户机连结数:&quot;+sManager.size());<br />}<br />}catch(Exception e){}<br />}<br />public static void main(String[] args) {<br /><br />Server4 server=new Server4();<br />server.startServer();<br />}<br />class KBBCom_Thread extends Thread  //与客户机进行通信的线程累<br />{<br />Socket socket;   //套接字引用变量<br />private DataInputStream reader;   //套接字输入流<br />private DataOutputStream writer;  //套接字输出流<br />KBBCom_Thread(Socket socket)   //构造函数<br />{<br />this.socket=socket;<br />}<br />public void run()<br />{<br />try<br />{<br />//获取套接字的输入输出流<br />reader=new DataInputStream(socket.getInputStream());<br />writer=new DataOutputStream(socket.getOutputStream());<br />String msg;<br />//如果收到客户端发来的数据<br />while((msg=reader.readUTF())!=null)<br />{<br />//向客户机传送0-2之间的整型随机数<br />writer.writeUTF(rnd.nextInt(3)+&quot;\n&quot;);<br />writer.flush();<br />System.out.println(&quot;来自客户机:&quot;+msg);<br /><br />}<br />}catch(Exception e){}finally<br />{<br />try<br />{<br />sManager.remove(socket);  //删除套接字<br />//关闭输入输出流及套接字<br />if(reader!=null)reader.close();<br />if(writer!=null)writer.close();<br />if(socket!=null)socket.close();<br />reader=null;<br />writer=null;<br />socket=null;<br />//向屏幕输出相关信息<br />System.out.println(&quot;客户机离开&quot;);<br />System.out.println(&quot;当前客户机的连接数:&quot;+sManager.size());<br />}catch(Exception e){}<br />}<br />}<br />}<br /><br />}=====================================<br />知识点:套接字管理器(Vector)会将于客户机连接的套接字添加到其列表中,在客户机断开连接后,在将相应的套接自从列表中删除,从中可以看出,客户机连接数与列表中添加套接字数目是一致的。<br />Vector sManager=new Vector();<br />sManager.add(socket);   // 向列表添加套接字<br />sManager.remove(socket);   //从列表移除套接字<br />sManager.size();  //获取客户机连接数<br /><br />客户端代码:Client4.mxml<br />================================================================================== 复制内容到剪贴板 代码:<br />&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;<br />&lt;mx:Application xmlns:mx=&quot;http://www.adobe.com/2006/mxml&quot; layout=&quot;absolute&quot; fontSize=&quot;12&quot; creationComplete=&quot;initApp()&quot; width=&quot;353&quot; height=&quot;336&quot;&gt;<br />&lt;mx:Script&gt;<br />&lt;!]&gt;<br />&lt;/mx:Script&gt;<br />&lt;mx:TextArea x=&quot;10&quot; y=&quot;32&quot; width=&quot;331&quot; height=&quot;263&quot; id=&quot;myText&quot;/&gt;<br />&lt;mx:TextInput x=&quot;10&quot; y=&quot;303&quot; width=&quot;245&quot; id=&quot;myInput&quot;/&gt;<br />&lt;mx:Button x=&quot;273&quot; y=&quot;304&quot; label=&quot;发送&quot; id=&quot;myBtn&quot; click=&quot;sendMessage(myInput.text)&quot;/&gt;<br />&lt;mx:Label x=&quot;10&quot; y=&quot;10&quot; text=&quot;规则:0代表剪刀;1代表锤;2代表包袱&quot; width=&quot;331&quot; fontWeight=&quot;bold&quot;/&gt;<br /><br />&lt;/mx:Application&gt;=========================================<br /><br /><blockquote class="blockquote">From: http://www.ia56.com/read-htm-tid-29.htmlPowered by PHPWind.com</blockquote>
页: [1]
查看完整版本: Flex和java的socket通信三