1

所以我要做的是了解套接字是如何工作的,以及如何制作一个简单的服务器来在服务器和客户端应用程序之间进行通信

我尝试使用 AS3 和名为 Red Tamarin 的项目来完成此操作(在控制台上运行 AS3 代码,但目前并不重要)

我设法创建了一个基本服务器,它的功能基本上是这样的:

  • 创建一个套接字并在其上激活这些:listen()、accept()。当它接受时,它还将从 accept() 接收到的新套接字添加到连接数组中。
  • 一个根据连接数组的长度运行并在每个套接字上运行 receive() 的 for 循环(我没有在这些连接上调用 listen() / accept(),应该吗?)

我的 actionscript 3 应用程序成功连接到服务器,然后出于测试目的,我决定从客户端不间断地向服务器写入(),只是为了确保服务器确实在获取数据,这样我才能真正走得更远添加更多功能..

但是服务器似乎根本没有得到任何进一步的信息..它似乎只响应连接/断开连接,但并没有真正在它们之间监听任何其他信息..

我知道显示我的代码会更好,但是现在我想知道我是否正确地处理了这个问题,我在互联网上读到了它,看起来我是这样,但我来这里只是为了确保..

提前致谢!

编辑:我被要求提供我的一些代码,至少是最重要的部分

private var _connections:Array;
private var _socket:Socket;
private var _server:Client;
private var _running:Boolean;
private var _port:uint;
private var _address:String;

public function Server(address:String, port:uint)
{
    _connections = [];
    _address = address;
    _port = port;
    _running = false;
    _socket = new Socket();

}
public function start():void {
    _socket.bind(_port, _address);
    _socket.listen(128);
    _running = true;
    _server = new Client(_socket);
    _addClient(_server);
    _start();
}
private function _start():void {
    while (_running) {
        _loop();
    }
}
private function _addClient(client:Client):void {
    _connections.push(client);
}
public function _loop():void 
{
    var i:uint;
    var selected:Client;
    var newconn:Socket;
    for (i = 0; i < _connections.length; i++ ) {
        selected = _connections[i];
        if (selected.hasData()) {
            if (selected == _server) {

                //accept a new client connection
                newconn = _socket.accept();
                if (!newconn.valid){
                //Invalid.
                } 
                else {
                    //Add a new client
                    _addClient(new Client(newconn));
                }
            } else {
                //Read data from clients
                selected._socket.receive();
            }

        }

    }

}
4

2 回答 2

1

只是为了回答您的 listen()/accept() 问题,您只需要在服务器初始设置时调用一次 listen()。之后,您需要为要建立的每个新客户端连接执行 accept()(因为 accept() 将返回处理新客户端的套接字文件描述符)。

在客户端被接受()之后,您将使用客户端的套接字文件描述符来接收()或发送()任何数据。

于 2013-03-08T19:31:46.503 回答
0

看看这个例子 https://code.google.com/p/spitfire-and-firedrop/source/browse/trunk/socketpolicyd/src/spitfire/SocketPolicyServer.as

从我在代码中看到的主循环中,您只检查是否可以读取当前套接字,还需要检查是否可以写入当前套接字

还要注意每个人都有一个套接字句柄,服务器和客户端

我的猜测是您对包装 Socket 对象的 Server 和 Client 类感到有些困惑,请尝试仅使用 Socket 对象(如上例所示),当您了解这一点时,您可以走得更远,抽象/结构更大班级

于 2013-06-19T17:40:22.137 回答