Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

TCP, p2p, w LibGdx

Ostatnio zmodyfikowano 2014-09-23 19:43
Autor Wiadomość
anonim
Temat założony przez niniejszego użytkownika
TCP, p2p, w LibGdx
» 2014-09-23 19:43:39
Cześć
Piszę ostatnio grę w javie (libgdx). Łączy się ona przez HTTP z serwerem na cba.pl i pobiera z niego listę zalogowanych użytkowników (login, IP, ranking).
Następnie poprzez Select Box'a możemy wybrać przeciwnika. Od tej pory wszelka komunikacja powinna iść przez TCP.
W klasie TCPManager mam dwa ważne elementy: serwer nasłuchujący na porcie PORT i funkcję sendMessage(message, ip), która wysyła na ten sam port wiadomość message do komputera o adresie IP ip. Niestety działa to tylko jeżeli ip="127.0.0.1" (localhost i włączony webserv). Nie działa natomiast w przypadku IP z którym mój komputer jest widoczny w sieci xx.xx.xxx.xx(tak ma docelowo działać, żeby łączyć się z innymi urządzeniami). Podaję kod:

public class TCPManager {
MyGdxGame game;
WebAccountManager account;
int PORT = 2338;

String enemyLogin="";
String enemyIP="";
int enemyELO=0;

TCPManager (MyGdxGame g, WebAccountManager a){
game = g;
account = a;
new Thread(new Runnable(){   
            @Override
            public void run() {
                ServerSocketHints serverSocketHint = new ServerSocketHints();
                serverSocketHint.acceptTimeout = 0;
                ServerSocket serverSocket = Gdx.net.newServerSocket(Protocol.TCP, PORT, serverSocketHint);

                while(true){
                    Socket socket = serverSocket.accept(null);

                    BufferedReader buffer = new BufferedReader(new InputStreamReader(socket.getInputStream()));

                    try {
                    String msg = buffer.readLine();
                    Gdx.app.log("msg", msg);
                    Gdx.app.log("msg", Integer.toString(msg.length()));
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }).start();
}

public void sendMessage(String str, String IP){
    // When the button is clicked, get the message text or create a default string value
        String textToSend = new String();
        if(str.length() == 0)
            textToSend = "Doesn't say much but likes clicking buttons\n";
        else
            textToSend = str + ("\n"); // Brute for a newline so readline gets a line
       
        SocketHints socketHints = new SocketHints();
        // Socket will time our in 4 seconds
        socketHints.connectTimeout = 0;
        //create the socket and connect to the server entered in the text box ( x.x.x.x format ) on port _PORT
        Socket socket = Gdx.net.newClientSocket(Protocol.TCP, IP, PORT, socketHints);
        try {
            // write our entered message to the stream
            socket.getOutputStream().write(textToSend.getBytes());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
public void setPlayer(int idx){
Gdx.app.log("setPlayer", "start");
enemyLogin = game.account.onlinePlayers.get(idx).login;
enemyIP = game.account.onlinePlayers.get(idx).IP;
enemyELO = game.account.onlinePlayers.get(idx).ELO;
Gdx.app.log(enemyLogin, enemyIP);
}
}

Oraz error którym kończy się aplikacja po wywołaniu funkcji sendMessage z IP != "127.0.0.1":

Exception in thread "LWJGL Application" com.badlogic.gdx.utils.GdxRuntimeException: Error making a socket connection to xx.xx.xxx.xx:2338
at com.badlogic.gdx.net.NetJavaSocketImpl.<init>(NetJavaSocketImpl.java:51)
at com.badlogic.gdx.backends.lwjgl.LwjglNet.newClientSocket(LwjglNet.java:56)
at com.asd.hardcoremaze.TCPManager.sendMessage(TCPManager.java:62)
at com.asd.hardcoremaze.GuiManager$20.clicked(GuiManager.java:545)
at com.badlogic.gdx.scenes.scene2d.utils.ClickListener.touchUp(ClickListener.java:89)
at com.badlogic.gdx.scenes.scene2d.InputListener.handle(InputListener.java:57)
at com.badlogic.gdx.scenes.scene2d.Stage.touchUp(Stage.java:272)
at com.badlogic.gdx.InputMultiplexer.touchUp(InputMultiplexer.java:94)
at com.badlogic.gdx.backends.lwjgl.LwjglInput.processEvents(LwjglInput.java:305)
at com.badlogic.gdx.backends.lwjgl.LwjglApplication.mainLoop(LwjglApplication.java:199)
at com.badlogic.gdx.backends.lwjgl.LwjglApplication$1.run(LwjglApplication.java:114)
Caused by: java.net.ConnectException: Connection refused: connect
at java.net.DualStackPlainSocketImpl.connect0(Native Method)
at java.net.DualStackPlainSocketImpl.socketConnect(Unknown Source)
at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source)
at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source)
at java.net.AbstractPlainSocketImpl.connect(Unknown Source)
at java.net.PlainSocketImpl.connect(Unknown Source)
at java.net.SocksSocketImpl.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at com.badlogic.gdx.net.NetJavaSocketImpl.<init>(NetJavaSocketImpl.java:46)
... 10 more
 
P-117399
« 1 »
  Strona 1 z 1