当前位置: 首页 > 知识库问答 >
问题:

无法从Java TCP服务器接收数据

柯正谊
2023-03-14

服务器上,当我获得一个新连接(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);
                }

            }
        }
    }

共有1个答案

乐正宏深
2023-03-14

尝试更改为

os.writeByte(1);
os.flush();
 类似资料:
  • 我有一个示例代码如下,套接字绑定到IP10.10.88.11和端口9876。我用下面的wireshark测试了2种情况。两台电脑都在同一个子网中。 从同一PC发送UDP数据包(10.10.88.11)-UDP服务器能够接收 从另一台电脑发送UDP数据包(10.10.88.10)-UDP服务器无法接收,但Wireshark(在10.10.88.11)能够捕获数据包 我在网上搜索过,但找不到解决办法。

  • 我试图让一些基于PAHO的客户机使用Vert.x MQTT服务器。我试图发布到我的接收客户端订阅的测试主题。我很难从客户端发布者向客户端订阅者发送消息。 使用我在Internet上看到的真实例子,我构建了一个MQTT代理。vert.x MQTT代理代码的代码如下所示: 我很确定我在这里错过了什么,但我想不出会是什么。有人能帮我把这个弄好吗??? 提前感谢您的任何帮助或见解。

  • 使用@value(${fanout.exchange})注释在使用带有Github Repo的spring-cloud-config服务器时初始化失败。我得到: 这两个类的pom.xml上都有spring-cloud-config。configServer使用@EnableConfigServer进行注释。我在github repo中的文件名为datacollector.properties Ra

  • 我正在尝试使用UDP在服务器(在公共IP上)和客户端(通过NAT)之间进行双向通信。我的逻辑是,如果服务器向IP和它接收数据包的端口发送一些数据,客户端仍然应该得到它,因为NAT最终会有将数据包发送到客户端的映射。 客户端有 2 个进程,一个用于发送数据包,另一个进程用于接收数据。服务器继续等待数据,如果它获得数据,它会将数据发送回从接收数据的端口和 IP。 客户代码如下: client_recv

  • 问题内容: 我要进行最简单的解释。我的Java TCP项目有一个服务器和三个客户端。 服务器具有一个ClientThread。每个客户端都有一个ServerThread和一个UserThread。 工作流程为: 1.客户端(例如,client_0)的UserThread获取用户输入,然后将消息发送到服务器。 2.服务器的ClientThread捕获来自client_0的消息,并将另一条消息发送到另

  • 问题内容: 我要进行最简单的解释。我的Java TCP项目有一个服务器和三个客户端。 服务器具有一个ClientThread。每个客户端都有一个ServerThread和一个UserThread。 工作流程为: 1.客户端(例如,client_0)的UserThread获取用户输入,然后将消息发送到服务器。 2.服务器的ClientThread捕获来自client_0的消息,并将另一条消息发送到另

  • 我的docker版本是1.13.1。我正试图从我的docker容器连接到redis-server,但我遇到了拒绝连接的错误。详细的日志如下: 原因:redis.clients.jedis.exceptions.jedisconnectionException:java.net.Connection:redis.clients.jedis.Connection(Connection.java:207

  • 我试图创建一个Unix套接字数据报示例。客户端可以流畅地发送和接收消息。在缓冲区长度小于< code>SOCKET_BUFFER_SIZE的情况下,服务器能够做到这一点,否则服务器的输出会在接收的缓冲区显示一些无效字符。 客户代码 服务器的代码 头文件 这是我得到的 奇怪的是,客户端收到了预期的消息,尽管服务器在发送之前没有正确格式化消息。 这是我的预期输出 我该如何解决?