【问题标题】:Unable to receive data from Java TCP server无法从 Java TCP 服务器接收数据
【发布时间】:2015-12-12 18:40:59
【问题描述】:

在服务器上,当我获得新连接时 (serverSocket.accept()), 我将该连接套接字传递给一个名为 ServerPlayer.java 的类的实例, 它从一个线程延伸出来。

我还创建了一个 OutputObjectStream 和一个 InputObjectStream 并将它们传递给新的 ServerPlayer 实例,然后将 ServerPlayer 实例添加到 ArrayList 以跟踪它们。

当我在新的 ServerPlayer 上调用 start() 时,我让它写入一个字节 (1)。

然后我让我的客户端运行一个侦听线程来侦听来自 TCP 服务器的传入数据。但是,我没有收到从服务器发送的 (1)。我不确定是服务器没有正确发送它还是客户端没有正确接收它......

ServerPlayer.java:

    /**
     * ServerPlayer.java
     * Creates a new instance of a player on the server, gives it
     * an output and input stream, as well as the socket it came in on
     */
    package server;

    import java.io.IOException;
    import java.io.ObjectInputStream;
    import java.io.ObjectOutputStream;
    import java.net.Socket;
    import java.util.logging.Level;
    import java.util.logging.Logger;

    public class ServerPlayer extends Thread {
        UIServer ui;
        Socket socket;
        ObjectOutputStream os;
        ObjectInputStream is;


        int id = -1;
        ServerPlayer(Socket socket, ObjectOutputStream os, ObjectInputStream is, UIServer ui){
            this.socket = socket;
            this.os = os;
            this.is = is;
            this.ui = ui;
        }

        public void setID(int id){
            this.id = id;
        }

        public int getID(){
            return this.id;
        }

        public void run(){
            boolean keepGoing = true;
            System.out.println("SERVERPLAYER THREAD START");
            try {
                os.writeByte(1);
                System.out.println("sent byte 1 from server");
            } catch (IOException ex) {
                Logger.getLogger(ServerPlayer.class.getName()).log(Level.SEVERE, null, ex);
            }
            while(keepGoing){
                try{
                    Byte msg = is.readByte();
                    int mes_id = msg.intValue();
                    ui.console.println("SERV MESSAGE#: " + mes_id);

                } catch (IOException ex) {
                    Logger.getLogger(ServerPlayer.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        }
    }

ListenFromServer.Java:

    /*
     * ListenFromServer.java
     * Listens for incoming data from the TCP Server (this is on the client side)
     */
    package client;

    import java.io.IOException;
    import java.util.logging.Level;
    import java.util.logging.Logger;

    public class ListenFromServer extends Thread {
        TCPClient client;
        boolean isRunning = false;
        public ListenFromServer(TCPClient client){
            this.client = client;
        }
        public void run(){
            System.out.println("listen from server thread start");
            isRunning = true;
            while(isRunning){

                try {
                    Byte b = client.sInput.readByte();
                    client.ui.console.println("BYTE: " + b.intValue());
                } catch (IOException ex) {
                    Logger.getLogger(ListenFromServer.class.getName()).log(Level.SEVERE, null, ex);
                }

            }
        }
    }

【问题讨论】:

  • 您需要展示所有这些流是如何创建的,否则您的问题无法回答。您应该将对象流的创建推迟到线程的run() 方法。否则,您可以阻止程序的其他部分。并在ObjectInputStream. 之前创建ObjectOutputStream

标签: java sockets tcp


【解决方案1】:

尝试改成

os.writeByte(1);
os.flush();

【讨论】:

    猜你喜欢
    • 2015-05-18
    • 1970-01-01
    • 1970-01-01
    • 2012-03-05
    • 1970-01-01
    • 2011-05-03
    • 2015-10-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多