基本套接字服务器

时间:2013-03-08 17:32:36

标签: c++ sockets actionscript server-side

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

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

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

  • 创建一个套接字并激活它们:listen(),accept()。当它接受时,它还将从accept()接收的新套接字添加到连接数组中。
  • 根据连接数组的长度运行的for循环,并在每个套接字上运行receive()(我没有在这些连接上调用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();
            }

        }

    }

}

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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

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

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

我猜你在包装Socket对象的Server和Client类之间有点混淆,试着只使用Socket对象(如上例所示) 当你明白那时你可以进一步抽象/构建更大的类