Fix multiplayer
Should work with actual alpha servers now
This commit is contained in:
parent
3018e41862
commit
d3142f1adf
|
@ -0,0 +1,22 @@
|
||||||
|
package net.PeytonPlayz585.network;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.nio.ByteBuffer;
|
||||||
|
|
||||||
|
public class ByteBufferDirectInputStream extends InputStream {
|
||||||
|
private ByteBuffer buf;
|
||||||
|
public ByteBufferDirectInputStream(ByteBuffer b) {
|
||||||
|
this.buf = b;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int read() throws IOException {
|
||||||
|
return buf.remaining() > 0 ? ((int) buf.get() & 0xFF) : -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int available() {
|
||||||
|
return buf.remaining();
|
||||||
|
}
|
||||||
|
}
|
40
src/main/java/net/PeytonPlayz585/network/Socket.java
Normal file
40
src/main/java/net/PeytonPlayz585/network/Socket.java
Normal file
|
@ -0,0 +1,40 @@
|
||||||
|
package net.PeytonPlayz585.network;
|
||||||
|
|
||||||
|
import net.PeytonPlayz585.opengl.GL11;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.OutputStream;
|
||||||
|
|
||||||
|
public class Socket {
|
||||||
|
|
||||||
|
public Socket(String ip) throws IOException {
|
||||||
|
if(!GL11.EaglerAdapterImpl2.startConnection(ip)) {
|
||||||
|
throw new IOException("Failed to connect to '" + ip + "'!");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void close() {
|
||||||
|
if(!GL11.EaglerAdapterImpl2.connectionOpen()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
GL11.EaglerAdapterImpl2.endConnection();
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean open() {
|
||||||
|
return GL11.EaglerAdapterImpl2.connectionOpen();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void write(byte[] data) {
|
||||||
|
if(open()) {
|
||||||
|
GL11.EaglerAdapterImpl2.writePacket(data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public byte[] read() {
|
||||||
|
if(open()) {
|
||||||
|
return GL11.EaglerAdapterImpl2.readPacket();
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,62 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1995, 2013, Oracle and/or its affiliates. All rights reserved.
|
||||||
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
|
*
|
||||||
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms of the GNU General Public License version 2 only, as
|
||||||
|
* published by the Free Software Foundation. Oracle designates this
|
||||||
|
* particular file as subject to the "Classpath" exception as provided
|
||||||
|
* by Oracle in the LICENSE file that accompanied this code.
|
||||||
|
*
|
||||||
|
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||||
|
* version 2 for more details (a copy is included in the LICENSE file that
|
||||||
|
* accompanied this code).
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License version
|
||||||
|
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||||
|
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
*
|
||||||
|
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||||
|
* or visit www.oracle.com if you need additional information or have any
|
||||||
|
* questions.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package net.PeytonPlayz585.network;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Thrown to indicate that there is an error creating or accessing a Socket.
|
||||||
|
*
|
||||||
|
* @author Jonathan Payne
|
||||||
|
* @since JDK1.0
|
||||||
|
*/
|
||||||
|
public
|
||||||
|
class SocketException extends IOException {
|
||||||
|
private static final long serialVersionUID = -5935874303556886934L;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructs a new {@code SocketException} with the
|
||||||
|
* specified detail message.
|
||||||
|
*
|
||||||
|
* @param msg the detail message.
|
||||||
|
*/
|
||||||
|
public SocketException(String msg) {
|
||||||
|
super(msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructs a new {@code SocketException} with no detail message.
|
||||||
|
*/
|
||||||
|
public SocketException() {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
String s = "java.net.SocketException";
|
||||||
|
String message = getLocalizedMessage();
|
||||||
|
return (message != null) ? (s + ": " + message) : s;
|
||||||
|
}
|
||||||
|
}
|
|
@ -21,7 +21,8 @@ public class NetClientHandler extends NetHandler {
|
||||||
|
|
||||||
public void processReadPackets() {
|
public void processReadPackets() {
|
||||||
if(!this.disconnected) {
|
if(!this.disconnected) {
|
||||||
NetClientHandler.this.netManager.readPacket();
|
this.netManager.readPacket();
|
||||||
|
this.netManager.processReadPackets();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -5,18 +5,20 @@ import java.io.DataInputStream;
|
||||||
import java.io.DataOutputStream;
|
import java.io.DataOutputStream;
|
||||||
import java.io.EOFException;
|
import java.io.EOFException;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
|
||||||
import java.nio.ByteBuffer;
|
import java.nio.ByteBuffer;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.LinkedList;
|
import java.util.LinkedList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import net.PeytonPlayz585.opengl.GL11;
|
import net.PeytonPlayz585.network.ByteBufferDirectInputStream;
|
||||||
|
import net.PeytonPlayz585.network.Socket;
|
||||||
|
|
||||||
public class NetworkManager {
|
public class NetworkManager {
|
||||||
private Object sendQueueLock = new Object();
|
private Object sendQueueLock = new Object();
|
||||||
|
private Socket field_12258_e;
|
||||||
private boolean isRunning = true;
|
private boolean isRunning = true;
|
||||||
|
private List readPackets = Collections.synchronizedList(new ArrayList());
|
||||||
private List dataPackets = Collections.synchronizedList(new ArrayList());
|
private List dataPackets = Collections.synchronizedList(new ArrayList());
|
||||||
private List chunkDataPackets = Collections.synchronizedList(new ArrayList());
|
private List chunkDataPackets = Collections.synchronizedList(new ArrayList());
|
||||||
private NetHandler netHandler;
|
private NetHandler netHandler;
|
||||||
|
@ -28,6 +30,7 @@ public class NetworkManager {
|
||||||
private int chunkDataSendCounter = 0;
|
private int chunkDataSendCounter = 0;
|
||||||
|
|
||||||
public NetworkManager(String var4, NetHandler var3) throws IOException {
|
public NetworkManager(String var4, NetHandler var3) throws IOException {
|
||||||
|
|
||||||
this.netHandler = var3;
|
this.netHandler = var3;
|
||||||
String uri = null;
|
String uri = null;
|
||||||
System.out.println(uri);
|
System.out.println(uri);
|
||||||
|
@ -41,9 +44,8 @@ public class NetworkManager {
|
||||||
}else {
|
}else {
|
||||||
throw new IOException("Invalid URI Protocol!");
|
throw new IOException("Invalid URI Protocol!");
|
||||||
}
|
}
|
||||||
if(!GL11.EaglerAdapterImpl2.startConnection(var4)) {
|
|
||||||
throw new IOException("Websocket to " + uri + " failed!");
|
this.field_12258_e = new Socket(var4);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void addToSendQueue(Packet var1) {
|
public void addToSendQueue(Packet var1) {
|
||||||
|
@ -56,13 +58,13 @@ public class NetworkManager {
|
||||||
} else {
|
} else {
|
||||||
this.dataPackets.add(var1);
|
this.dataPackets.add(var1);
|
||||||
}
|
}
|
||||||
this.sendPacket();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private ByteArrayOutputStream sendBuffer;
|
|
||||||
|
|
||||||
|
ByteArrayOutputStream os;
|
||||||
private void sendPacket() {
|
private void sendPacket() {
|
||||||
try {
|
try {
|
||||||
boolean var1 = true;
|
boolean var1 = true;
|
||||||
|
@ -76,12 +78,14 @@ public class NetworkManager {
|
||||||
this.sendQueueByteLength -= var2.getPacketSize() + 1;
|
this.sendQueueByteLength -= var2.getPacketSize() + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
sendBuffer = new ByteArrayOutputStream();
|
ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
||||||
DataOutputStream yee = new DataOutputStream(sendBuffer);
|
DataOutputStream socketOutputStream = new DataOutputStream(baos);
|
||||||
Packet.writePacket(var2, yee);
|
Packet.writePacket(var2, socketOutputStream);
|
||||||
yee.flush();
|
baos.flush();
|
||||||
GL11.EaglerAdapterImpl2.writePacket(sendBuffer.toByteArray());
|
socketOutputStream.flush();
|
||||||
sendBuffer.flush();
|
this.field_12258_e.write(baos.toByteArray());
|
||||||
|
baos.flush();
|
||||||
|
socketOutputStream.flush();
|
||||||
}
|
}
|
||||||
|
|
||||||
if((var1 || this.chunkDataSendCounter-- <= 0) && !this.chunkDataPackets.isEmpty()) {
|
if((var1 || this.chunkDataSendCounter-- <= 0) && !this.chunkDataPackets.isEmpty()) {
|
||||||
|
@ -92,12 +96,14 @@ public class NetworkManager {
|
||||||
this.sendQueueByteLength -= var2.getPacketSize() + 1;
|
this.sendQueueByteLength -= var2.getPacketSize() + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
sendBuffer = new ByteArrayOutputStream();
|
ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
||||||
DataOutputStream yee = new DataOutputStream(sendBuffer);
|
DataOutputStream socketOutputStream = new DataOutputStream(baos);
|
||||||
Packet.writePacket(var2, yee);
|
Packet.writePacket(var2, socketOutputStream);
|
||||||
yee.flush();
|
baos.flush();
|
||||||
GL11.EaglerAdapterImpl2.writePacket(sendBuffer.toByteArray());
|
socketOutputStream.flush();
|
||||||
sendBuffer.flush();
|
this.field_12258_e.write(baos.toByteArray());
|
||||||
|
baos.flush();
|
||||||
|
socketOutputStream.flush();
|
||||||
this.chunkDataSendCounter = 50;
|
this.chunkDataSendCounter = 50;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -117,22 +123,20 @@ public class NetworkManager {
|
||||||
private LinkedList<ByteBuffer> readChunks = new LinkedList();
|
private LinkedList<ByteBuffer> readChunks = new LinkedList();
|
||||||
|
|
||||||
public void readPacket() {
|
public void readPacket() {
|
||||||
if(this.sendQueueByteLength > 1048576) {
|
|
||||||
this.networkShutdown("Send buffer overflow");
|
|
||||||
}
|
|
||||||
|
|
||||||
readChunks.clear();
|
readChunks.clear();
|
||||||
|
|
||||||
if(oldChunkBuffer != null) {
|
if(oldChunkBuffer != null) {
|
||||||
readChunks.add(oldChunkBuffer);
|
readChunks.add(oldChunkBuffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(this.field_12258_e.open()) {
|
||||||
byte[] packet;
|
byte[] packet;
|
||||||
while((packet = GL11.EaglerAdapterImpl2.readPacket()) != null) {
|
while((packet = this.field_12258_e.read()) != null) {
|
||||||
readChunks.add(ByteBuffer.wrap(packet));
|
readChunks.add(ByteBuffer.wrap(packet));
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if(!readChunks.isEmpty()) {
|
if(!readChunks.isEmpty()) {
|
||||||
this.timeSinceLastRead = 0;
|
|
||||||
int cap = 0;
|
int cap = 0;
|
||||||
for(ByteBuffer b : readChunks) {
|
for(ByteBuffer b : readChunks) {
|
||||||
cap += b.limit();
|
cap += b.limit();
|
||||||
|
@ -145,24 +149,19 @@ public class NetworkManager {
|
||||||
stream.flip();
|
stream.flip();
|
||||||
|
|
||||||
DataInputStream packetStream = new DataInputStream(new ByteBufferDirectInputStream(stream));
|
DataInputStream packetStream = new DataInputStream(new ByteBufferDirectInputStream(stream));
|
||||||
int var1 = 100;
|
while(stream.hasRemaining()) {
|
||||||
while(stream.hasRemaining() && var1-- > 0) {
|
|
||||||
stream.mark();
|
stream.mark();
|
||||||
|
|
||||||
try {
|
try {
|
||||||
Packet pkt = Packet.readPacket(packetStream);
|
Packet var1 = Packet.readPacket(packetStream);
|
||||||
if(pkt == null) {
|
if(var1 != null) {
|
||||||
this.networkShutdown("End of Stream");
|
this.readPackets.add(var1);
|
||||||
|
} else {
|
||||||
|
this.networkShutdown("End of stream");
|
||||||
}
|
}
|
||||||
pkt.processPacket(this.netHandler);
|
} catch(EOFException e) {
|
||||||
} catch (EOFException e) {
|
|
||||||
stream.reset();
|
stream.reset();
|
||||||
break;
|
break;
|
||||||
} catch (IOException e) {
|
|
||||||
continue;
|
|
||||||
} catch(ArrayIndexOutOfBoundsException e) {
|
|
||||||
continue;
|
|
||||||
} catch(NullPointerException e) {
|
|
||||||
continue;
|
|
||||||
} catch(Exception e) {
|
} catch(Exception e) {
|
||||||
continue;
|
continue;
|
||||||
} catch(Throwable t) {
|
} catch(Throwable t) {
|
||||||
|
@ -175,19 +174,6 @@ public class NetworkManager {
|
||||||
}else {
|
}else {
|
||||||
oldChunkBuffer = null;
|
oldChunkBuffer = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
if(this.timeSinceLastRead++ == 1200) {
|
|
||||||
this.networkShutdown("Timed out");
|
|
||||||
}
|
|
||||||
|
|
||||||
if(!isConnectionOpen() && !this.isTerminating) {
|
|
||||||
this.networkShutdown("Lost connection!");
|
|
||||||
}
|
|
||||||
|
|
||||||
if(this.isTerminating && this.readChunks.isEmpty()) {
|
|
||||||
this.netHandler.handleErrorMessage(this.terminationReason);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -201,42 +187,55 @@ public class NetworkManager {
|
||||||
this.isTerminating = true;
|
this.isTerminating = true;
|
||||||
this.terminationReason = var1;
|
this.terminationReason = var1;
|
||||||
this.isRunning = false;
|
this.isRunning = false;
|
||||||
if(GL11.EaglerAdapterImpl2.connectionOpen()) {
|
|
||||||
GL11.EaglerAdapterImpl2.endConnection();
|
try {
|
||||||
|
this.field_12258_e.close();
|
||||||
|
this.field_12258_e = null;
|
||||||
|
} catch (Throwable var3) {
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void processReadPackets() {
|
||||||
|
if(this.sendQueueByteLength > 1048576) {
|
||||||
|
this.networkShutdown("Send buffer overflow");
|
||||||
|
}
|
||||||
|
|
||||||
|
if(this.readPackets.isEmpty()) {
|
||||||
|
if(this.timeSinceLastRead++ == 1200) {
|
||||||
|
this.networkShutdown("Timed out");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
this.timeSinceLastRead = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int var1 = 100;
|
||||||
|
|
||||||
|
while(!this.readPackets.isEmpty() && var1-- >= 0) {
|
||||||
|
Packet var2 = (Packet)this.readPackets.remove(0);
|
||||||
|
var2.processPacket(this.netHandler);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(this.isTerminating && this.readPackets.isEmpty()) {
|
||||||
|
this.netHandler.handleErrorMessage(this.terminationReason);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static boolean isRunning(NetworkManager var0) {
|
static boolean isRunning(NetworkManager var0) {
|
||||||
return var0.isRunning;
|
return var0.isRunning;
|
||||||
}
|
}
|
||||||
|
|
||||||
static boolean isConnectionOpen() {
|
|
||||||
return GL11.EaglerAdapterImpl2.connectionOpen();
|
|
||||||
}
|
|
||||||
|
|
||||||
static boolean isServerTerminating(NetworkManager var0) {
|
static boolean isServerTerminating(NetworkManager var0) {
|
||||||
return var0.isServerTerminating;
|
return var0.isServerTerminating;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void readNetworkPacket(NetworkManager var0) {
|
||||||
|
var0.readPacket();
|
||||||
|
}
|
||||||
|
|
||||||
static void sendNetworkPacket(NetworkManager var0) {
|
static void sendNetworkPacket(NetworkManager var0) {
|
||||||
var0.sendPacket();
|
var0.sendPacket();
|
||||||
}
|
}
|
||||||
|
|
||||||
private static class ByteBufferDirectInputStream extends InputStream {
|
|
||||||
private ByteBuffer buf;
|
|
||||||
private ByteBufferDirectInputStream(ByteBuffer b) {
|
|
||||||
this.buf = b;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int read() throws IOException {
|
|
||||||
return buf.remaining() > 0 ? ((int)buf.get() & 0xFF) : -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int available() {
|
|
||||||
return buf.remaining();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
Loading…
Reference in New Issue
Block a user