FlexAS3与Java的Socket通信.docx
- 文档编号:3538317
- 上传时间:2022-11-23
- 格式:DOCX
- 页数:19
- 大小:28.64KB
FlexAS3与Java的Socket通信.docx
《FlexAS3与Java的Socket通信.docx》由会员分享,可在线阅读,更多相关《FlexAS3与Java的Socket通信.docx(19页珍藏版)》请在冰豆网上搜索。
FlexAS3与Java的Socket通信
FlexAS3与Java的Socket通信
今天突发奇想,网页的flash游戏都是怎么做的,所以看了看flash和java的socket通信,结果还真好用。
。
。
太邪恶了
新建flash文件:
SocketExample.fla
添加按钮:
btnSend
修改文档类为:
SocketExample
新建AS3文件:
SocketExample.as
package {
import flash.display.Sprite;
import flash.events.*;
import .Socket;
public class SocketExample extends Sprite {
private var socket:
Socket;
public function SocketExample( ) {
socket = new Socket( );
// Add an event listener to be notified when the connection
// is made
socket.addEventListener( Event.CONNECT, onConnect );
// Listen for when data is received from the socket server
socket.addEventListener( ProgressEvent.SOCKET_DATA, onSocketData );
//var btnSend:
Button = new Button();
btnSend.label = "Send Data";
btnSend.emphasized = true;
btnSend.width = 150;
btnSend.move(20, 20);
addChild(btnSend);
btnSend.addEventListener(MouseEvent.CLICK, sendData);
}
private function sendData( event:
Event ) {
if (!
socket.connected) {
// Connect to the server
socket.connect( "192.168.2.103", 5678 );
}
trace("send...");
socket.writeUTFBytes("example\n");
socket.flush();
}
private function onConnect( event:
Event ):
void {
trace( "The socket is now connected..." );
}
private function onSocketData( eventrogressEvent ):
void {
trace( "Socket received " + socket.bytesAvailable + " byte(s) of data:
" );
trace(socket.readMultiByte(socket.bytesAvailable, "UTF-8"));
}
}
}
package{
importflash.display.Sprite;
importflash.events.*;
import.Socket;
publicclassSocketExampleextendsSprite{
privatevarsocket:
Socket;
publicfunctionSocketExample(){
socket=newSocket();
//Addaneventlistenertobenotifiedwhentheconnection
//ismade
socket.addEventListener(Event.CONNECT,onConnect);
//Listenforwhendataisreceivedfromthesocketserver
socket.addEventListener(ProgressEvent.SOCKET_DATA,onSocketData);
//varbtnSend:
Button=newButton();
btnSend.label="SendData";
btnSend.emphasized=true;
btnSend.width=150;
btnSend.move(20,20);
addChild(btnSend);
btnSend.addEventListener(MouseEvent.CLICK,sendData);
}
privatefunctionsendData(event:
Event){
if(!
socket.connected){
//Connecttotheserver
socket.connect("192.168.2.103",5678);
}
trace("send...");
socket.writeUTFBytes("example\n");
socket.flush();
}
privatefunctiononConnect(event:
Event):
void{
trace("Thesocketisnowconnected...");
}
privatefunctiononSocketData(eventrogressEvent):
void{
trace("Socketreceived"+socket.bytesAvailable+"byte(s)ofdata:
");
trace(socket.readMultiByte(socket.bytesAvailable,"UTF-8"));
}
}
}
Java服务器端:
MyServer.java
import java.io.*;
import .*;
public class MyServer {
public static void main(String[] args) throws IOException{
ServerSocket server=new ServerSocket(5678);
while (true) {
Socket client=server.accept();
BufferedReader in=new BufferedReader(new InputStreamReader(client.getInputStream()));
PrintWriter out=new PrintWriter(client.getOutputStream());
//while(true){
String str=in.readLine();
System.out.println(str);
out.println("has receive....");
out.flush();
if("end".equals(str))
break;
//}
client.close();
}
}
}
importjava.io.*;
import.*;
publicclassMyServer{
publicstaticvoidmain(String[]args)throwsIOException{
ServerSocketserver=newServerSocket(5678);
while(true){
Socketclient=server.accept();
BufferedReaderin=newBufferedReader(newInputStreamReader(client.getInputStream()));
PrintWriterout=newPrintWriter(client.getOutputStream());
//while(true){
Stringstr=in.readLine();
System.out.println(str);
out.println("hasreceive....");
out.flush();
if("end".equals(str))
break;
//}
client.close();
}
}
}
客户端控制台输出:
send...
Thesocketisnowconnected...
Socketreceived17byte(s)ofdata:
hasreceive....
外加一些AS3的Socket方法:
我们在使用ActionScript3.0进行Socket编程的时候需要关注下面的问题,我们将在今后的学习中逐个对下面的问题进行讨论,并尽量逐渐的改进我们的程序.
1.与Socket服务器建立连接.
2.向Socket服务器发送数据.
3.从Socket服务器读数据.
4.同Socket服务器进行握手,并确定收到了什么样的数据和如何处理这些数据.
5.与Socket服务器断开,或者当服务器想与你断开的时候发消息给你.
6.处理使用Sockets时候引发的错误.
1.与Socket服务器建立连接.
解决方法:
我们通过调用Socket.connect()或者XMLSocket.connect()方法并监听网络连接的事件消息.
讨论:
连接一台Socket服务器你需要确定两个信息,一个是Socket服务器的域名或者IP地址,另一个是服务器监听的端口号.
无论你使用的是Socket还是XMLSocket类的实例,连接请求都是完全的一样的,两个类都是使用一个名叫connect()的方法,该方法有两个参数:
host:
该参数为字符串类型,可以是一个域名,例如"",也可以是一个IP地址,例如"192.168.1.101".如果Socket服务器与你该Flash影片发布的Web服务器是同一个,该参数为Null.
port:
该参数为一个表示Socket服务器监听端口的int值.该值最小为1024.除非在服务器中有一个policy文件,用于指定允许端口号小于1024.
因为FlashSocket编程是一个异步的过程,connect()方法不会等到一个连接完成后再执行下一行代码的执行.如果你想在一个连接完全执行完之前与一个Socket完全绑定,那么你将会得到一个意想不到的结果,并且你当前的代码将不能工作.
在尝试一个新的Socket连接的时候我们最好先添加一个连接事件监听器.当一个连接建立成功,Socket或者XMLSocket会发出一个连接事件,这就可以让你知道交互已经准备好了.
下面举了一个Socket实例与本地Socket服务器的2900端口建立连接的例子:
package{
importflash.display.Sprite;
importflash.events.*;
import.Socket;
publicclassSocketExampleextendsSprite{
privatevarsocket:
Socket;
publicfunctionSocketExample( ){
socket=newSocket( );
//Addaneventlistenertobenotifiedwhentheconnection
//ismade
socket.addEventListener(Event.CONNECT,onConnect);
//Connecttotheserver
socket.connect("localhost",2900);
}
privatefunctiononConnect(event:
Event):
void{
trace("Thesocketisnowconnected...");
}
}
}
如果你想通过XMLSocket与服务器建立连接代码也是基本一样的.首先你创建了一个连接事件监听器,然后调用connect()方法.所不同的是Socket实例改为了XMLSocket:
package{
importflash.display.Sprite;
importflash.events.*;
import.XMLSocket;
publicclassSocketExampleextendsSprite{
privatevarsocket:
XMLSocket;
publicfunctionSocketExample( ){
socket=newXMLSocket( );
//Addaneventlistenertobenotifiedwhentheconnectionismade
socket.addEventListener(Event.CONNECT,onConnect);
//Connecttotheserver
socket.connect("localhost",2900);
}
privatefunctiononConnect(event:
Event):
void{
trace("Thexmlsocketisnowconnected...");
}
}
}
如果连接失败,可那是下面两种原因的一种:
一种是连接立即失败和运行时错误,另一种是如果无法完成连接从而产生一个ioError或者securityError事件.关于错误事件处理信息的描述,我们打算改日讨论.
请牢记,当与一个主机建立一个Socket连接时,FlashPlayer要遵守如下安全沙箱规则.
1.Flash的.swf文件和主机必须严格的在同一个域名,只有这样才可以成功建立连接.
2.一个从网上发布的.swf文件是不可以访问本地服务器的.
3.本地未通过认证的.swf文件是不可以访问任何网络资源的.
4.你想跨域访问或者连接低于1024的端口,必须使用一个跨域策略文件.
如果尝试连接未认证的域或者低端口服务,这样就违反了安全沙箱策略,同时会产生一个securityError事件.这些情况都可以通过使用一个跨域策略文件解决.无论是Socket对象还是XMLSocket对象的策略文件,都必须在连接之前通过使用flash.system.Security.loadPolicyFile()方法载入策略文件.具体如下:
Security.loadPolicyFile("
获得的改策略文件不仅定义了允许的域名,还定义了端口号.如果你不设置端口号,那么FlashPlayer默认为80端口(HTTP协议默认端口).在
xmlversion="1.0"?
>
DOCTYPEcross-domain-policySYSTEM"
2.向Socket服务器发送数据.
解决方法:
对于Socket对象来说,通过是用write方法(writeByte(),writeUTFBytes()等方法.)先向缓存区写入数据,然后使用flush()方法发送数据.对于XMLSocket对象,使用send()方法.
讨论:
Socket和XMLSocket类向Socket服务器发送数据的方法是不相同的.让我们首先看一下Socket类的方法.
当你使用Socket对象向服务器发送数据的时候,你首先要将数据写入到一个缓冲区中.Socket类设置了一系列的方法来写数据.每一个方法都用于写不同的数据类型的数据(或者不同的数据).这些方法分别是:
writeBoolean(),writeByte(),writeBytes(),writeDouble(),writeFloat(),writeInt(),writeMultiByte(),writeObject(),writeShort(),write-UnsignedInt(),writeUTF(),和writeUTFBytes().这些方法大多数都只接受一个参数,该参数的类型同方法的名字相匹配.例如,writeBoolean()方法接受一个布尔值作为参数,而writeByte(),writeDouble(),writeFloat(),writeInt(),writeShort(),writeUnsignedInt()方法接受一个数字型参数.writeObject()方法接受一个对象类型作为参数,但该对象必须序列化成为AMF格式.writeBytes()方法允许你传一个ByteArray参数,并带有偏移量和长度两个参数.例如,下面这段代码,调用了一个writeBytes()方法,该方法将ByteArray对象中的所有byt值都传出去了(偏移量为0,长度和ByteArray数组长度等长):
socket.writeBytes(byteArray,0,byteArray.length);
writeUTF()和writeUTFBytes()方法允许你的发送字符串类型的参数.每个一个方法只接受一个字符串作为参数.writeUTFBytes()方法简单的将字符串作为Bytes发送.writeUTF()方法在写入真正数据之前,先写入byts的数量.
writeMultiByte()方法也允许字符串类型的参数,但是使用的为非默认字符集.该方法需要两个参数:
字符串和字符集名称.在Flash和Flex的帮助文档中有一个自持所有字符集的列表,该列表中的标签和描述符是一一对应的.使用标签值作为writeMultiByte()作为字符集.例如下面的代码发送了一个编码为Unicode的字符串:
socket.writeMultiByte("example","unicode");
相一个Socket对象传数值的方法完全依赖于你所有数据的类型和服务所接受数据的类型.使用一个Socket对象,你完全可以使用ActionScript写一个Telnet和POPmail客户端.这两种协议都支持ASCII字符指令.例如,在连接一个POP服务器之后,你可以通过使用USER指令指定一个用户.下面代码向一个Socket对象发一条指令:
//POPserversexpectanewline(\n)toexecutetheprecedingcommand.
socket.writeUTFBytes("USERexampleUsername\n");
向一个Socket对象写入数据其实并没有将数据发送到Socket服务器.每调用一个write方法都向Socket对象添加一个数据.例如,下面代码向一个Socket对象添加了四个byte的数据,但是没有一个发出了.
socket.writeByte
(1);
socket.writeByte(5);
socket.writeByte(4);
socket.writeByte(8);
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- FlexAS3 Java Socket 通信