Created
March 31, 2018 12:00
-
-
Save Mrmeguyme/d4d53668a600b3e55ae0b1898c42487c to your computer and use it in GitHub Desktop.
tcp connection not working
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//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 file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//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 file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//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; | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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