gpt4 book ai didi

actionscript-3 - 在不使用服务器套接字的情况下监听 AS3 (AIR) 客户端中的传入连接

转载 作者:行者123 更新时间:2023-12-04 04:31:13 33 4
gpt4 key购买 nike

我设法创建了一个 C# 服务器,它使用 sockets 将文件发送到 AS3(AIR) 客户端.在 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 客户端/服务器逻辑的情况下有不同的方法来实现我的目标,请随时提出您的意见。

最佳答案

是的。您的客户端应该通过 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

关于actionscript-3 - 在不使用服务器套接字的情况下监听 AS3 (AIR) 客户端中的传入连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13949672/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com