Results 1 to 6 of 6
  1. #1
    zaper is offline Member
    Join Date
    Apr 2013
    Posts
    7
    Rep Power
    0

    Thumbs up Problem with Server Proxy

    I have something problem.

    This is code

    Java Code:
    package myProxy;
    
    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.FlowLayout;
    import java.awt.Point;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    
    import javax.sql.rowset.CachedRowSet;
    import javax.swing.BoxLayout;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JOptionPane;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    import javax.swing.JTextField;
    import javax.swing.JTextPane;
    import javax.swing.SwingConstants;
    import javax.swing.text.BadLocationException;
    import javax.swing.text.SimpleAttributeSet;
    import javax.swing.text.StyleConstants;
    import javax.swing.text.StyledDocument;
    
    public class GUI extends JFrame implements Runnable {	//klasa GUI zawiaduje interfejsem i uruchamia metody klasy myProxyServer
    	myProxyServer parent = null;
    
    	JTextPane displayTextPane = new JTextPane();
    	JScrollPane displayScroll = new JScrollPane(displayTextPane);
    	StyledDocument doc = displayTextPane.getStyledDocument();
    	SimpleAttributeSet aset = new SimpleAttributeSet();
    	JLabel portLabel = new JLabel("numer portu:");
    	JTextField portTextField = new JTextField("8080",4);
    	JLabel inputCommandLabel = new JLabel("Wprowadź komendę:");
    	JTextField 	inputCommandTextField	= new JTextField();
    	
    	JButton	connectButton	= new JButton("Uruchom serwer");
    	private void connectPressed(){
    		try{
    			int p = 8080;
    			parent.connect(p);
    			connectButton.setEnabled(false);
    			disconnectButton.setEnabled(true);
    			portTextField.setEditable(false);
    			commandButton.setEnabled(true);
    			inputCommandLabel.setEnabled(true);
    		}catch(NumberFormatException nfe){
    			JOptionPane.showMessageDialog(null, "Wprowadzono nieprawidłowy numer portu");
    			portTextField.setText("");
    		}
    	}
    	
    	JButton commandButton = new JButton("Wykonaj");
    	private void commandPressed(){
    		if (inputCommandTextField.getText().equals("show cache")){
    			int i = 0;
    			println("=== LISTA STRON ZAPISANYCH W CACHE'U ===", Styl.EMPHASIZE);
    			for(String s : parent.getCache().keySet())
    				println("\t" + (++i) + ". " + s, Styl.EMPHASIZE);
    		}
    		inputCommandTextField.setText("");
    	}
    	
    	JButton disconnectButton = new JButton("Zatrzymaj serwer");
    	private void disconnectPressed(){
    		parent.disconnect();
    		connectButton.setEnabled(true);
    		disconnectButton.setEnabled(false);
    		portTextField.setEditable(true);
    		commandButton.setEnabled(false);
    		inputCommandLabel.setEnabled(false);
    	}
    	
    	JLabel windowTitleLabel = new JLabel("Serwer Proxy", JLabel.CENTER);
    	ActionListener al = new ActionListener() {
    
    		@Override
    		public void actionPerformed(ActionEvent e) {
    			if (e.getSource().equals(connectButton)){connectPressed();}
    			else if (e.getSource().equals(disconnectButton)){disconnectPressed();}
    			else if (e.getSource().equals(commandButton)){commandPressed();}
    		}
    	};; 
    
    	public GUI(myProxyServer parent){
    		super();
    		this.parent = parent;
    		setDefaultCloseOperation(EXIT_ON_CLOSE);
    		setLocationRelativeTo(null);
    		setPreferredSize(new Dimension(1024,500));
    		setupGUI();
    	}
    	private void setupGUI() {
    		displayTextPane.setBackground(Color.BLACK);
    		displayTextPane.setEditable(false);
    		portLabel.setHorizontalAlignment(SwingConstants.CENTER);
    		inputCommandLabel.setHorizontalAlignment(SwingConstants.CENTER);
    		inputCommandLabel.setEnabled(false);
    		connectButton.addActionListener(al);
    		commandButton.setEnabled(false);
    		commandButton.addActionListener(al);
    		disconnectButton.setEnabled(false); 
    		disconnectButton.addActionListener(al);
    
    
    		JPanel topPanel = new JPanel();
    		topPanel.setLayout(new FlowLayout(FlowLayout.LEFT,10,10));
    		topPanel.add(connectButton);
    		topPanel.add(portLabel);
    		topPanel.add(portTextField);
    		topPanel.add(disconnectButton);
    
    		JPanel bottomPanel = new JPanel();
    		bottomPanel.setLayout(new BoxLayout(bottomPanel, BoxLayout.X_AXIS));
    		bottomPanel.add(inputCommandLabel);
    		bottomPanel.add(inputCommandTextField);
    		bottomPanel.add(commandButton);
    
    		this.setLayout(new BorderLayout(5, 10));
    		this.setTitle("Proxy server");
    		add(topPanel, BorderLayout.NORTH);
    		add(displayScroll, BorderLayout.CENTER); 
    		add(bottomPanel, BorderLayout.SOUTH);
    		pack();
    		setVisible(true);
    	}
    
    	//wypisywanie tekstu na konsoli 'displayTextArea'
    	//lista dostępnych stylów:
    	public static enum Styl {NORMAL, ALERT, EMPHASIZE, SECONDARY, NEW_THREAD, SERVER}
    	
    	//metoda najpierw ustala cechy stylu a następnie wypisuje komunikat na konsoli 'displayTextArea'
    	protected synchronized void println(String msg, Styl styl)
    	{  
    		switch (styl){
    		case NORMAL: StyleConstants.setForeground(aset, Color.LIGHT_GRAY); break;
    		case ALERT: StyleConstants.setForeground(aset, Color.RED); break;
    		case EMPHASIZE: StyleConstants.setForeground(aset, Color.GREEN); break;
    		//case SECONDARY: StyleConstants.setForeground(aset, Color.GRAY); break;
    		case NEW_THREAD: StyleConstants.setForeground(aset, Color.YELLOW); break;
    		case SERVER: StyleConstants.setForeground(aset, Color.MAGENTA); break;
    		default:break;
    		}	
    		try {
    			int offset = doc.getLength();
    			doc.insertString(offset, msg + '\n', aset);
    			displayTextPane.moveCaretPosition(doc.getLength());
    		} catch (BadLocationException e) {}
    	}
    
    	@Override
    	public void run() {}
    }
    Java Code:
    package myProxy;
    
    import java.awt.List;
    import java.io.IOException;
    import java.net.ServerSocket;
    import java.net.Socket;
    import java.util.ArrayList;
    import java.util.HashMap;
    
    import javax.swing.SwingUtilities;
    
    import myProxy.GUI.Styl;
    
    /*
    *klasa myProxyServer posiada gniazdo serwera, obiekt socketListener, obiekt GUI oraz cache pobranych stron
    */
    public class myProxyServer {
    
    	public static boolean serverIsActive = true; //flaga mówiaca czy serwer jest aktywny (chwilowo nie używana...)
    
    	private ServerSocket serverSocket = null;
    	private socketListener sl = null;
    	private GUI gui = null;
    	HashMap<String,byte[][]> cache = null; //mapa przyporządkowująca adresom stron ich zawartość w postaci kolejnych linii bajtów (tablica tablic)
    
    	public static void main(String[] args) {
    		myProxyServer myPS = new myProxyServer();
    	}
    
    	public myProxyServer(){ //konstruktor
    		cache = new HashMap<String, byte[][]>();
    		gui = new GUI(this);
    		SwingUtilities.invokeLater(gui); //uruchamiamy GUI w oddzielnym wątku
    	}
    
    	//wrapper metody println z klasy GUI, który dodaje prefiks z etykietą SERWER
    	public void showMessage(String msg, Styl styl){ 
    		gui.println("(*** SERWER ***) " + msg, styl);
    	}
    
    
    	public synchronized void addToCache(String url, byte [][] content)	//metoda wywoływana przez wątki związane ze stronami
    	{									//zawartośc metody jest raczej jasna(?)
    		if(!cache.containsKey(url))					//metoda ma modyfikator synchronized aby uniknąć konfliktu między wątkami w dostępie do cacheu
    		{
    			cache.put(url, content);
    		}
    		else
    			showMessage("Próbowano dodać stronę "+ url +", która już znajduje się w cache'u ", Styl.ALERT);
    	}
    
    	public void connect(int port){ //metoda przypisująca serwerowi gniazdo i socketListener
    		try {
    			serverSocket = new ServerSocket(port);
    			sl = new socketListener(this);
    			showMessage("Serwer został uruchomiony i dowiązany do gniazda :\n\t" + serverSocket,Styl.SERVER);
    			showMessage("SocketListener został uruchomiony i nasłuchuje na porcie : " + sl.getSS().getLocalPort(), Styl.SERVER);
    		} catch (IOException e) {
    			showMessage(e.toString(),Styl.ALERT);
    			showMessage("Nie udało się uruchomić serwera na porcie " + port + "\n Prawdopodobnie podano nieistniejący numer portu lub użytkownik nie posiada wystarczjących uprawnień",Styl.ALERT);
    		}
    	}
    
    	public void disconnect(){//metoda zamykająca gniazdo i wyłączająca socketListener
    		try {
    			sl.setListenerActive(false);
    			sl = null;
    			serverSocket.close();
    			serverSocket = null;
    			showMessage("Serwer został zatrzymany", Styl.SERVER);
    		} catch (IOException e) {
    			showMessage("Nie udało się zatrzymać serwera!", Styl.ALERT);
    		}
    	}
    
    	public ServerSocket getServerSocket() {
    		return serverSocket;
    	}
    
    	public GUI getGui() {
    		return gui;
    	}
    
    	public synchronized HashMap<String, byte[][]> getCache() {
    		return cache;
    	}
    
    }
    Java Code:
    package myProxy;
    
    import java.io.BufferedReader;
    import java.io.DataInputStream;
    import java.io.DataOutputStream;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.net.Socket;
    import java.net.URL;
    import java.net.URLConnection;
    import java.util.StringTokenizer;
    
    import myProxy.GUI.Styl;
    
    
    public class ProxyThread extends Thread {
    	private Socket socket = null;
    	private myProxyServer parent;
    	private GUI gui = null;
    	private static final int BUFFER_SIZE = 5000;
    
    	//konstruktor przekazuje wskaźniki na gniazdo serwera, serwer oraz gui
    	//oraz wypisuje komunikat z numerem wątku na konsoli GUI
    	public ProxyThread(Socket socket, myProxyServer parent) {
    		super();
    		this.socket = socket;
    		this.parent = parent;
    		this.gui = parent.getGui();
    			showMessage("Wystartowano nowy wątek : " + getId(),Styl.NEW_THREAD);
    		
    	}
    
    	//wrapper metody println z klasy GUI, który dodaje prefiks z numerem wątku
    	private void showMessage(String msg, Styl styl){
    		gui.println("(*** " + getId() + " ***) " + msg, styl);
    	}
    
    	public void run() {
    		try {
    			DataOutputStream out = new DataOutputStream(socket.getOutputStream()); //tu będziemy pisać do przeglądarki
    			BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); //stąd będziemy czytać
    
    			String inputLine;
    			int i = 0;
    			String urlToCall = "";
    			//po pierwsze wyłuskujemy adres strony o którą prosi przeglądarka
    			//adres jest na drugiej pozycji zapytania (pierwsza to GET)
    			while ((inputLine = in.readLine()) != null) {
    				try {
    					StringTokenizer tok = new StringTokenizer(inputLine);
    					tok.nextToken();
    				} catch (Exception e) {
    					break;
    				}
    				if (i == 0) {
    					String[] tokens = inputLine.split(" ");
    					urlToCall = tokens[1];
    					showMessage("Przeglądarka zgłosiła zapytanie o " + urlToCall ,Styl.EMPHASIZE);
    				}
    				i++;
    			}
    			
    			//kiedy już mamy URL, łączymy się z nim za pomocą url.opeconnection()
    			//następnie podłączamy do niego input i output stream
    			BufferedReader rd = null;
    			try {
    				showMessage("\t---->Ściąganie danych z " + urlToCall +"", Styl.NORMAL);
    				URL url = new URL(urlToCall);
    				URLConnection conn = url.openConnection();
    				conn.setDoInput(true);
    				conn.setDoOutput(false);
    				Byte [] content = null; 
    				DataInputStream is = null;
    				try {
    					is = new DataInputStream(conn.getInputStream());
    					rd = new BufferedReader(new InputStreamReader(is));
    				} catch (IOException ioe) {
    					showMessage("IO exception!*: " + ioe,Styl.ALERT);
    				}
    
    				byte toClient[] = new byte[ BUFFER_SIZE ]; //tworzymy bufor dla strumienia
    
    				//sprawdzamu za pomocą URL czy strona jest już w cache'u
    				//jeśli tak to przepisujemy ją z cache'u to strumienia prowadzącego do klienta
    				if(parent.getCache().containsKey(urlToCall)){
    					showMessage("\t---->Strona  "+ url +" jest odczytywana z cache'u", Styl.NORMAL);
    					for(byte [] by : parent.getCache().get(urlToCall))
    						out.write(by);
    				}
    				//jeśli nie, przekierowujemy strumień przychodzący z URL do klienta
    				//jednocześnie zapisując go do cache'u
    				else {
    					showMessage("\t---->Strona  "+ url +" zostanie dopisana do cache'u ", Styl.NORMAL);
    					byte toCache [][] = new byte [ BUFFER_SIZE ][ BUFFER_SIZE ]; //bufor do zapisywania do cache'u
    					int index = is.read( toClient, 0, BUFFER_SIZE );//waczytujemy pierwszą linię ze struienia is do bufora toClient, zachowujemy rozmiar w zmiennej index
    					int line = 0;
    					while ( index != -1 ) //wczytujemy kolejne linie aż do napotkania pustej liniii
    					{
    						toCache[line] = new byte[index];//tworzymy bufor toCache dla tej linii
    						for (i = 0; i<index;i++)
    							toCache[line][i] = toClient[i]; //bajt po bajcie przepisujemy bufor toClient do bufora toCache
    						out.write( toClient, 0, index ); //przesyłamy dane do przeglądarki
    						index = is.read( toClient, 0, BUFFER_SIZE );//wczytujemy kolejną linię
    						line++;
    					}
    					parent.addToCache(urlToCall, toCache); //dodajemy bufor toCache to cache'u pod kluczem urlToCall
    				}
    				out.flush(); //opróżniamy bufor
    
    
    			} catch (Exception e) {
    				showMessage("Encountered exception: " + e.getMessage(),Styl.ALERT);
    				out.writeBytes("");
    			}
    			//zamykamy strumienie i gniazdo
    			if (rd != null) {rd.close();}
    			if (out != null) {out.close();}
    			if (in != null) {in.close();}
    			if (socket != null) {socket.close();}
    
    		} catch (IOException e) {
    			showMessage(e.getMessage(), Styl.ALERT);
    		}
    	}
    }
    Java Code:
    package myProxy;
    
    import java.io.IOException;
    import java.net.ServerSocket;
    
    import myProxy.GUI.Styl;
    /*
    *Klasa socketListener odpowiada za nasłuchiwanie na gniezdzie serwera
    *Kiedy pojawia się nowe połączenie socketListener tworzy dla niego nowy wątek, przekazuje mu wskaznik na serwer i uruchamia
    */
    public class socketListener extends Thread{
    	private myProxyServer parent = null;
    	private ServerSocket ss = null;
    	private boolean listenerActive = true;
    
    	public socketListener(myProxyServer parent){ //konstruktor który przypisuje rodzica (myProxyServer) do zmiennej 'parent'
    		this.parent = parent;
    		this.ss = parent.getServerSocket();	//oraz gniazdo serwera rodzica do zmiennej ss
    		start();
    	}
    
    	public void run() {
    		ProxyThread pt;
    		while(listenerActive)
    			try {	
    				pt = new ProxyThread(ss.accept(), parent); //tworzymy nowy wątek dla połączenia
    				pt.start(); //startujemy wątek
    			} catch (IOException e) {}
    	}
    
    	public void setListenerActive(boolean listenerActive) {
    		this.listenerActive = listenerActive;
    	}
    
    	public boolean isListenerActive() {
    		return listenerActive;
    	}
    
    	public myProxyServer getParent() {
    		return parent;
    	}
    
    	public ServerSocket getSS() {
    		return ss;
    	}
    }

    Works fine, but the console displays the following:


    Exception in thread "Thread-13" java.lang.OutOfMemoryError: Java heap space
    at myProxy.ProxyThread.run(ProxyThread.java:94)
    Exception in thread "Thread-14" java.lang.OutOfMemoryError: Java heap space
    at myProxy.ProxyThread.run(ProxyThread.java:94)
    Exception in thread "Thread-15" java.lang.OutOfMemoryError: Java heap space
    at myProxy.ProxyThread.run(ProxyThread.java:94)
    Exception in thread "Thread-16" java.lang.OutOfMemoryError: Java heap space
    Exception in thread "Thread-17" java.lang.OutOfMemoryError: Java heap space

    Please Help
    Last edited by zaper; 04-30-2013 at 01:59 PM.

  2. #2
    Tolls is offline Moderator
    Join Date
    Apr 2009
    Posts
    11,846
    Rep Power
    19

    Default Re: Problem with Server Proxy

    You're running out of memory.
    In order to find out what's taking up the memory you'll need to take a heap dump and analyse it.
    Please do not ask for code as refusal often offends.

    ** This space for rent **

  3. #3
    zaper is offline Member
    Join Date
    Apr 2013
    Posts
    7
    Rep Power
    0

    Default Re: Problem with Server Proxy

    Unfortunately, I do not know where he can be a big memory usage;/

  4. #4
    Tolls is offline Moderator
    Join Date
    Apr 2009
    Posts
    11,846
    Rep Power
    19

    Default Re: Problem with Server Proxy

    That's why you need to take a heap dump.
    Run from the command line and supply the -XX:+HeapDumpOnOutOfMemoryError switch. Then analyse the resulting heap using jhat or Eclipse MAT.
    Please do not ask for code as refusal often offends.

    ** This space for rent **

  5. #5
    zaper is offline Member
    Join Date
    Apr 2013
    Posts
    7
    Rep Power
    0

    Default Re: Problem with Server Proxy

    I don't know where are mistakes;/

    HELP!
    PLEASE

  6. #6
    Tolls is offline Moderator
    Join Date
    Apr 2009
    Posts
    11,846
    Rep Power
    19

    Default Re: Problem with Server Proxy

    Have you taken a heap dump?
    This is the third time I've suggested this...
    Please do not ask for code as refusal often offends.

    ** This space for rent **

Similar Threads

  1. proxy server
    By mahamudsust in forum Networking
    Replies: 3
    Last Post: 03-04-2013, 06:04 AM
  2. Replies: 3
    Last Post: 04-04-2012, 12:38 AM
  3. Proxy Server Bypass Help
    By jrdncchr in forum Networking
    Replies: 28
    Last Post: 01-07-2012, 10:22 AM
  4. Almost got my proxy server working
    By SegFault in forum Advanced Java
    Replies: 0
    Last Post: 09-22-2010, 05:32 PM
  5. proxy server
    By guneet singh in forum Networking
    Replies: 1
    Last Post: 01-18-2009, 01:06 PM

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •