feat: F4.6g1 the echo server and the generic client windows
Oracle EchoWindowRun uses Java's echo server and client windows as a person does; SaveAfterRunRun echo saves what Java keeps after the run. The room takes setActive with a port, connect/disconnect/send, sends both views and writes the server's port and the client's target back. The editor's windows show Java's buttons, fields and lines; a port that is no port is marked and not handed over (Java's button throws). Core fix: an empty message (one empty segment with the push, as Java's erstelleSegmente makes) counted as a repeat and never arrived. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -2799,11 +2799,21 @@ export class NetworkRuntimeEngine {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* A data segment (TCPSocket's receive loop): new data goes into the
|
||||
* message, a push ends it. An empty message is one empty segment with the
|
||||
* push (TCPSocket.erstelleSegmente makes at least one; an empty segment
|
||||
* comes here only with it). Java ends a message with every push, also with
|
||||
* a repeated segment's (an ACK lost: an empty message more); here only
|
||||
* with a new one's — but an empty segment repeated cannot be told from a
|
||||
* new one by its number, which it does not count on, and is an empty
|
||||
* message again (named).
|
||||
*/
|
||||
private receiveTcpPayload(socketId: Id, segment: TcpSegment): void {
|
||||
const session = this.stateValue.tcpSessionsById.get(socketId);
|
||||
if (session === undefined) return;
|
||||
const nextRemoteSequence = nextTcpSequenceNumber(segment);
|
||||
if (nextRemoteSequence > session.remoteSequenceNumber) {
|
||||
if (nextRemoteSequence > session.remoteSequenceNumber || segment.payload.length === 0) {
|
||||
session.remoteSequenceNumber = nextRemoteSequence;
|
||||
session.receiveAssembly = concatBytes(session.receiveAssembly, segment.payload);
|
||||
if ((segment.flags & TCP_FLAG.push) !== 0) {
|
||||
|
||||
Reference in New Issue
Block a user