Jump to content
  • Advertisement
Sign in to follow this  
RLS0812

Can I Make This Code Faster Without Over Complicating It ?

This topic is 1345 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

 I have been working on test code for a client/server to implement into an existing project.

 My question is: could I improve the code to make it run faster, WITHOUT overcomplicated things ?

 Once I implement this into my existing code, it will probably have to handle between 10 to 20 updates per second ( several different object types possible. )

 

***

MAIN

***

public class Main {

	public static void main (String[] args){
		TestObj to = new TestObj();
		Client client = new Client();
		Server server = new Server();
		Thread t = new Thread(server,"");
		t.start();
		
		to.set("Moo");
		client.out(to);
		to.set("Baa");
		client.out(to);
		to.set("Quack");
		client.out(to);
	}
}

***

TestObj ( only used for this code test )

***

public class TestObj implements Serializable {
	String s;
	
	public void set(String str){
		s = str;
	}

	public void say(){
		System.out.println("You said: " + s);
	}
}

***

Client

***

public class Client {

	Socket socket;
	ObjectInputStream input;
	ObjectOutputStream output;

	
	public void out(Object obj){
		try{
			socket = new Socket ("127.0.0.1",1660);
			output = new ObjectOutputStream (socket.getOutputStream());
			output.writeObject(obj);
		}
		catch(Exception e){
			System.out.println("Client Crash\n" + e);
		}
	}
}

***

Server

***

public class Server implements Runnable {
	ServerSocket ssocket;
	Socket socket;
	ObjectInputStream input;
	Object dump;
	TestObj to;
	
	@Override
	public void run() {
		try{
			ssocket = new ServerSocket(1660);
			
			while (true){
			socket = ssocket.accept();
			input = new ObjectInputStream(socket.getInputStream());
			dump = input.readObject() ;
			socket.close();
			// if (dump instanceof TestObject){}
			to = (TestObj) dump;
			to.say();
			} 
			
		} 
		catch (Exception e){
			System.out.println("Server Crash\n" + e);
		}
		
	}
}
Edited by Shippou

Share this post


Link to post
Share on other sites
Advertisement

Don't create a new socket every time you do an out, rather create the socket and connect to the server once (in the constructor perhaps?), then issue all the commands after that without having to close and re-open the connection each time.  Close the socket when the client is done.

 

Similar with the server, have it not only listen for new connections, but also listen for data from existing open connections.

 

That alone should improve the efficiency.

Share this post


Link to post
Share on other sites

I'm getting null pointer errors whenever I move bits of code into the class constructor in both server and client ...

Edit - Multi threading the connections is becoming a nightmare - as of right now a new thread is created every time I connect ...

 The way it is written works, but creates a memory leak at the same time angry.png

*** Server ***

public class Server implements Runnable {
	ServerSocket ssocket;
	Socket socket ;
	ObjectInputStream input;
	Object dump;
	TestObj to;
	
	@Override
	public void run() {
		try{
			ssocket = new ServerSocket(1660);

			while (true){
			socket = ssocket.accept();
			Connect connect = new Connect(socket);
			Thread t = new Thread(connect,"");
			t.start();
			
			} 
				} 
		catch (Exception e){
			System.out.println("Server Crash\n" + e);
		}
		
	}
}

*** Connect ***

public class Connect implements Runnable {
	ServerSocket ssocket;
	Socket socket ;
	ObjectInputStream input;
	Object dump;
	TestObj to;

	
	public Connect(Socket so){
		socket = so;
	}
	
	
	@Override
	public void run() {
		try{
			while(true){
			input = new ObjectInputStream(socket.getInputStream());
			dump = input.readObject() ;
			//socket.close();
			to = (TestObj) dump;
			to.say();
			}
		}
		catch (Exception e){
			System.out.println("Connect Crashed\n" + e);
		}
	}
	

}
Edited by Shippou

Share this post


Link to post
Share on other sites

 The way it is written works, but creates a memory leak at the same time
Then don't do a while(true) inside Connect.

 

Implement a timeout. Sleep the thread, see if there is new data, sleep a bit more, and if new data doesn't enters in X amount of time, close the connection. run() method ends and Thread is GC'd.

 

Also, don't 'new' Threads willy nilly. Use executors. Fix the amount of threads you want to make to handle connections. Threads aren't cheap to make, nor cheap to maintain (10Mb per Thread instance IIRC).

Share this post


Link to post
Share on other sites

Shippou, you're not doing it right.

 

I'm not familiar with Java's socket implementation, but google "java socket select", as you want to perform a select (or Java equivalent) on the server socket (to accept incoming connections), as well as all the already connected sockets.  That will wake (or timeout if you want) whenever there is a new connection or data to be read on an open socket.  I wouldn't use a Thread for the server or the client for that matter.

 

For the client, why can't you, when you go to send data, check if it's connected, and, if not, do a connect (saving the socket), then just send data after that.

 

IMO, you should probably just find a good tutorial on Java client/server as it should cover all of this.  Good luck and have fun.

Share this post


Link to post
Share on other sites

Please give links to WORKING code that demonstrates how to keep a server - client connection open ... I have been working on the problems of my code for over 14 hours now - and I can not find anything more than - throw away examples, code that is written far worse than mine, and examples that do not actually keep a connection alive.

Share this post


Link to post
Share on other sites

Please give links to WORKING code that demonstrates how to keep a server - client connection open ... I have been working on the problems of my code for over 14 hours now - and I can not find anything more than - throw away examples, code that is written far worse than mine, and examples that do not actually keep a connection alive.

 

I googled "java client server tutorial" and the first two links were Oracle documentation on Java sockets that appears to connect once then repeatedly send/receive data until an arbitrary disconnect message is received.  The code also doesn't appear to be any worse than yours, but I guess that could be a matter of opinion.

Share this post


Link to post
Share on other sites


Please give links to WORKING code that demonstrates how to keep a server - client connection open ... I have been working on the problems of my code for over 14 hours now - and I can not find anything more than - throw away examples, code that is written far worse than mine, and examples that do not actually keep a connection alive.

What have you tried searching for?

Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

Participate in the game development conversation and more when you create an account on GameDev.net!

Sign me up!