无法与Java中的服务器通信

时间:2012-03-24 13:57:57

标签: java sockets p2p

我正在尝试将服务器写入客户端程序,但我无法与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 个答案:

答案 0 :(得分:3)

您必须在输入流

之前创建输出流

答案 1 :(得分:2)

以下是一些与客户端和服务器套接字通信的工作代码。希望您可以根据您的具体问题进行调整。

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();

答案 2 :(得分:0)

您的代码永远不会工作,因为您不使用线程。要启动服务器,您需要在代码中的某个位置调用accept

myServerSocket.accept();

这是阻止调用,即代码流停止直到客户端连接。但是因为你不能执行任何语句(记住accept是阻塞的吗?)客户端如何连接?这个鸡和蛋的问题通过线程解决。请参阅霍华德的代码示例答案。

我没有看到对accept()的任何调用,所以我想知道你的客户端连接到什么......