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 online now Moderator
    Join Date
    Apr 2009
    Posts
    11,446
    Rep Power
    18

    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.

  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 online now Moderator
    Join Date
    Apr 2009
    Posts
    11,446
    Rep Power
    18

    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.

  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 online now Moderator
    Join Date
    Apr 2009
    Posts
    11,446
    Rep Power
    18

    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.

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
  •