c# - Sockets starts to slow down and not respond -


i developing server (with c#) , client (with flash, actionscript 3.0) application. server sends data (datas arround 90 bytes) clients continuously , clients behave according data received (data json formatted)

for while, works expected after time passed, clients start receive messages laggy. keep waiting time , behave according last message (some messages lost). after time passed clients starts wait , process messages @ same time. not figured out causing this. network condition stable.

here part of c# code, sending message:

public void send(byte[] buffer)     {         if (clientsocket != null && clientsocket.connected)         {             clientsocket.beginsend(buffer, 0, buffer.length, 0, writecallback, clientsocket);         }     }      private void writecallback(iasyncresult result)     {         //     } 

and part of client, receiving message (actionscript)

socket.addeventlistener(progressevent.socket_data, onresponse); function onresponse(e:progressevent):void { trace(socket.bytesavailable); if(socket.bytesavailable > 0) {     try     {         var serverresponse:string = socket.readutfbytes(socket.bytesavailable); 

....

i hope explain problem. how should optimize code? can causing lags. thanks.

you need give more detail how you're setting socket (is tcp or udp?)

assuming it's tcp socket, appear client relies on each receive call returning same number of bytes sent server's send() call. not case, , cause of issues if message being partially received on client, or multiple messages received @ once.

for example, server may send 90 byte message in single call, client may receive in 1 90-byte receive, or 2 45-byte chunks, or 90 x 1-byte chunks, or in between. multiple messages sent server may partially combined when received client. e.g. 2 90-byte messages may received in single 180-byte chunk, or 150-byte , 30-byte chunk, etc. etc.

you need therefore provide kind of framing on messages when stream of data received client, can reliably reconstructed individual messages.

the basic framing mechanism prefix each message sent fixed-length field indicating message size. may able away single byte if can guarantee messages never > 255 bytes long, simplify receiving code.

on client side, first need receive length prefix, , read many bytes off socket construct message data. if receive fewer required number of bytes, receiving code must wait more data (appending partially-received message when received) until has complete message of the.

once full message received can processed currently.

unfortunately don't know actionscript, can't give example of client-side code, here's how might write server , client framing in c#:

server side:

public void sendmessage(string message) {     var data = encoding.utf8.getbytes(message);     if (data.length > byte.maxvalue) throw new exception("data exceeds maximum size");     var bufferlist = new[]     {         new arraysegment<byte>(new[] {(byte) data.length}),         new arraysegment<byte>(data)     };     clientsocket.send(bufferlist); } 

client side:

public string readmessage() {     var header = new byte[1];     // read header indicating data length     var bytesread = serversocket.receive(header);     if (bytesread > 0)     {         var datalength = header[0];         // if message size zero, return empty string         if (datalength == 0) return string.empty;         var buffer = new byte[datalength];         var position = 0;         while ((bytesread = serversocket.receive(buffer, position, buffer.length - position, socketflags.none)) > 0)         {             // advance position number of bytes read             position += bytesread;             // if there's still more data read before have full message, call receive again             if (position < buffer.length) continue;             // have complete message - return it.             return encoding.utf8.getstring(buffer);         }     }     // if receive returns 0, socket has been closed, return null indicate this.     return null; } 

Comments

Popular posts from this blog

django - How can I change user group without delete record -

java - Need to add SOAP security token -

java - EclipseLink JPA Object is not a known entity type -