java - 套接字不发送数据

标签 java sockets

我似乎在这里遗漏了一些微不足道的东西。我正在使用 java 为树莓派编写一个应用程序,并使用一个桌面命令行来配合它。我可以向 pi 发送数据,它会响应,但桌面应用程序没有收到回复(这就是我想要的)。没有抛出异常。

代码如下: 圆周率代​​码:

package raspberrypiapp;

import java.awt.Color;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketException;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author Michael
 */
public class RemoteControlManager implements Runnable {

    ServerSocket s;
    Socket socket;
    DataOutputStream dout;
    DataInputStream din;
    boolean connected = false;
    RaspberryPiApp app;

    public RemoteControlManager(RaspberryPiApp app) {
        try {
            s = new ServerSocket(12345);
        } catch (IOException ex) {
            Logger.getLogger(RemoteControlManager.class.getName()).log(Level.SEVERE, null, ex);
        }

        this.app = app;

        Thread t = new Thread(this);
        t.start();
    }

    public boolean connected() {
        return socket == null ? connected : socket.isConnected();
    }

    @Override
    public void run() {
        while (true) {
            try {
                if (!connected) {
                    socket = s.accept();
                    dout = new DataOutputStream(socket.getOutputStream());
                    din = new DataInputStream(socket.getInputStream());
                    connected = true;
                } else {
//                    dout.writeUTF("heartbeat");
                    String message = din.readUTF();
//                    System.out.println(parse(message));
                    dout.writeUTF(parse(message));
//                    dout.flush();
                }
            } catch (SocketException ex) {
                try {
                    socket.close();
                    din.close();
                    dout.close();
                    socket = null;
                    connected = false;
                } catch (IOException ex1) {
                    Logger.getLogger(RemoteControlManager.class.getName()).log(Level.SEVERE, null, ex1);
                }
            } catch (IOException ex) {
                Logger.getLogger(RemoteControlManager.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }

    private String parse(String message) {
        message = message.toLowerCase();
        String[] args = message.split(" ");
        switch (args[0]) {
            case "color":
                if (args.length > 1) {
                    switch (args[1]) {
                        case "red":
                            app.color = Color.RED;
                            return "1a";
                        case "green":
                            app.color = Color.GREEN;
                            return "1a";
                        case "blue":
                            app.color = Color.BLUE;
                            return "1a";
                        default:
                            return "!Do not recognize the color: \"" + args[1] + "\".";
                    }
                } else {
                    return "!You must include a color.  Syntax: color [COLOR]";
                }
            default:
                return "!That command is not recognized.  Please check spelling and syntax.  Type \"help\" for help.";
        }
    }
}

桌面代码(缩写):

    public MainGUI() {
        //<editor-fold defaultstate="collapsed" desc=" Center Window to Screen ">
        GraphicsEnvironment g = GraphicsEnvironment.getLocalGraphicsEnvironment();
        GraphicsDevice[] devices = g.getScreenDevices();

        int width = devices[0].getDisplayMode().getWidth();
        int height = devices[0].getDisplayMode().getHeight();

        int w = this.getSize().width;
        int h = this.getSize().height;
        int x = (width - w) / 2;
        int y = (height - h) / 2;
        this.setLocation(x, y);
        //</editor-fold>
        initComponents();
        try {
            socket = new Socket(ip, 12345);
            din = new DataInputStream(socket.getInputStream());
            dout = new DataOutputStream(socket.getOutputStream());
        } catch (UnknownHostException ex) {
            Logger.getLogger(MainGUI.class.getName()).log(Level.SEVERE, null, ex);
        } catch (ConnectException ex) {
            JOptionPane.showMessageDialog(this, "Could not find/connect to a Raspberry Pi at the address: \"" + ip + "\".", "Connection Error", JOptionPane.ERROR_MESSAGE);
            System.exit(0);
        } catch (IOException ex) {
            Logger.getLogger(MainGUI.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

private void jTextField1ActionPerformed(java.awt.event.ActionEvent evt) {                                            
        try {
            dout.writeUTF(jTextField1.getText());
        } catch (IOException ex) {
            Logger.getLogger(MainGUI.class.getName()).log(Level.SEVERE, null, ex);
        }
        jTextField1.setText("");
    } 

@Override
    public void run() {
        while (true) {
            String reply = null;
            try {
                reply = din.readUTF();
                System.out.println(reply);
            } catch (IOException ex) {
                Logger.getLogger(MainGUI.class.getName()).log(Level.SEVERE, null, ex);
            }

            if (reply == null) {
                JOptionPane.showMessageDialog(this, "No reply was recieved from the Raspberry Pi.", "Connection Error", JOptionPane.ERROR_MESSAGE);
            } else if ("heartbeat".equals(reply)){
                // Do nothing.
            } else if ("!".equals(reply.substring(0, 1))) {
                JOptionPane.showMessageDialog(this, reply.substring(1), "Information", JOptionPane.WARNING_MESSAGE);
            }
        }
    }

最佳答案

您应该在写入数据后添加一个flush()调用。套接字缓冲数据。

作为处理阻塞套接字流时的一般规则,每个流需要一个线程。尝试使用单个线程来管理输入和输出流是危险的。

关于java - 套接字不发送数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19992492/

相关文章:

java - Log4j 挂起我的应用程序几分钟

java - 使用重定向生成代码 IntelliJ Idea 15

java - 在多个线程上调度多个任务

python - 是否有更新的 Python 模块可用于与 Minecraft 服务器通信?

sockets - 当我请求的数据多于立即可用的数据时, `recv` 会阻塞 TCP 套接字吗?

java - 如何在 Android 中隐藏特定列

java - 在整个应用程序中使用相同的数据还是复制它?

java - 使用 Http.Core 与 Http.Client 4 对话获取 ConnectionClosedException?

Android - AsyncTask 套接字写入超时

javascript - 更新现有列表而不重新加载整个页面