黑铁时代
Programing is not only one kind of technology, but also one kind of art.

一 Flash端代码

public var socket:Socket;

public function init():void
{
socket = new Socket();
socket.connect( 'localhost', 12345 ); // 通过socket链接服务器

// 监听链接,错误和收到数据的事件对象
socket.addEventListener( Event.CONNECT, this.onConnect );
socket.addEventListener( IOErrorEvent.IO_ERROR, this.onError );
socket.addEventListener( ProgressEvent.SOCKET_DATA, this.onSocketData );
}

public function onConnect( event:Event ):void
{
trace( 'The socket has been connected... ' );
}

public function onError( event:IOErrorEvent ):void
{
trace( 'The socket connection occurs error...' );
}

public function onSocketData( event:ProgressEvent ):void
{
trace( 'The socket received: ' + socket.bytesAvailable );

// 读取从服务器收到的数据,bytesAvailable存储着可以读取的字节个数,每读一个直接,bytesAvailable就减少一
var bytes:ByteArray = new ByteArray();
while ( socket.bytesAvailable ) {
socket.readBytes( bytes, 0, bytes.length );
Alert.show( bytes.toString() );
}
}

public function sendData():void
{

// 现将数据写入缓存
var bytes:ByteArray = new ByteArray();
bytes.writeByte( 110 );
bytes.writeByte( 120 );
bytes.writeByte( 121 );
bytes.writeByte( 131 );
bytes.writeByte( 111 );
socket.writeBytes( bytes, 0, 3 );

var obj:Object = new Object();
obj.x = 100;
obj.y = '100';
socket.writeObject( obj );

socket.flush(); // 通过flush一次将缓存中的数据推向服务器
}

 

二 PHP端代码

function log_socket($message = "") {
$logFile = fopen('./websocket.log', 'ab+');
fwrite($logFile, $message."\n");
} // 写日志函数

error_reporting(E_ALL);
set_time_limit(0); // 永远不超时
ob_implicit_flush();

$host = 'localhost';
$port = '12345';
$queue = 20;

$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP) or die('socket_create() failed...'); // 创建服务器的socket
socket_set_option($socket, SOL_SOCKET, SO_REUSEADDR, 1) or die('socket_set_option() failed...');
socket_bind($socket, $host, $port); // 绑定主机名和端口到该服务器socket上
socket_listen($socket, $queue); // 监听该socket,队列最大数量是20

$sockets = array();
$changed_sockets = array();
$index = 0;
$sockets[$index++] = $socket;
$handmessage = 'Hello, client socket connected!';

log_socket( 'Socket created, host:' . $host . ', port:' . $port . '\n' );

while(true) { // 死循环去监听有响应的socket
$changed_sockets = $sockets;
socket_select($changed_sockets, $write = null, $except = null, null); // 阻塞,直到有某个socket响应

foreach( $changed_sockets as $changed_socket ) { // 遍历所有有响应的socket
if ( $socket == $changed_socket ) { // 如果是服务器的socket,表示有新的客户端socket请求连接
$clientSocket = socket_accept($socket);

if ( $clientSocket ) { // 这里用于编写握手协议的代码
$sockets[$index++] = $clientSocket;
socket_write($clientSocket, $handmessage, strlen($handmessage));

log_socket( 'Get the client socket request...\n' );
}
}
else { // 如果是客户端的socket,那么读取客户端发送的数据
$bytes = @socket_recv($changed_socket, $buffer, 1024, 0);

if ( $bytes ) { // 这里用于编写处理客户端数据的代码
socket_write($changed_socket, 'Has get your message:' .$buffer );

log_socket( 'Get the client socket data:'. $buffer. ', socket:'.$changed_socket );
}
else { // 客户端主动断开socket链接
socket_close( $changed_socket );

log_socket( 'Close socket:' . $changed_socket );
}
}
}
}

posted on 2013-02-24 17:19  黑铁时代  阅读(395)  评论(0编辑  收藏  举报