当前位置:编程学习 > 网站相关 >>

AS3 Socket从零开始

大家如果想学AS3 Socket直接在百度里搜一下,会找到很多AS3与Java服务器的例子,很多朋友也许看得很糊涂,也有很多朋友看懂了,但想学更进一步的学习却又不好找教程了。这里我对网上常见的一个例子加点注释,并在原有的基础上加一些改动。
先附上网上找的AS3客户端代码:
package
{
import flash.display.Sprite;
import flash.events.*;
import flash.net.Socket;
import flash.utils.ByteArray; public class SocketExample extends Sprite
{ // The state constants to describe the protocol
public const DETERMINE_VERSION:int = 0;
public const RECEIVE_CHALLENGE:int = 1;
public const NORMAL:int = 2;
public const PORT:int = 5678; // Maps a state to a processing function
private var stateMap:Object; // Keeps track of the current protocol state
private var currentState:int; private var socket:Socket; public function SocketExample( )
{
// Initialzes the states map
stateMap = new Object( );
stateMap[DETERMINE_VERSION] = readVersion;
stateMap[RECEIVE_CHALLENGE] = readChallenge;
stateMap[NORMAL] = readNormalProtocol; // Initialze the current state
currentState = DETERMINE_VERSION; // Create and connect the socket
socket = new Socket( );
socket.addEventListener( ProgressEvent.SOCKET_DATA, onSocketData );
socket.addEventListener( Event.CONNECT, onConnect );
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( "localhost", PORT );
} 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"));

// Look up the processing function based on the current state
var processFunc:Function = stateMap[currentState];
processFunc( );
} private function readVersion( ):void
{
// Step 1 - read the version from the server
var version:int = socket.readInt(); // Once the version is read, the next state is receiving
// the challenge from the server
currentState = RECEIVE_CHALLENGE; // Step 2 - write the version back to the server
socket.writeInt( version );
socket.flush( );
} private function readChallenge( ):void
{
// Step 3 - read the 8 byte challenge into a byte array
var bytes:ByteArray = new ByteArray( );
socket.readBytes( bytes, 0, 8 ); // After the challenge is received, the next state is
// the normal protocol operation
currentState = NORMAL; // Step 4 - write the bytes back to the server
socket.writeBytes( bytes );
socket.flush( );
}

private function readMultiByte( ):void
{
socket.readMultiByte(socket.bytesAvailable, "UTF-8");
} private function readNormalProtocol( ):void
{
// Step 5 - process the normal socket messages here now that
// that handshaking process is complete
}
}
}

java 服务端代码
import java.io.*;
import java.net.*;
public class SocketSever {
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();
}
}
}
 
 
测试的时候flash得先从组件里拉一个Button组件到舞台上,并取个实例名btnSend,然后先运行java服务端,再启动客户端,点击按钮就会看到连接成功的输出。
上面的代码显得有点乱,如果看不懂没关系,我们把上面的代码精简一下。
首先是AS3
如果我们要用Socket,得先导入import flash.net.Socket;这个包。如果我们把这个类当文档类来使用的话,需要导入import flash.display.Sprite;这个包。最后我们得是否连接成功这个事件,还得导入import flash.events.*;这个包。
所以代码如下:
package
{
import flash.display.Sprite;
import flash.events.*;
import flash.net.Socket;
public class Main
{ public function Main()
{
// constructor code
}
}
}

第二步,我们需要建立一个Socket并作初始化,然后连接到服务器。加上上面的代码如下:
package
{
import flash.display.Sprite;
import flash.events.*;
import flash.net.Socket;
public class Main extends Sprite
{
private var socket:Socket;
public function Main()
{
socket = new Socket();
socket.connect( "localhost", 5678);
}
}
}

对应的Java服务端代码:
import java.io.*;
import java.net.*;
public class Server {
public static void main(String[] args) throws IOException{
ServerSocket server=new ServerSocket(5678);//建立一个Socket服务端。
server.accept();//等待客户端连接,如果没有客户端连接,
//程序会停在此行,而不会执行下一行。
System.out.println("客户端已连接!");//当有客户端连接上来的时候,
//打印输出客户端已连接。
}
}

以上代码可以说是最简单的Socket连接。
 
 
到这里,服务端代码暂时不管,先把给客户端的Socket加上事件,所以我们在连接到服务器前先加上以下两行代码:
socket.addEventListener(Event.CONNECT, onSocketConnect);//侦听Socket是否已连接上。
socket.addEventListener(Event.CLOSE, onSocketSeverClose);//侦听服务器是否已关闭。
然后写上事件的处理函数。
完整代码如下:
package
{
import flash.display.Sprite;
import flash.events.*;
import flash.net.Socket;
public class Main extends Sprite
{
private var socket:Socket;
public function Main()
{
socket = new Socket();//新建一个Socket

socket.addEventListener(Event.CONNECT, onSocketConnect);//侦听Socket是否已连接上。
socket.addEventListener(Event.CLOSE, onSocketSeverClose);//侦听服务器是否已关闭。

socket.connect( "localhost", 5678);//连接到服务器
}

private function onSocketConnect(e:Event):void
{
trace("已连接上服务器!");
}

private function onSocketSeverClose(e:Event):void
{
trace("服务器已关闭!");
}
}
}

 
 
启动服务端再测试下。发现我们刚连上服务器,服务器就关闭了。所以我们把服务端代码也改一下。
import java.io.*;
import java.net.*;
public class Server {
public static void main(String[] args) throws IOException{
ServerSocket server=new ServerSocket(5678);//建立一个Socket服务端。
while(true)
{
server.accept();//等待客户端连接,如果没有客户端连接,程序会停在此行,而不会执行下一行。
System.out.println("客户端已连接!");//当有客户端连接上来的时候,打印输出客户端已连接。
}
}
}

这里我只是在等待客户端连接的地方加了个死循环,这们服务端不会在有客户端连上来后自动关闭了,它会一直等等服务端的连接。大家可以再测试一下。
 
 
 
接下来,我们在连接服务器后,向服务器发送一个字符串。发送字符串会用到Socket的write方法和flush方法。write方法只是将要发送的信息存储起来,但没真正发送出去。而flush方法是将要发送的信息发送

补充:综合编程 , 其他综合 ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,