我设法创建了一个使用sockets
将文件发送到AS3(AIR)客户端的C#服务器。在AS3方面,我使用flash.net.Socket
库通过TCP
接收数据。
这是它的工作原理:
- >我打开我的服务器,它会监听客户端(另外我可以创建一个连接设备列表);
- >我打开我的客户端,它会自动接收数据;
接收数据的触发事件是在客户端上进行的,即我只是打开服务器,当客户端打开时,它获取数据,触发这些事件:
socket.addEventListener(Event.CONNECT, onConnect); -> to connect to the server
socket.addEventListener(Event.SOCKET_DATA, onDataArrival); -> to receive the data
现在我想做一些与众不同的事情。我不想在客户端上触发它,我希望服务器这样做,即,我想打开我的客户端,并在服务器上放入客户端将获取数据。
那么为什么我要尝试将客户端设为客户端/服务器?好吧,因为我的服务器是一台机器,而我的客户端是连接服务器的XXX移动设备,这是我实现这一目标的方法。
所以,根据我刚才所说的,我设法使用flash.net.ServerSocket
库创建了我想要的AS3客户端/服务器应用程序。
首先我把客户端听了:
serverSocket.bind(portNumber, "10.1.1.212");
serverSocket.addEventListener(ServerSocketConnectEvent.CONNECT, onConnectServer);
serverSocket.listen();
然后我使用flash.net.Socket
Event.SOCKET_DATA
这就是它。像我想要的那样工作。
但是,flash.net.ServerSocket
与移动设备不兼容,但......
所以这是我的问题:我需要从C#服务器(需要侦听客户端,因此我可以创建一个连接设备列表)向AS3(AIR)客户端发送文件,但我必须定义哪个客户端正在获取服务器上的数据,客户端需要随时准备接收数据,因此,监听,但有很多,这就是我认为它们作为客户端的原因。
我的问题是:有没有办法让客户端监听传入的连接并在事件发生时触发事件,而不使用AS3中的服务器套接字?
此外,如果你有不同的方法来实现我的目标,而不使用C#服务器< - > AS3客户端/服务器逻辑,请随时提出您的意见。
答案 0 :(得分:6)
是。您的客户应通过flash.net.Socket
(doc)或flash.net.XMLSocket
(doc)连接到服务器。在大多数情况下,您只需要一个客户端可以连接的服务器。为什么两端都有服务器并不完全清楚?
编辑:
以下是客户端使用Socket
持续侦听来自服务器的消息的快速示例。这将连接到服务器,然后(无限期地)等待数据。当收到一大块数据时(在这种情况下,我希望字符串以新行字符终止),数据将与事件一起传递。
如果您尝试此方法但未成功,则应查看是否存在任何错误或连接是否已关闭。
文档类:
package {
import flash.display.Sprite;
public class Main extends Sprite {
protected var socket:SocketTest;
public function Main() {
this.socket = new SocketTest();
this.socket.addEventListener(SocketMessageEvent.MESSAGE_RECEIVED, onSocketMessage);
this.socket.connect("127.0.0.1", 7001);
}
protected function onSocketMessage(e:SocketMessageEvent):void {
var date:Date = new Date();
trace(date.hoursUTC + ":" + date.minutesUTC + ":" + date.secondsUTC + " Incoming message: " + e.message);
}
}
}
SocketTest类:
package {
import flash.net.Socket;
import flash.events.Event;
import flash.events.IOErrorEvent;
import flash.events.SecurityErrorEvent;
import flash.events.ProgressEvent;
import flash.errors.IOError;
public class SocketTest extends Socket {
protected var _message:String;
public function SocketTest() {
super();
this._message = "";
this.addEventListener(Event.CONNECT, socketConnected);
this.addEventListener(Event.CLOSE, socketClosed);
this.addEventListener(ProgressEvent.SOCKET_DATA, socketData);
this.addEventListener(IOErrorEvent.IO_ERROR, socketError);
this.addEventListener(SecurityErrorEvent.SECURITY_ERROR, socketError);
}
protected function socketData(event:ProgressEvent):void {
var str:String = readUTFBytes(bytesAvailable);
//For this example, look for \n as a message terminator
var messageParts:Array = str.split("\n");
//There could be multiple messages or a partial message,
//pass on complete messages and buffer any partial
for (var i = 0; i < messageParts.length; i++) {
this._message += messageParts[i];
if (i < messageParts.length - 1) {
this.notifyMessage(this._message);
this._message = "";
}
}
}
protected function notifyMessage(value:String):void {
this.dispatchEvent(new SocketMessageEvent(SocketMessageEvent.MESSAGE_RECEIVED, value));
}
protected function socketConnected(event:Event):void {
trace("Socket connected");
}
protected function socketClosed(event:Event):void {
trace("Connection was closed");
//TODO: Reconnect if needed
}
protected function socketError(event:Event):void {
trace("An error occurred:", event);
}
}
}
SocketMessageEvent类:
package {
import flash.events.Event;
public class SocketMessageEvent extends Event {
public static const MESSAGE_RECEIVED:String = "messageReceived";
protected var _message:String;
public function SocketMessageEvent(type:String, message:String = "", bubbles:Boolean = false, cancelable:Boolean = false) {
super(type, bubbles, cancelable);
this._message = message;
}
public function get message():String {
return this._message;
}
}
}
作为测试,我将服务器设置为每5秒发送一条消息,这是控制台中的输出:
Socket connected
21:36:24 Incoming message: Message from server: 0
21:36:29 Incoming message: Message from server: 1
21:36:34 Incoming message: Message from server: 2
21:36:39 Incoming message: Message from server: 3
21:36:44 Incoming message: Message from server: 4
21:36:49 Incoming message: Message from server: 5