Java套接字问题

时间:2012-11-22 02:28:53

标签: java sockets client chat communication

所以我的程序的最终结果是更新游戏客户端,但到目前为止我所拥有的是能够接受多个连接的服务器,以及连接到服务器的客户端。这是客户端部分的代码:

public void client() {
    Socket socket = null;
    ObjectInputStream in = null;
    ObjectOutputStream out = null;

    try {
        socket = new Socket(IP, Integer.parseInt(port));
        in = new ObjectInputStream(socket.getInputStream());
        out = new ObjectOutputStream(socket.getOutputStream());
    } catch (Exception e) {
        e.printStackTrace();
    }
    do {
        // have a conversation
        try {
            message = (String) in.readObject();
            System.out.println("\n" + message);
        } catch (Exception e) {
            System.out.println("\n idk wtf that user sent!");
        }
    } while (!message.equals("CLIENT - END")); // When the user types "END"

    System.err.println("CLOSED!!!");
    System.exit(0);
}

这是服务器部分的代码:

public void run() {
    // where everything happens
    System.out.println("server- connected");
    try {
        in = new ObjectInputStream(socket.getInputStream());
        out = new ObjectOutputStream(socket.getOutputStream());

        out.writeObject("hi");
        out.flush();
        Thread.sleep(5000);
        out.writeObject("close");
        out.flush();
        System.out.println("closed");
    } catch (Exception e) {
        e.printStackTrace();
    }

}

现在,我遇到了这个问题,当我的服务器发送对象"hi"时,客户端似乎没有收到它。我不确定它是否确实存在,但是如果它得到了它,它就不会像我想要的那样打印出来。我以前做过一个聊天程序,做同样的事情,我几乎把它复制到这个,但它没有沟通。我得到的最多是确认他们已连接。我不知道发生了什么,但任何帮助将不胜感激!提前谢谢!

1 个答案:

答案 0 :(得分:4)

在 ObjectInputStreams之前创建ObjectOutputStreams ,并在创建后立即刷新它们。

ObjectInputStream的构造函数读取流标头。这个流标题是由ObjectOutputStream的构造函数编写的(一种丑陋的实现,但它就是这样)。如果你首先构造OIS,它们会挂起等待头字节。