Skip to content

Instantly share code, notes, and snippets.

@Mrmeguyme
Created March 31, 2018 12:00
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Mrmeguyme/d4d53668a600b3e55ae0b1898c42487c to your computer and use it in GitHub Desktop.
Save Mrmeguyme/d4d53668a600b3e55ae0b1898c42487c to your computer and use it in GitHub Desktop.
tcp connection not working
//This is the server's main class.
package com.server;
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
*
* @author Mrmeguyme
*/
public class Main {
public static List<Player> players = new ArrayList<>();
private static int maxPasses = 10000;
private static int port = 12232;
private static List<ServerThread> threads = new ArrayList<>();
public static void main(String[] args)
{
try {
ServerSocket socket = new ServerSocket(port);
System.out.println("Server Started");
while (!socket.isClosed()) {
Socket clientSocket = socket.accept();
try {
ServerThread t = new ServerThread(clientSocket, players);
t.start();
threads.add(t);
} catch (Exception e) {
System.out.print(e);
}
for (int i = 0; i < threads.size(); i++) {
if (threads.get(i).player != null) {
for (int j = 0; j < players.size(); j++) {
if (players.get(j).name.equals(threads.get(i).player.name)) {
players.remove(j);
}
}
players.add(threads.get(i).player);
System.out.println("adding " + threads.get(i).player.name);
threads.get(i).join();
}
}
for (int i = 0; i < players.size(); i++) {
Player p = players.get(i);
p.pass();
}
}
} catch(Exception e) {
System.out.print(e);
}
}
public static void addNewPlayersToPlayers (List<Player> p)
{
boolean done = false;
for (int i = 0; i < p.size(); i++) {
for (int k = 0; k < players.size(); k++) {
if (p.get(i).name.equals(players.get(k).name)) {
players.remove(k);
players.add(p.get(i));
done = true;
k = players.size();
}
}
if (!done) {
players.add(p.get(i));
done = false;
}
}
}
public static String buildResponse(String req)
{
//Step 1: Handle Request & add character to list of characters ✓
//Step 2: Purge disconnected players with a 'passes' value of more than 10000 ✓
//Step 3: return list of other players to the client ✓
//NOTE: Must remove player info of client's player. ✓
//NOTE: Must parse the response into string form. ✓
//FORMAT: name,x,y,z,rx,ry,rz;--continute pattern. ✓
String name = req.split(",")[0];
addPlayerFromRequest(req);
String response = "";
if (players.size() <= 1) {
return response;
}
for (Iterator<Player> it = players.iterator(); it.hasNext();) {
Player p = it.next();
if (!p.name.equals(name)) {
response += p.name + "," + p.x + "," + p.y + "," + p.z + "," + p.rx + "," + p.rx + "," + p.rz + ";";
} else {
it.remove();
}
if (p.passes > maxPasses) {
it.remove();
System.out.println("Purged: " + p.name);
}
}
return response;
}
public static void addPlayerFromRequest (String req)
{
String[] list = null;
try {
list = req.split(",");
} catch (Exception e) { }
if (list == null) {
return;
}
String user = list[0];
float x = Float.parseFloat(list[1]);
float y = Float.parseFloat(list[2]);
float z = Float.parseFloat(list[3]);
float rx = Float.parseFloat(list[4]);
float ry = Float.parseFloat(list[5]);
float rz = Float.parseFloat(list[6]);
for (int i = 0; i < players.size(); i++) {
if (players.get(i).name.equals(user)) {
players.remove(i);
}
}
players.add(new Player(x, y, z, rx, ry, rz, user));
}
}
//This is the client's code to send a request.
package com.game3dapplication.multiplayer;
import com.game3dapplication.logic.GameLevel;
import com.game3dapplication.Main;
import com.game3dapplication.util.Player;
import java.io.BufferedReader;
import java.io.Console;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
*
* @author Mrmeguyme
*/
public class MultiThread extends Thread {
public static String username = "player";
public List<Player> playersList;
public Player player;
private static boolean running = true;
public static String ipAddress = "192.168.1.23";
public void run() {
while (running) {
playersList = serverPing(playersList, player);
}
}
public void kill ()
{
running = false;
}
public void runThread () {
(new MultiThread()).start();
}
public void giveParams (List<Player> pl, Player p)
{
username = p.name;
playersList = pl;
player = p;
}
private static List<Player> serverPing(List<Player> players, Player player)
{
try {
int port = 12232;
Socket clientSocket = new Socket(ipAddress, port);
String out = username + "," + player.x + "," + player.y + "," + player.z + "," + player.rx + "," + player.ry + "," + player.rz;
while (!clientSocket.isConnected() && port < 12300) {
port++;
try {
clientSocket = new Socket(ipAddress, port);
} catch (Exception ex) { }
}
DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream());
BufferedReader inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
System.out.println("Sending: " + out);
outToServer.writeBytes(out + '\n');
outToServer.flush();
if (inFromServer.ready()) {
String in = inFromServer.readLine();
System.out.println("Received: " + in);
players = parseResponse(in, players);
}
clientSocket.close();
} catch (Exception ex) {
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
return players;
}
return players;
}
private static List<Player> parseResponse (String s, List<Player> players)
{
//FORMAT:
//josh,25,1,64,100,0,0;will,25,111,876,200,0,0
for (String str : s.split(";")) {
if (str != "" && str.split(",").length >= 6) {
String[] list = str.split(",");
String user = list[0];
float x = Float.parseFloat(list[1]);
float y = Float.parseFloat(list[2]);
float z = Float.parseFloat(list[3]);
float rx = Float.parseFloat(list[4]);
float ry = Float.parseFloat(list[5]);
float rz = Float.parseFloat(list[6]);
for (int i = 0; i < players.size(); i++) {
if (players.get(i).name.split(",")[0].equals(user)) {
players.remove(i);
break;
}
}
players.add(new Player(x, y, z, rx, ry, rz, user));
}
}
return players;
}
}
//This is the player class.
package com.game3dapplication.util;
/**
*
* @author Mrmeguyme
*/
public class Player {
public float x;
public float y;
public float z;
public float rx;
public float ry;
public float rz;
public String name = "player";
public int passes;
public Player (float x, float y, float z, float rx, float ry, float rz)
{
this.x = x;
this.y = y;
this.z = z;
this.rx = rx;
this.ry = ry;
this.rz = rz;
passes = 0;
name = "player";
}
public Player (float x, float y, float z, float rx, float ry, float rz, String name)
{
this.x = x;
this.y = y;
this.z = z;
this.rx = rx;
this.ry = ry;
this.rz = rz;
passes = 0;
this.name = name;
}
}
package com.server;
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.Socket;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
*
* @author Mrmeguyme
*/
public class ServerThread extends Thread {
private Socket clientSocket;
private List<Player> players;
public Player player = null;
public ServerThread (Socket clientSocket, List<Player> players)
{
this.clientSocket = clientSocket;
this.players = players;
}
public void run()
{
try {
BufferedReader br = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
DataOutputStream os = new DataOutputStream(clientSocket.getOutputStream());
String req = br.readLine();
br.close();
String response = buildResponse(req);
os.writeBytes(response);
os.flush();
System.out.println("Sending [ " + response + " ] to " + clientSocket.getInetAddress().getHostAddress());
player = addPlayerFromRequest(req);
} catch (IOException ex) {
Logger.getLogger(ServerThread.class.getName()).log(Level.SEVERE, null, ex);
}
try {
clientSocket.close();
} catch (IOException ex) {
Logger.getLogger(ServerThread.class.getName()).log(Level.SEVERE, null, ex);
}
}
public String buildResponse(String req)
{
//Step 1: Handle Request & add character to list of characters ✓
//Step 2: Purge disconnected players with a 'passes' value of more than 10000 ✓
//Step 3: return list of other players to the client ✓
//NOTE: Must remove player info of client's player. ✓
//NOTE: Must parse the response into string form. ✓
//FORMAT: name,x,y,z,rx,ry,rz;--continute pattern. ✓
List<Player> plays;
plays = players;
String name = req.split(",")[0];
String response = "";
if (plays.size() <= 1) {
return response;
}
for (int i = 0; i < plays.size(); i++) {
Player p = plays.get(i);
if (!p.name.equals(name)) {
response += p.name + "," + p.x + "," + p.y + "," + p.z + "," + p.rx + "," + p.rx + "," + p.rz + ";";
}
}
return response;
}
public Player addPlayerFromRequest (String req)
{
String[] list = req.split(",");
String user = list[0];
float x = Float.parseFloat(list[1]);
float y = Float.parseFloat(list[2]);
float z = Float.parseFloat(list[3]);
float rx = Float.parseFloat(list[4]);
float ry = Float.parseFloat(list[5]);
float rz = Float.parseFloat(list[6]);
return new Player(x, y, z, rx, ry, rz, user);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment