Не удается связаться с сервером в Java - PullRequest
1 голос
/ 24 марта 2012

Я пытаюсь записать сервер в клиентскую программу, но не могу связаться с сервером на Java.

Вот кодовый блок в моей главной.

    InetAddress addr = InetAddress.getLocalHost();
    ipAddress = "78.162.206.164";
    ServerSocket serverSocket = new ServerSocket(0);
    String randomStringForPlayerName = RandomStringGenerator.generateRandomString(); 

    baseForReqOpp += ipAddress + " " + serverSocket + " " + randomStringForPlayerName;
    Socket socket = new Socket(host,2050); 
    socket.setSoTimeout(100);

    in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
    out = new PrintWriter(socket.getOutputStream());
    out.write(baseForReqOpp);
    out.flush();

    System.out.println(in.read());

Я знаю, что в коде сервера нет проблем, и все порты связи в порядке.

Но я ничего не могу прочитать с сервера.

Чтоможет быть проблема?

Ответы [ 3 ]

3 голосов
/ 24 марта 2012

вы должны создать выходной поток перед входным потоком

2 голосов
/ 24 марта 2012

Вот некоторый рабочий код для связи клиентских и серверных сокетов.Надеюсь, вы можете адаптировать его для вашей конкретной проблемы.

public class SocketTest {

    public void runTest() {
        try {
            // create the server
            new SimpleServer().start();
            // connect and send a message
            InetAddress addr = InetAddress.getLocalHost();
            Socket sock = new Socket(addr, 9090);
            ObjectOutputStream out = new ObjectOutputStream(sock.getOutputStream());
            out.writeObject("Hello server");
            out.flush();
            ObjectInputStream in = new ObjectInputStream(sock.getInputStream());
            System.out.println("from server: " + in.readObject());
            sock.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    // server has to run in a separate thread so the code doesn't block
    private class SimpleServer extends Thread {
        @Override
        public void run() {
            try {
                ServerSocket sock = new ServerSocket(9090);
                Socket conn = sock.accept();
                // the code blocks here until a client connects to the server
                ObjectInputStream in = new ObjectInputStream(conn.getInputStream());
                System.out.println("from client: " + in.readObject());
                ObjectOutputStream out = new ObjectOutputStream(conn.getOutputStream());
                out.writeObject("Hello client");
                out.flush();
                sock.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

}

Чтобы запустить его:

new SocketTest().runTest();
0 голосов
/ 26 марта 2012

Ваш код никогда не будет работать, потому что вы не используете потоки.Чтобы запустить сервер, вам нужно позвонить accept в определенный момент в вашем коде

myServerSocket.accept();

, это блокирующий вызов , т.е. кодпоток останавливается, пока клиент не соединится.Но поскольку вы не можете выполнить какое-либо утверждение (помните, accept блокирует?), Как клиент может подключиться?Эта проблема курицы и яйца решается с помощью потоков.См. Ответ Говарда для примера кода.

Я не вижу никаких звонков на accept(), поэтому мне интересно, к чему подключается ваш клиент ...

...