9
9
import org .java_websocket .WebSocket ;
10
10
import org .java_websocket .handshake .ClientHandshake ;
11
11
import org .java_websocket .server .WebSocketServer ;
12
+ import org .java_websocket .framing .PongFrame ;
13
+ import org .java_websocket .enums .Opcode ;
12
14
13
15
public class MatlabWebSocketServer extends WebSocketServer {
14
16
// The constructor creates a new WebSocketServer with the wildcard IP,
@@ -76,9 +78,9 @@ public void onClose( WebSocket conn, int code, String reason, boolean remote ) {
76
78
public WebSocket getConnection ( int hashCode ) {
77
79
Collection <WebSocket > conns = getConnections ();
78
80
synchronized ( conns ) {
79
- for ( WebSocket c : conns ) {
80
- if (c .hashCode () == hashCode ) {
81
- return c ;
81
+ for ( WebSocket conn : conns ) {
82
+ if (conn .hashCode () == hashCode ) {
83
+ return conn ;
82
84
}
83
85
}
84
86
}
@@ -92,7 +94,8 @@ public void sendTo( int hashCode, String message ) {
92
94
93
95
// Send binary message to a connection identified by a hashcode
94
96
public void sendTo ( int hashCode , ByteBuffer blob ) {
95
- getConnection ( hashCode ).send ( blob );
97
+ WebSocket conn = getConnection ( hashCode );
98
+ sendSplit ( conn , blob );
96
99
}
97
100
98
101
// Send binary message to a connection identified by a hashcode
@@ -104,8 +107,8 @@ public void sendTo( int hashCode, byte[] bytes ) {
104
107
public void sendToAll ( String message ) {
105
108
Collection <WebSocket > conns = getConnections ();
106
109
synchronized ( conns ) {
107
- for ( WebSocket c : conns ) {
108
- c .send ( message );
110
+ for ( WebSocket conn : conns ) {
111
+ conn .send ( message );
109
112
}
110
113
}
111
114
}
@@ -114,8 +117,8 @@ public void sendToAll( String message ) {
114
117
public void sendToAll ( ByteBuffer blob ) {
115
118
Collection <WebSocket > conns = getConnections ();
116
119
synchronized ( conns ) {
117
- for ( WebSocket c : conns ) {
118
- c . send ( blob );
120
+ for ( WebSocket conn : conns ) {
121
+ sendSplit ( conn , blob );
119
122
}
120
123
}
121
124
}
@@ -124,6 +127,28 @@ public void sendToAll( ByteBuffer blob ) {
124
127
public void sendToAll ( byte [] bytes ) {
125
128
sendToAll ( ByteBuffer .wrap ( bytes ) );
126
129
}
130
+
131
+ // Method to send large messages in fragments if needed
132
+ public void sendSplit ( WebSocket conn , ByteBuffer blob ) {
133
+ int FRAG_SIZE = 5 *1024 *1024 ; // 5MB
134
+ int blobSize = blob .capacity ();
135
+ // Only send as fragments if message is larger than FRAG_SIZE
136
+ if ( blobSize <= FRAG_SIZE ) {
137
+ conn .send ( blob );
138
+ } else {
139
+ int numFrags = (blobSize + FRAG_SIZE - 1 )/FRAG_SIZE ;
140
+ blob .rewind ();
141
+ for ( int i = 0 ; i <numFrags ; i ++ ) {
142
+ blob .position ( i *FRAG_SIZE );
143
+ blob .limit ( Math .min ( (i +1 )*FRAG_SIZE , blobSize ) );
144
+ conn .sendFragmentedFrame ( Opcode .BINARY , blob , (i +1 )==numFrags );
145
+ // Send a ping AND an unpromted pong to keep connection alive
146
+ conn .sendPing ();
147
+ conn .sendFrame ( new PongFrame () );
148
+ }
149
+ assert ( blob .position () == blobSize );
150
+ }
151
+ }
127
152
128
153
// Close connection identified by a hashcode
129
154
public void close ( int hashCode ) {
0 commit comments