Lexa_
08.06.2009, 16:08
Вот пример на Flex, коннектится к сокет-серверу, отправляет запрос, получает строку.
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
layout="absolute"
backgroundColor="#CCCCCC" height="449" width="676"
pageTitle="Test application">
<mx:TextArea id="tesst" right="10" bottom="36" top="71" width="254" text="{tracer}"/>
<mx:Button label="Connect" color="#5E3601" x="427" y="11" click="initConnect()"/>
<mx:Button x="412" y="41" label="Disconnect" click="sendRequest('EXIT')"/>
<mx:Button label="Update list" right="82" top="11" click="sendRequest('GetList')"/>
<mx:Script>
<![CDATA[
import flash.net.Socket;
public var tracer:String;
public var sock:Socket;
public function initConnect():void
{
sock = new CustomSocket("localhost", 3000);
configureListeners();
}
public function configureListeners():void {
sock.addEventListener(Event.CLOSE, closeHandler);
sock.addEventListener(Event.CONNECT, connectHandler);
sock.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
sock.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
sock.addEventListener(ProgressEvent.SOCKET_DATA, socketDataHandler);
tracer += "begin";
}
private function writeln(str:String):void {
str += "\n";
try {
sock.writeUTFBytes(str);
}
catch(e:IOError) {
tracer += "ERROR#" + e.errorID + ", " + e.name + ", " + e.message;
}
}
private function sendRequest(str:String):void {
tracer += "sendRequest \r";
writeln(str);
sock.flush();
}
private function readResponse():void {
var lenght:uint = sock.bytesAvailable;
try {
var str:String = sock.readUTFBytes(lenght);
tracer += "Read from socket " + lenght +" byte: " + str + "\r";
}
catch(e:EOFError) {
tracer += "ERROR#" + e.errorID + ", " + e.name + ", " + e.message;
}
}
private function socketDataHandler(event:ProgressEvent):void {
tracer += "socketDataHandler: " + event + "\r";
readResponse();
}
private function closeHandler(event:Event):void {
tracer += "closeHandler: " + event + "\r";
}
private function connectHandler(event:Event):void {
tracer += "connectHandler: " + event + "\r";
}
private function ioErrorHandler(event:IOErrorEvent):void {
tracer += "ioErrorHandler: " + event + "\r";
}
private function securityErrorHandler(event:SecurityErrorEvent):void {
tracer += "securityErrorHandler: " + event + "\r";
}
]]>
</mx:Script>
</mx:Application>
В результате получаю вот это:
nullbeginconnectHandler: [Event type="connect" bubbles=false cancelable=false eventPhase=2] // законнектились. все ок
sendRequest // отправили запрос
socketDataHandler: [ProgressEvent type="socketData" bubbles=false cancelable=false eventPhase=2 [B]bytesLoaded=63 bytesTotal=0] // получили ответ в 63 байта
Read from socket 0 byte: // а вот тут самое интересное, bytesAvailable вернул 0, ничего не прочитали.
Подозреваю, что где-то нубская ошибка, но поймать не могу. Если не трудно - ткните :)
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
layout="absolute"
backgroundColor="#CCCCCC" height="449" width="676"
pageTitle="Test application">
<mx:TextArea id="tesst" right="10" bottom="36" top="71" width="254" text="{tracer}"/>
<mx:Button label="Connect" color="#5E3601" x="427" y="11" click="initConnect()"/>
<mx:Button x="412" y="41" label="Disconnect" click="sendRequest('EXIT')"/>
<mx:Button label="Update list" right="82" top="11" click="sendRequest('GetList')"/>
<mx:Script>
<![CDATA[
import flash.net.Socket;
public var tracer:String;
public var sock:Socket;
public function initConnect():void
{
sock = new CustomSocket("localhost", 3000);
configureListeners();
}
public function configureListeners():void {
sock.addEventListener(Event.CLOSE, closeHandler);
sock.addEventListener(Event.CONNECT, connectHandler);
sock.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
sock.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
sock.addEventListener(ProgressEvent.SOCKET_DATA, socketDataHandler);
tracer += "begin";
}
private function writeln(str:String):void {
str += "\n";
try {
sock.writeUTFBytes(str);
}
catch(e:IOError) {
tracer += "ERROR#" + e.errorID + ", " + e.name + ", " + e.message;
}
}
private function sendRequest(str:String):void {
tracer += "sendRequest \r";
writeln(str);
sock.flush();
}
private function readResponse():void {
var lenght:uint = sock.bytesAvailable;
try {
var str:String = sock.readUTFBytes(lenght);
tracer += "Read from socket " + lenght +" byte: " + str + "\r";
}
catch(e:EOFError) {
tracer += "ERROR#" + e.errorID + ", " + e.name + ", " + e.message;
}
}
private function socketDataHandler(event:ProgressEvent):void {
tracer += "socketDataHandler: " + event + "\r";
readResponse();
}
private function closeHandler(event:Event):void {
tracer += "closeHandler: " + event + "\r";
}
private function connectHandler(event:Event):void {
tracer += "connectHandler: " + event + "\r";
}
private function ioErrorHandler(event:IOErrorEvent):void {
tracer += "ioErrorHandler: " + event + "\r";
}
private function securityErrorHandler(event:SecurityErrorEvent):void {
tracer += "securityErrorHandler: " + event + "\r";
}
]]>
</mx:Script>
</mx:Application>
В результате получаю вот это:
nullbeginconnectHandler: [Event type="connect" bubbles=false cancelable=false eventPhase=2] // законнектились. все ок
sendRequest // отправили запрос
socketDataHandler: [ProgressEvent type="socketData" bubbles=false cancelable=false eventPhase=2 [B]bytesLoaded=63 bytesTotal=0] // получили ответ в 63 байта
Read from socket 0 byte: // а вот тут самое интересное, bytesAvailable вернул 0, ничего не прочитали.
Подозреваю, что где-то нубская ошибка, но поймать не могу. Если не трудно - ткните :)