Muchos paquetes pequeños están bien. De hecho, si le preocupa la sobrecarga de TCP, simplemente inserte unbufferstream
que recopile hasta 1500 caracteres (o lo que sea que sea su MTU de TCP, lo mejor es solicitarlo dinámicamente) y lidiar con el problema en un solo lugar. Hacerlo le ahorra la sobrecarga de ~ 40 bytes por cada paquete adicional que de otro modo hubiera creado.
Dicho esto, aún es mejor enviar menos datos, y construir objetos más grandes ayuda allí. Por supuesto, es más pequeño enviar "UID:10|1|2|3
que enviar UID:10;x:1UID:10;y:2UID:10;z:3
. De hecho, también en este punto no debería reinventar la rueda, use una biblioteca como protobuf que pueda disminuir datos como ese a una cadena de 10 bytes o menos.
Lo único que no debes olvidar es insertar un Flush
comando en su flujo en ubicaciones relevantes, porque tan pronto como deje de agregar datos a su flujo, puede esperar infinito antes de enviar algo. Realmente problemático cuando su cliente está esperando esos datos, y su servidor no enviará nada nuevo hasta que el cliente envíe el siguiente comando.
La pérdida del paquete es algo que puede afectar aquí, marginalmente. Cada byte que envíe puede estar dañado y TCP solicitará automáticamente una retransmisión. Los paquetes más pequeños significan una menor posibilidad de que cada paquete se corrompa, pero debido a que se suman a los gastos generales, envía aún más bytes, lo que aumenta aún más las posibilidades de un paquete perdido. Cuando se pierde un paquete, TCP almacenará en el búfer todos los datos subsiguientes hasta que el paquete faltante se reenvíe y reciba. Esto da como resultado un gran retraso (ping). Si bien la pérdida total en el ancho de banda debido a la pérdida del paquete puede ser insignificante, el ping más alto sería indeseable para los juegos.
En pocas palabras: envíe la menor cantidad de datos posible, envíe paquetes grandes y no escriba sus propios métodos de bajo nivel para hacerlo, sino que confíe en bibliotecas y métodos conocidos como bufferstream
y protobuf para manejar el trabajo pesado.