为什么我的客户端套接字输入流没有接收从服务器套接字输出流发送的消息

bcr666

这是生成服务器线程的 SocketServer 代码

public class ProcessorCorresponder {
protected final static Logger logger = LogManager.getLogger( ProcessorCorresponder.class );

private static int port = Integer.parseInt(PropertiesLoader.getProperty("appserver.port") == null ? "666" : PropertiesLoader.getProperty("appserver.port"));
private static int maxConnections = Integer.parseInt(PropertiesLoader.getProperty("appserver.maxconnections") == null ? "666" : PropertiesLoader.getProperty("appserver.maxconnections"));

public static void main(String[] args) {
    logger.info("Starting server .. " 
            + "[port->" + port 
            + ",databaseName->" + databaseName + "]");

    try (ServerSocket listener = new ServerSocket();) {
    listener.setReuseAddress(true);
    listener.bind(new InetSocketAddress(port));
    Socket server;

    int i = 0;

    while((i++ < maxConnections) || (maxConnections == 0)) {
        server = listener.accept();

        logger.debug(
                "New Thread listening on " + server.getLocalAddress().toString() + ":" + server.getLocalPort()
                + ", initiated from IP => " +  server.getInetAddress().toString() + ":" + server.getPort()
                );

        MySocketServer socSrv = new MySocketServer (server);

        Thread t = new Thread( socSrv );            
        t.start();
    }
    } catch (Exception ex) {
        logger.error("Error in ProcessorInterface", ex);
    }
}
}

服务器代码:这是一个处理一个连接的线程,有一个程序可以监视服务器套接字并根据需要分离请求线程。

public class MySocketServer implements Runnable {
protected final static Logger logger = LogManager.getLogger(MySocketServer.class);

private final Socket server;

// because we are using threads, we must make this volatile, or the class will
// never exit.
private volatile boolean shouldContinue = true;

private StringBuffer buffHeartbeatMessage = new StringBuffer().append((char) 0).append((char) 0).append((char) 0)
        .append((char) 0).append((char) 0).append((char) 0);
private Heartbeat heartbeat = new Heartbeat(/* 60 */3000, buffHeartbeatMessage.toString());

public MySocketServer(Socket server) {
    this.server = server;
}

@Override
public void run() {
    try (BufferedReader in = new BufferedReader(new InputStreamReader(this.server.getInputStream()));
            BufferedOutputStream out = new HeartbeatBufferedOutputStream(this.server.getOutputStream(),
                    heartbeat)) {

        final StreamListener listener = new StreamListener(in);
        listener.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent event) {
                if (event.getID() == ActionEvent.ACTION_PERFORMED) {
                    if (event.getActionCommand().equals(StreamListener.ERROR)) {
                        logger.error("Problem listening to stream.");
                        listener.setShouldContinue(false);
                        stopRunning();
                    } else {
                        String messageIn = event.getActionCommand();
                        if (messageIn == null) { // End of Stream;
                            stopRunning();
                        } else { // hey, we can do what we were meant for
                            logger.debug("Request received from client");

                            // doing stuff here
                            ...
                            // done doing stuff

                            logger.debug("Sending Client Response");

                            try {
                                sendResponse(opResponse, out);
                            } catch (Exception ex) {
                                logger.error("Error sending response to OP.", ex);
                            }
                        }
                    }
                }
            }
        });
        listener.start();

        while (shouldContinue) {
            // loop here until shouldContinue = false;
            // this should be set to false in the ActionListener above
        }

        heartbeat.setShouldStop(true);
        return;
    } catch (Exception ex) {
        logger.error("Error in ESPSocketServer", ex);
        return;
    }

}

private void stopRunning() {
    shouldContinue = false;
}

private void sendResponse(ClientResponse opResponse, BufferedOutputStream out) throws Exception {
    logger.debug("Before write");
    out.write(opResponse.getResponse().getBytes());
    logger.debug("After write. Before flush");
    out.flush();
    logger.debug("After flush");
    // this log message is in my logs, so I know the message was sent
}
}

我的 StreamListener 类。

public class StreamListener extends Thread {
protected final static Logger logger = LogManager.getLogger(StreamListener.class);

public final static String ERROR = "ERROR";

private BufferedReader reader = null;
private List<ActionListener> actionListeners = new ArrayList<>();
private boolean shouldContinue = true;

public StreamListener(BufferedReader reader) {
    this.reader = reader;
}

@Override
public void run() {
    while (shouldContinue) {
        String message;
        try {
            // client blocks here and never receives message
            message = reader.readLine();
            ActionEvent event = new ActionEvent(this, ActionEvent.ACTION_PERFORMED, message);
            fireActionPerformed(event);
        } catch (IOException e) {
            e.printStackTrace();
            ActionEvent event = new ActionEvent(this, ActionEvent.ACTION_PERFORMED, ERROR);
            fireActionPerformed(event);
        }
    }
}

public void setShouldContinue(boolean shouldContinue) {
    this.shouldContinue = shouldContinue;
}

public boolean getShouldContinue() {
    return shouldContinue;
}

public boolean addActionListener(ActionListener listener) {
    return actionListeners.add(listener);
}

public boolean removeActionListener(ActionListener listener) {
    return actionListeners.remove(listener);
}

private void fireActionPerformed(ActionEvent event) {
    for (ActionListener listener : actionListeners) {
        listener.actionPerformed(event);
    }
}
}

我的心跳课

public class Heartbeat extends Thread {
private BufferedOutputStream bos = null;
private int beatDelayMS = 0;
private String message = null;
private boolean shouldStop = false;

public Heartbeat(int beatDelayMS, String message) {
    this.beatDelayMS = beatDelayMS;
    this.message = message;
    setDaemon(true);
}

@Override
public void run() {
    if (bos == null) { return; }

    while(!shouldStop) {
        try {
            sleep(beatDelayMS);
            try {
                bos.write(message.getBytes());
                bos.flush();
            } catch (IOException ex) {
            //  fall thru
            }
        } catch (InterruptedException ex) {
            if (shouldStop) {
                return;
            }
        }
    }
}

public void setBufferedOutputStream(BufferedOutputStream bos) {
    this.bos = bos;
}

public BufferedOutputStream getBufferedOutputStream() {
    return bos;
}

public void setShouldStop(boolean shouldStop) {
    this.shouldStop = shouldStop;
}

public boolean getShouldStop() {
    return shouldStop;
}
}

我的 HeartbeatBufferedOutputStream

public class HeartbeatBufferedOutputStream extends BufferedOutputStream {
private Heartbeat heartbeat = null;

public HeartbeatBufferedOutputStream(OutputStream out, Heartbeat heartbeat) {
    super(out);
    this.heartbeat = heartbeat;
    this.heartbeat.setBufferedOutputStream(this);
    heartbeat.start();
}

@Override
public synchronized void flush() throws IOException {
    super.flush();
    heartbeat.interrupt();
}
}

最后这里是“客户端”类

public class Mockup extends Thread {
protected final static Logger logger = LogManager.getLogger(Mockup.class);

// because we are using threads, we must make this volatile, or the class will
// never exit.
private volatile boolean shouldContinue = true;

public static void main(String[] args) {
    new Mockup().start();
}

@Override
public void run() {
    try (Socket socket = new Socket("localhost", 16100);
            BufferedOutputStream out = new BufferedOutputStream(socket.getOutputStream());
            BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));) {

        final StreamListener listener = new StreamListener(in);
        listener.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent event) {
                if (event.getID() == ActionEvent.ACTION_PERFORMED) {
                    if (event.getActionCommand().equals(StreamListener.ERROR)) {
                        logger.error("Problem listening to stream.");
                        listener.setShouldContinue(false);
                        stopRunning();
                    } else {
                        String messageIn = event.getActionCommand();
                        if (messageIn == null) { // End of Stream;
                            stopRunning();
                        } else { // hey, we can do what we were meant for
                            // convert the messageIn to an OrderPower request, this parses the information
                            logger.info("Received message from server. [" + messageIn + "].");
                        }
                    }
                }
            }
        });
        listener.start();

        StringBuffer buff = new StringBuffer("Some message to send to server");

        logger.info("Sending message to server [" + buff.toString() + "]");
        out.write(buff.toString().getBytes());

        out.flush();

        boolean started = false;
        while (shouldContinue) {
            if (!started) {
                logger.debug("In loop");
                started = true;
            }
            // loop here until shouldContinue = false;
            // this should be set to false in the ActionListener above
        }

        logger.info("Exiting Mockup");

        return;
    } catch (Exception ex) {
        logger.error("Error running MockupRunner", ex);
    }
}

private void stopRunning() {
    shouldContinue = false;
}
}

我已经从日志消息中确认服务器向 BufferedOutputStream 发送消息并被刷新,但客户端日志表明它在 reader.readLine() 上被阻止并且永远不会收到消息。

用户207421

你在读台词,但从不写台词。为您发送的内容添加行终止符。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

即使关闭了输出流,C ++套接字客户端仍会从Java服务器接收消息

来自分类Dev

套接字服务器无法接收客户端发送的消息

来自分类Dev

为什么要在客户端套接字之前打开服务器套接字?

来自分类Dev

我需要服务器将消息发送到所有客户端(Python,套接字)

来自分类Dev

Java套接字:检查客户端是否能够从服务器接收消息

来自分类Dev

Java套接字:检查客户端是否能够从服务器接收消息

来自分类Dev

Java多线程套接字客户端/服务器:发送和接收Enummap对象

来自分类Dev

无法从Java套接字服务器接收数据到C套接字客户端

来自分类Dev

客户端发送500字节,但是服务器接收244字节-套接字编程?

来自分类Dev

Spring Integration和TCP服务器套接字-如何向客户端发送消息?

来自分类Dev

服务器无法通过C中的套接字向客户端发送消息

来自分类Dev

从Node JS Socket客户端向MINA套接字服务器发送消息

来自分类Dev

如果服务器打开到端口的连接但客户端没有发送任何东西会发生什么?(Java 服务器套接字)

来自分类Dev

将输入从C套接字客户端读取到Java套接字服务器

来自分类Dev

将输入从C套接字客户端读取到Java套接字服务器

来自分类Dev

为什么我的套接字没有在服务器端关闭?

来自分类Dev

C ++服务器无法通过套接字从python客户端读取我的消息

来自分类Dev

通过套接字写入发送时,为什么客户端浏览器中没有显示图像?

来自分类Dev

为什么我需要按Enter键才能在套接字python服务器中查看其他客户端的输入?

来自分类Dev

客户端套接字未完全收到服务器端套接字发送的内容

来自分类Dev

为什么我的服务器PrintWriter.println()无法通过套接字发送其消息?

来自分类Dev

Python套接字服务器/客户端编程

来自分类Dev

C客户端/服务器套接字错误

来自分类Dev

服务器/客户端套接字连接

来自分类Dev

套接字编程-简单的客户端/服务器

来自分类Dev

客户端js上的套接字服务器?

来自分类Dev

Java客户端/服务器套接字问题

来自分类Dev

Java TCP 客户端/服务器套接字

来自分类Dev

如何使用Java中的套接字从服务器向特定客户端发送字符串消息?

Related 相关文章

  1. 1

    即使关闭了输出流,C ++套接字客户端仍会从Java服务器接收消息

  2. 2

    套接字服务器无法接收客户端发送的消息

  3. 3

    为什么要在客户端套接字之前打开服务器套接字?

  4. 4

    我需要服务器将消息发送到所有客户端(Python,套接字)

  5. 5

    Java套接字:检查客户端是否能够从服务器接收消息

  6. 6

    Java套接字:检查客户端是否能够从服务器接收消息

  7. 7

    Java多线程套接字客户端/服务器:发送和接收Enummap对象

  8. 8

    无法从Java套接字服务器接收数据到C套接字客户端

  9. 9

    客户端发送500字节,但是服务器接收244字节-套接字编程?

  10. 10

    Spring Integration和TCP服务器套接字-如何向客户端发送消息?

  11. 11

    服务器无法通过C中的套接字向客户端发送消息

  12. 12

    从Node JS Socket客户端向MINA套接字服务器发送消息

  13. 13

    如果服务器打开到端口的连接但客户端没有发送任何东西会发生什么?(Java 服务器套接字)

  14. 14

    将输入从C套接字客户端读取到Java套接字服务器

  15. 15

    将输入从C套接字客户端读取到Java套接字服务器

  16. 16

    为什么我的套接字没有在服务器端关闭?

  17. 17

    C ++服务器无法通过套接字从python客户端读取我的消息

  18. 18

    通过套接字写入发送时,为什么客户端浏览器中没有显示图像?

  19. 19

    为什么我需要按Enter键才能在套接字python服务器中查看其他客户端的输入?

  20. 20

    客户端套接字未完全收到服务器端套接字发送的内容

  21. 21

    为什么我的服务器PrintWriter.println()无法通过套接字发送其消息?

  22. 22

    Python套接字服务器/客户端编程

  23. 23

    C客户端/服务器套接字错误

  24. 24

    服务器/客户端套接字连接

  25. 25

    套接字编程-简单的客户端/服务器

  26. 26

    客户端js上的套接字服务器?

  27. 27

    Java客户端/服务器套接字问题

  28. 28

    Java TCP 客户端/服务器套接字

  29. 29

    如何使用Java中的套接字从服务器向特定客户端发送字符串消息?

热门标签

归档