我似乎在這裏錯過了一些微不足道的東西。我正在使用java爲覆盆子pi和桌面命令行編寫應用程序。我可以將數據發送到pi,並且它會響應,但桌面應用程序沒有收到回覆(這是我想要的)。沒有例外被拋出。套接字不發送數據
下面是代碼: 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);
}
}
}
我建議你編寫最簡單的套接字回聲程序,以確保其餘代碼與此問題無關。 –
免除了整個「解析」例程 - 讓pi回顯它看到的是套接字代碼是否正常工作。 – arcy
並將flush()回撥。 – arcy