Добрый день. Не так давно работаю на actionscripts3.0, занялся созданием клиент-серверного взаимодействия и столкнулся с проблемой:
Ее суть состоит в том, что пакеты с сервера в клиент идут с задержкой, приходят частями, т.е. рвутся.
Пробовал сначала писать первым байтом длину пакета, ничего не выходит с проверкой в клиенте.
На сервер все уходит на ура, обратно возникают проблемы.
Коды сервера и клиента прилагаются. Есть идеи, как решить? XML и фреймворки не хотелось бы.
Насчет размера пакета не уверен, учитывается ли байт размера, писал и 12, и 13- трассировщиком ничего отловить внятного не смог. Из моих наблюдений:
1. Пакет всегда рвется на разные части, определяется каким-то великим рандомом.
2. Функция sData(см. код) вызывается ровно 2 раза(если 3 порции информации, то в третий раз вызова нет и обработка не происходит).
Коды:
AS3.0:

Код AS1/AS2:
package {
import flash.display.Sprite;
import flash.net.Socket;
import mx.core.BitmapAsset;
import flash.events.*;
public class Main extends Sprite {
[Embed(source = 'load11.jpg')] private var load11:Class;
public var buff: int;
public function Main():void {
var load11:BitmapAsset = new load11();
var spr:Sprite = new Sprite();
spr.addChild(load11);
addChild(spr);
spr.addEventListener(MouseEvent.CLICK, func);
function func(event:MouseEvent):void
{
trace("use socket");
var s: Socket = new Socket();
s. addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
function ioErrorHandler(event:IOErrorEvent):void {
trace("ioErrorHandler: " + event);
}
s.connect("localhost", 1011);
var str: String;
str = 'Test';
s.writeByte(10); s.writeUTF(str); s.writeByte(15); s.writeUTF(str); s.flush(); buff = -1;
s.addEventListener(ProgressEvent.SOCKET_DATA, sData);
function sData(event:ProgressEvent):void
{
if (buff == -1) { buff = s.readByte(); }
if (buff == event.bytesLoaded)
{
var x:int, y:int, l:int;
var z:String;
var z1: String;
x = s.readByte();
trace(x);
y = s.readByte();
trace(y);
z = s.readUTF();
trace(z);
} else { trace("not ready: " + event.bytesLoaded + " " + buff ); }
}
}
}
}
}
JAVA:

Код:
/* ChatServer.java */
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
class Server {
private static int port = 1011; /* port the server listens on */
public static void main (String[] args) throws IOException {
ServerSocket server = null;
try {
server = new ServerSocket(port); /* start listening on the port */
} catch (IOException e) {
System.err.println("Could not listen on port: " + port);
System.err.println(e);
System.exit(1);
}
Socket client = null;
try {
client = server.accept();
} catch (IOException e) {
System.err.println("Accept failed.");
System.err.println(e);
System.exit(1);
}
DataInputStream in = new DataInputStream(client.getInputStream());
DataOutputStream os = new DataOutputStream(client.getOutputStream());
System.out.println("I Live!!!");
byte msg, def;
String str;
/* loop reading lines from the client and display them */
msg= in.readByte();
if (msg!=-1){ str= in.readUTF();
def=in.readByte();
str= in.readUTF();
System.out.println("Client says: " + msg + " "+ str + " : " + def);
msg= (byte) (msg+17);
def= (byte) (def *2);
str="test";
os.writeByte(12);//Размер пакета
os.writeByte(msg);
os.writeByte(def);
os.writeUTF(str);
os.flush();
}
}
}