# Problem mit Server



## MacMan (14. Dez 2009)

Hallo zusammen, ich habe einen Proxyserver in Java geschrieben. Er besteht aus zwei Teilen, ein lokaler Proxyserver und einer im Netz. Beim Testen mit den beiden (beide lokal ausgeführt) funktioniert alles wie gewünscht. Wenn ich jetzt jedoch den einen auf einen anderen Server verlagere, funktioniert plötzlich nichts mehr oder nur sehr unregelmässig. Worin könnte das Problem liegen?? Der Testcomputer ist ein Mac und der Server ein Windows. Liegt darin das Problem? Oder darin, dass die Sendezeiten beim lokalen geringer sind als wenn der Server im Internet ist?
Liebe Grüsse und vielen Dank im Voraus..


----------



## Gelöschtes Mitglied 5909 (16. Dez 2009)

Schenk uns eine Glaskugel und eventuell kann dir dann jemand Helfen



> funktioniert plötzlich nichts mehr oder nur sehr unregelmässig.



Was geht nicht? Ging es überhaupt mal richtig?
Hats du die Ports geforwarded?

Code? Exceptions? Mehr Infos?


----------



## MacMan (17. Dez 2009)

es GIBT keine exception das ist ja das Problem!!!!! Das einzige was mir angezeigt wird ist die Meldung vom Browser dass ein ungültiges Format der Kodierung gewählt wurde bei Seiten, die komprimiert sind und bei unkomprimierten Seiten wird nur die Hälfte (jedes Mal ein anderer Teil!) geladen und Bilder sind nach der Hälfte nur noch Schwarz etc.........


----------



## MacMan (17. Dez 2009)

Ach ja, hier noch der Code für den Proxy auf dem fremden Computer bei dem das Problem "vielleicht" auftritt:


```
SocketChannel			clientSocket;
	SocketChannel			remoteSocket;
	
	Selector				selector;
	SelectionKey			clientkey;
	SelectionKey			remotekey;
	
	Charset					charset;
	CharsetEncoder			encoder;
	CharsetDecoder			decoder;
	ByteBuffer				buffer;
	int						bytesread					= 0;
	
	String					header						= "";
	
	int						protocolStatus				= 0;
	
	public static final int	START						= 0;
	public static final int	CONNECT_HEADER_RECEIVING	= 1;
	public static final int	REDIRECTING_TRAFFIC			= 2;
	public static final int	CLOSED						= 3;
	
	/**
	 * @param remoteHost
	 * @param remotePort
	 */
	public Acceptor(SocketChannel clientSocket) {
		super("Client[" + clientSocket.socket().getLocalPort() + "]");
		try {
			charset = Charset.forName("UTF-8");
			encoder = charset.newEncoder();
			decoder = charset.newDecoder();
			buffer = ByteBuffer.allocate(1024);
			
			selector = Selector.open();
			this.clientSocket = clientSocket;
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	@Override
	public void run() {
		try {
			clientkey = clientSocket.register(selector, SelectionKey.OP_READ);
			
			remotekey = null;
			
			protocolStatus = START;
			
			protocolStatus = CONNECT_HEADER_RECEIVING;
			
			for (;;) {
				selector.select();
				Set<SelectionKey> keys = selector.selectedKeys();
				
				for (Iterator<SelectionKey> i = keys.iterator(); i.hasNext();) {
					SelectionKey key = (SelectionKey) i.next();
					i.remove();
					
					if (protocolStatus == CLOSED) { return; }
					
					if (key == clientkey) {
						if (!key.isReadable()) {
							continue;
						}
						try {
							bytesread = clientSocket.read(buffer);
						} catch (IOException e) {
							close();
							continue;
						}
						
						if (bytesread == -1) {
							close();
							continue;
						}
						buffer.flip();
						// System.out.print(decoder.decode(buffer));
						// buffer.flip();
						
						try {
							clientDataRead();
						} catch (Exception e) {
							e.printStackTrace();
						}
						
						buffer.clear();
					}
					if (key == remotekey) {
						if (!key.isReadable()) {
							continue;
						}
						
						try {
							bytesread = remoteSocket.read(buffer);
						} catch (IOException e) {
							close();
							continue;
						}
						if (bytesread == -1) {
							close();
							continue;
						}
						buffer.flip();
						// System.out.print(decoder.decode(buffer));
						// buffer.flip();
						
						try {
							remoteDataRead();
						} catch (Exception e) {
							e.printStackTrace();
						}
						
						buffer.clear();
					}
				}
				
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		
	}
	
	public void close() throws IOException {
		if (remoteSocket != null) {
			remoteSocket.close();
		}
		// clientSocket.close();
		if (remotekey != null) {
			remotekey.cancel();
		}
		clientkey.cancel();
		
		clientkey = null;
		remotekey = null;
		
		protocolStatus = CLOSED;
	}
	
	public void clientDataRead() throws Exception {
		if (protocolStatus == CONNECT_HEADER_RECEIVING) {
			// Header empfangen
			handleRequest(decoder.decode(buffer).toString());
		} else if (protocolStatus == REDIRECTING_TRAFFIC) {
			if (remotekey != null) {
				if (!remoteSocket.socket().isClosed()) {
					remoteSocket.write(buffer);
				}
			}
		}
	}
	
	public void handleRequest(String request) throws IOException {
		// Wenn der Header noch nit abgeschlossen ist...
		if (request.indexOf(";") < 0) {
			header += request;
		} else {
			String data = request.substring(request.indexOf(";") + 1);
			header += request.substring(0, request.indexOf(";"));
			header.replace("&&", "&");
			header.replace("&s", ";");
			handleHeader();
			
			// Wenn im Anschluss auf den Header bereits Daten empfangen wurden, diese an den Remotehost weiterleiten...
			if (data.length() > 0) {
				try {
					// Thread.sleep(300);
				} catch (Exception e) {
				}
				
				clientSocket.write(encoder.encode(CharBuffer.wrap(data)));
			}
		}
	}
	
	public void handleHeader() throws IOException {
		if (header.startsWith("CONNECT")) {
			String[] parts = header.split(" ");
			
			String host = parts[1].trim();
			int port = 0;
			if (host.indexOf(":") >= 0) {
				port = Integer.parseInt(host.substring(host.indexOf(":") + 1));
				host = host.substring(0, host.indexOf(":"));
			}
			
			remoteSocket = SocketChannel.open(new InetSocketAddress(host, port));
			remoteSocket.configureBlocking(false);
			remotekey = remoteSocket.register(selector, SelectionKey.OP_READ);
			
			String command = "200 Connection established;";
			try {
				// Thread.sleep(300);
			} catch (Exception e) {
			}
			
			clientSocket.write(encoder.encode(CharBuffer.wrap(command)));
			
			protocolStatus = REDIRECTING_TRAFFIC;
		} else if (header.startsWith("PING")) {
			String command = "100 Proxy Service available;\n";
			try {
				// Thread.sleep(300);
			} catch (Exception e) {
			}
			clientSocket.write(encoder.encode(CharBuffer.wrap(command)));
			
			protocolStatus = CLOSED;
			close();
		}
		
	}
	
	public void remoteDataRead() throws IOException {
		if (!clientSocket.socket().isClosed()) {
			try {
				// Thread.sleep(300);
			} catch (Exception e) {
			}
			clientSocket.write(buffer);
		} else {
			close();
		}
	}
```


----------



## madboy (17. Dez 2009)

```
public void remoteDataRead() throws IOException {
        ...
            clientSocket.write(buffer);
        ...
```
:autsch:


```
handleRequest(decoder.decode(buffer).toString());
...
clientSocket.write(encoder.encode(CharBuffer.wrap(data)));
```
Ähm. Du schreibst, bei gepackten Daten bekommst du Probleme? Gepackte Daten sind binär und binär != String.

Alles in allem würde ich sagen: Nix umwandeln in deinem Proxy (außer, du weißt genau was du tust).
Für erste Tests lass erst mal die ganzen zusätzlichen Dinge aus dem Proxy raus und leite nur Streams weiter. Im Stil von
lese x Bytes von SocketInputStream
schreibe x Bytes in anderen SocketOutputStream


----------



## MacMan (18. Dez 2009)

hmm.. aber dies löst noch immer nicht die frage warum wenn ich die ganze sache lokal laufen lasse ohne probleme funktioniert.. mit dem SELBEN quellcode..


----------

