Solved

Java - quick review of RTS client TCP server setup code please

Posted on 2014-03-11
11
356 Views
Last Modified: 2014-03-25
Hi
I've been asking a few Python RTS Q's, but I've decided to go back to java, based on recommendations in another question. - I'm thinking a lot clearer now, from all the mistakes  understood.

i'm going to start his time with a TCP connecting system for complete reliability, and then an in-game UDP cycle with TCP aid

First I'm doing the initial connection with TCP. Please check it out, the client socket is missing something initially, - Should not be difficult to fix, below server client

import java.io.*;
import java.net.*;

public class DRWserver extends Thread {
	
	public int numClients, numClientsExpected;
	
	serverClient[] serverClients;
	public static int TCPport=1024;
	
	
	ServerSocket serverSocket;

	public DRWserver( int playerCount) {
		
		numClientsExpected=playerCount;
		
		serverClients = new serverClient[numClientsExpected];
		numClients=0;
		
		start();
		
	}
	
	public void run()  {
		
		DataOutputStream dos;
		DataInputStream is;
		try {
			
		serverSocket = new ServerSocket(TCPport);
		Thread.sleep(200);
		System.out.println("Created TCP serverSocket on port "+serverSocket.getLocalPort());
		boolean AcceptingClients=true;
		
		
		
		
		while (AcceptingClients) {


			System.out.println("\nClient TCP accept() : ");
			Socket socket = serverSocket.accept();
			

			System.out.println("Client joining"); // needs serverClients to be added to
			System.exit(0);
		}
		
		
		
		
		} catch (Exception e) {

			System.out.println("\nDRWserver run ex : "+e);
			e.printStackTrace();
		}
		}
	
	public static void main(String[] args) {

		
		new DRWserver(3);
		
		

	}

}

Open in new window



server needs server client stuct . . .
server client . .
import java.net.*;


public class serverClient {
	
	int playerNumber;
	Inet4Address address;

}

Open in new window





client code . . . .
import java.io.*;
import java.net.*;


public class DRWclient extends Thread{
	
	InetAddress serverAddress;
	int clientNumber;
	Socket clientSocket;
	
	public static byte MSG_JOIN=1;

	public DRWclient(int cliNum, InetAddress serveraddress) {
		
		clientNumber=cliNum;
		serverAddress= serveraddress;
		
		start();
	}
	
	public void run() {
		try {
		System.out.println("Client "+clientNumber+" run()");
		
		clientSocket= new Socket();
		while (!clientSocket.isConnected()) {
			clientSocket= new Socket();
			System.out.print("c");
		}
		System.out.println("Socket connected");
		DataOutputStream os = new DataOutputStream(clientSocket.getOutputStream());
		
		byte[] bytes = new byte[64];
		bytes[0]=MSG_JOIN;
		byte[] BAplayerNum = intToByteArray(clientNumber);
		bytes[1]=BAplayerNum[0];
		bytes[2]=BAplayerNum[1];
		bytes[3]=BAplayerNum[2];
		bytes[4]=BAplayerNum[3];
		DatagramPacket packet = new DatagramPacket(bytes,64);
		
		packet.setAddress(serverAddress);
		
		os.write(bytes); // should be packet
		
		
		} catch (Exception e) {
			
			System.out.println("DRWclient run() ex : "+e);
			e.printStackTrace();
			
		}
		
		
		
		
	}
	public static void main(String[] args) {

		InetAddress servAddress=null;
		try {
			servAddress = InetAddress.getByName("x.y.c.h server ip address");
		} catch (Exception e) {
			System.out.println("DRWclient main() ex : "+e);
			e.printStackTrace();
		}
		DRWclient c0 = new DRWclient(0,servAddress);

	}
	
	public static int byteArrayToInt(byte[] b) {
		return byteArrayToInt(b, 0);
		}
	
	
	public static int byteArrayToInt(byte[] b, int offset) {
		int value = 0;
		for (int i = 0; i < 4; i++) {
		int shift = (4 - 1 - i) * 8;
		value += (b[i + offset] & 0x000000FF) << shift;
		}
		return value;
		}
	
	public static byte[] intToByteArray(int value) {
		byte[] b = new byte[4];
		for (int i = 0; i < 4; i++) {
		int offset = (b.length - 1 - i) * 8;
		b[i] = (byte) ((value >>> offset) & 0xFF);
		}
		return b;
		}
	

}

Open in new window

0
Comment
Question by:beavoid
  • 6
  • 2
  • 2
11 Comments
 
LVL 35

Expert Comment

by:mccarl
Comment Utility
You need to create the client Socket with the address of the server, otherwise it just stays as an unconnected socket...
clientSocket = new Socket(serverAddress, 1024);

Open in new window

0
 
LVL 86

Accepted Solution

by:
CEHJ earned 500 total points
Comment Utility
Your design looks back to front.

public class DRWserver extends Thread {
	
	public int numClients, numClientsExpected;
	
	serverClient[] serverClients;

Open in new window


The server should use n threads to handle n connections. It should not be one thread accepting n connections. Now, that might be OK if the server itself ran in its own thread (though you wouldn't extend Thread) and then spawned further threads to handle the actual connections, but i can see you're not doing that.

Personally i would use a framework for basic CS functionality and then build your app around that.
0
 
LVL 86

Expert Comment

by:CEHJ
Comment Utility
?
0
 

Author Comment

by:beavoid
Comment Utility
Thanks. - if I have a pool of threads handling activity messages from each client, where should I house the game state best, and the clock? Must the clock wait for an activity message from each client before incrementing? - like a game of monopoly needs a move from everyone?
0
 
LVL 86

Expert Comment

by:CEHJ
Comment Utility
Sorry - i'm get confused. You asked for a review of your code, which i gave you and you ignored - now you're asking another question after closing it ..??
0
Highfive Gives IT Their Time Back

Highfive is so simple that setting up every meeting room takes just minutes and every employee will be able to start or join a call from any room with ease. Never be called into a meeting just to get it started again. This is how video conferencing should work!

 

Author Comment

by:beavoid
Comment Utility
CEHJ, I apologize for not giving you credit for your excellent answer. I am asking moderators to let me re-assign credit. I just quickly pressed accept answer on the answer with the socket code I was hoping for. - and not multiple solutions.

mods, can you re-open the closing for me?
0
 
LVL 86

Expert Comment

by:CEHJ
Comment Utility
Oh OK. You need to click on this to get attention
Having said that, you still need to open a new question
0
 
LVL 35

Expert Comment

by:mccarl
Comment Utility
I just quickly pressed accept answer on the answer with the socket code I was hoping for. - and not multiple solutions
And now you have gone and still not selected multiple solutions? And my answer which was directly addressing your initial question goes unrewarded?
0
 
LVL 86

Expert Comment

by:CEHJ
Comment Utility
:)
0
 
LVL 86

Expert Comment

by:CEHJ
Comment Utility
Oh dear! Didn't notice there was a problem still ...
0

Featured Post

Why You Should Analyze Threat Actor TTPs

After years of analyzing threat actor behavior, it’s become clear that at any given time there are specific tactics, techniques, and procedures (TTPs) that are particularly prevalent. By analyzing and understanding these TTPs, you can dramatically enhance your security program.

Join & Write a Comment

Suggested Solutions

Introduction This article is the last of three articles that explain why and how the Experts Exchange QA Team does test automation for our web site. This article covers our test design approach and then goes through a simple test case example, how …
This is an explanation of a simple data model to help parse a JSON feed
Viewers will learn about arithmetic and Boolean expressions in Java and the logical operators used to create Boolean expressions. We will cover the symbols used for arithmetic expressions and define each logical operator and how to use them in Boole…
In this seventh video of the Xpdf series, we discuss and demonstrate the PDFfonts utility, which lists all the fonts used in a PDF file. It does this via a command line interface, making it suitable for use in programs, scripts, batch files — any pl…

771 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

15 Experts available now in Live!

Get 1:1 Help Now