目的:做一个简单的多玩家多线程的猜拳游戏。每个客户机都与服务端的一个套接字进行通信,但是各个客户机之间不进行通信。服务器受到客户机的连接请求时会创建新的套接字并使其与客户机连接。然后启动线程与客户机进行数据交换。套接字管理器是一个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通信。希望对有需要的人有所帮助
分享到:
相关推荐
在本学习笔记中,我们将探讨如何使用Java的Socket编程实现多线程服务器,特别是通过ExecutorService创建线程池来处理客户端的并发请求。ExecutorService是一个高级的线程管理工具,它允许我们更有效地管理和控制线程...
读书笔记:java socket 编程计算机网络TCP作业
Contiki学习笔记:创建两个交互进程 Contiki 主函数剖析: Contiki学习笔记:main函数剖析 Contiki学习笔记:启动一个进程process_start Contiki学习笔记:系统进程etimer_process Contiki学习笔记:深入理解process...
读书笔记:NIO与Socket编程技术指南
读书笔记:《Java 8实战》学习笔记
读书笔记:NIO与Socket编程技术指南例子
读书笔记:实战Java高并发程序设计学习笔记
读书笔记:《Java 测试驱动开发》学习笔记
Java学习笔记 Java是一种流行的编程语言,广泛应用于Android应用程序开发、Web应用程序开发、桌面应用程序开发等领域。以下是Java学习笔记的摘要信息: 一、Java技术基础 * 1.1 编程语言:Java是一种面向对象的...
读书笔记:尚硅谷Java设计模式图解+框架源码剖析学习笔记
Java开发 - 尚硅谷JavaWeb学习笔记 - Part1: https://blog.csdn.net/qq_63317769/article/details/139883728 Java开发 - 尚硅谷JavaWeb学习笔记 - Part2: Java开发 - 尚硅谷JavaWeb学习笔记 - Part3: Java开发 ...
读书笔记:学习Java编程思想
读书笔记:学习java网络编程
10. **学习资源**:提供的“Flex与Java通讯-1.exe”和“Flex与Java通讯-2.exe”很可能是教学视频,而“flex连接java.TXT”可能是配套的代码示例或笔记,帮助学习者深入理解并实践Flex与Java的交互技术。 以上是关于...
读书笔记:参考Java高并发编程详解多线程与架构设计汪文君学习笔记及源码
读书笔记:Effective Java中文版学习项目
读书笔记:读Java编程思想
读书笔记:图解Java设计模式
读书笔记:《Java网络编程》
读书笔记:Effective Java中文版第3版笔记