套接字DataOutputStream似乎只能正确发送第一个字节

时间:2017-06-21 14:46:07

标签: java sockets dataoutputstream

我必须控制一个用C语言制作的硬件,它接收无符号字节用于控制。 为了调试这些命令,我​​创建了一些JavaFX接口。

我遇到了麻烦,因为硬件只响应我发送的第一个命令。要打开例如我必须启动应用程序,发送de ON命令并重新启动以再次发送它。如果我没有重新启动应用程序,则设备不会响应其他命令。

package interfaceautomacaojavafx;

import java.lang.Integer;
import java.io.*;
import java.net.*;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Label;
import javafx.scene.control.Button;
import javafx.scene.control.TextField;
import javafx.scene.control.TextArea;
import javafx.scene.shape.Circle;
import javafx.scene.paint.Color;
import java.math.BigInteger;
import java.net.ConnectException;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.util.Arrays;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.ResourceBundle;


public class FXMLDocumentController implements Initializable {

private Socket socket;            
private DataOutputStream dataOut;
private DataInputStream dataIn;
private String commandStr;
private char command[];
private String hostname;
private int portNumber;

@FXML
private Label lblIP, lblIPMask, lblGateway, lblPort, lblConnectionStatus,
        lblPingStatus;
@FXML
private Button btnPing, btnSend;

@FXML
private TextField txtIP0, txtIP1, txtIP2, txtIP3,
        txtIPMask0, txtIPMask1, txtIPMask2, txtIPMask3,
        txtGateway0, txtGateway1, txtGateway2, txtGateway3,
        txtPort, txtSendCommand ;

@FXML
private TextArea txaCommandHistory;

@FXML
private Circle circleConnection;



@Override
public void initialize(URL url, ResourceBundle rb) {
    System.out.println("App initialized");
}  

@FXML
private void buttonPingHalndler( ActionEvent event ){
    System.out.println("Button Ping clicked!");
    lblPingStatus.setText("Btn. Ping Clicked");
}

@FXML
private void buttonClearTxaHistoryHandler( ActionEvent event ){
    txaCommandHistory.clear();
}

@FXML
private void buttonSendCommandhandler( ActionEvent event ) {

    btnSend.setDisable(true);
    System.out.println("=== Button SendCommand clicked! ===");
    lblConnectionStatus.setText("Conexão iniciada...");
    circleConnection.setFill(Color.DODGERBLUE);

    hostname = txtIP0.getText();
    System.out.println("Hostname: " + hostname);

    portNumber = Integer.parseInt(txtPort.getText());
    System.out.println("Port: " + portNumber);


    byte buffer[]  = { 0x02, 0x0C, 0x06, 0x01, (0x81 - 256), 
        (0x81 - 256), (0x80 - 256), (0x80 - 256), (0x80 - 256), (0x80 -256), (0x80 - 256), (0x80 - 256) };

    System.out.println("buffer: " + Arrays.toString(buffer));
    lblConnectionStatus.setText("Tentanto conexão...");

    try {
        socket = new Socket( hostname, portNumber );            
        dataOut = new DataOutputStream(socket.getOutputStream());

        System.out.println("Objetos de conexão instanciados (Conexão aceita).");

        dataOut.write(buffer);

        txaCommandHistory.appendText( Arrays.toString( buffer ) );
        txaCommandHistory.appendText("\n");
        lblConnectionStatus.setText("Comando enviado.");
        circleConnection.setFill(Color.LIGHTGREEN);


        dataIn = new DataInputStream(socket.getInputStream());

        while( dataIn.available() > 0 ) {
            txaCommandHistory.appendText( dataIn.readUTF() );
            txaCommandHistory.appendText("\n");
         }

        txaCommandHistory.setVisible(true);
        txaCommandHistory.setDisable(false);

        dataIn.close();
        dataOut.close();
        socket.close();            

    } catch ( ConnectException ce ) {
        lblConnectionStatus.setText("Conexão rejeitada...");
        circleConnection.setFill(Color.LIGHTGRAY);
        ce.printStackTrace();

    } catch ( EOFException eofe ) {
        lblConnectionStatus.setText("Erro de conexão.");
        eofe.printStackTrace();
        System.out.println("EndOfFile Exception ocurred.");            

    } catch( UnknownHostException uhe ) {
        lblConnectionStatus.setText("Host desconhecido.");
        System.out.println("Host unknown: " + uhe.getMessage());

    } catch ( IOException ioe ) { 
        lblConnectionStatus.setText("Erro de conexão...");
        System.out.println("---- IOException ocurred. ----");
        ioe.printStackTrace();
        Logger.getLogger(Client.class.getName()).log(Level.SEVERE, null, ioe);

    } finally { 
        System.out.println("--- Bloco Finally: ---");
        lblConnectionStatus.setText("Conexão Encerrada...");
        btnSend.setDisable(false);
        circleConnection.setFill(Color.LIGHTGRAY);
    }
}

@FXML
private void buttonSendOnCommandHalndler( ActionEvent event ){

    btnSend.setDisable(true);
    System.out.println("=== Button SendOnCommand clicked! ===");
    lblConnectionStatus.setText("Conexão iniciada...");
    circleConnection.setFill(Color.DODGERBLUE);

    hostname = txtIP0.getText();
    System.out.println("Hostname: " + hostname);

    portNumber = Integer.parseInt(txtPort.getText());
    System.out.println("Port: " + portNumber);


    byte buffer[]  = { 0x02, 0x04, 0x01, 0x01 };        

    System.out.println("buffer: " + Arrays.toString(buffer));

    try {
        socket = new Socket( hostname, portNumber );            
        dataOut = new DataOutputStream(socket.getOutputStream());
        dataIn = new DataInputStream(socket.getInputStream());

        dataOut.flush();
        dataOut.write(buffer);
        dataOut.flush();

        lblConnectionStatus.setText("Comando enviado.");
        circleConnection.setFill(Color.LIGHTGREEN);
        String txaMessage = Arrays.toString(buffer);

        txaCommandHistory.setVisible(true);
        txaCommandHistory.setDisable(false);
        txaCommandHistory.appendText( txaMessage );
        txaCommandHistory.appendText("\n");

        dataIn.close();
        dataOut.close();
        socket.close();            

    } catch ( ConnectException ce ) {
        lblConnectionStatus.setText("Conexão rejeitada...");
        circleConnection.setFill(Color.LIGHTGRAY);
        ce.printStackTrace();

    } catch ( EOFException eofe ) {
        lblConnectionStatus.setText("Erro de conexão.");
        eofe.printStackTrace();
        System.out.println("EndOfFile Exception ocurred.");            

    } catch( UnknownHostException uhe ) {
        lblConnectionStatus.setText("Host desconhecido.");
        System.out.println("Host unknown: " + uhe.getMessage());

    } catch ( IOException ioe ) { 
        lblConnectionStatus.setText("Erro de conexão...");
        System.out.println("---- IOException ocurred. ----");
        ioe.printStackTrace();
        Logger.getLogger(Client.class.getName()).log(Level.SEVERE, null, ioe);

    } finally { 
        System.out.println("--- Bloco Finally: ---");
        lblConnectionStatus.setText("Conexão Encerrada...");
        btnSend.setDisable(false);
        circleConnection.setFill(Color.LIGHTGRAY);
    }
}

@FXML
private void buttonSendOffCommandHalndler( ActionEvent event ){

    btnSend.setDisable(true);
    System.out.println("=== Button SendOffCommand clicked! ===");
    lblConnectionStatus.setText("Conexão iniciada...");
    circleConnection.setFill(Color.DODGERBLUE);

    hostname = txtIP0.getText();
    System.out.println("Hostname: " + hostname);

    portNumber = Integer.parseInt(txtPort.getText());
    System.out.println("Port: " + portNumber);


    byte buffer[]  = { 0x02, 0x04, 0x01, 0x00 };        

    System.out.println("buffer: " + Arrays.toString(buffer));

    try {
        socket = new Socket( hostname, portNumber );            
        dataOut = new DataOutputStream(socket.getOutputStream());
        dataIn = new DataInputStream(socket.getInputStream());

        dataOut.write(buffer);
        dataOut.flush();

        lblConnectionStatus.setText("Comando enviado.");
        circleConnection.setFill(Color.LIGHTGREEN);
        String txaMessage = Arrays.toString(buffer);

        txaCommandHistory.setVisible(true);
        txaCommandHistory.setDisable(false);
        txaCommandHistory.appendText( txaMessage );
        txaCommandHistory.appendText("\n");



    } catch ( ConnectException ce ) {
        lblConnectionStatus.setText("Conexão rejeitada...");
        circleConnection.setFill(Color.LIGHTGRAY);
        ce.printStackTrace();

    } catch ( EOFException eofe ) {
        lblConnectionStatus.setText("Erro de conexão.");
        eofe.printStackTrace();
        System.out.println("EndOfFile Exception ocurred.");            

    } catch( UnknownHostException uhe ) {
        lblConnectionStatus.setText("Host desconhecido.");
        System.out.println("Host unknown: " + uhe.getMessage());

    } catch ( IOException ioe ) { 
        lblConnectionStatus.setText("Erro de conexão...");
        System.out.println("---- IOException ocurred. ----");
        ioe.printStackTrace();
        Logger.getLogger(Client.class.getName()).log(Level.SEVERE, null, ioe);

    } finally { 

        try {
            dataIn.close();
            dataOut.close();
            socket.close(); 
        } catch ( IOException ioe){
            ioe.printStackTrace();
        }

        System.out.println("--- Bloco Finally: ---");
        lblConnectionStatus.setText("Conexão Encerrada...");
        btnSend.setDisable(false);
        circleConnection.setFill(Color.LIGHTGRAY);
    }
 }
}

接口: Interface JavaFX

其他信息:

- 当我点击按钮时,我看到在Wireshark中流动的通信。

- 我有三个按钮,所以我在其中一个按钮中添加了.flush()方法,但没有区别。

- 我将.close()方法改为最终阻塞其中一个,但它也没有区别。

Wireshark命令:Wireshark command

1 个答案:

答案 0 :(得分:0)

在分析了Wireshark数据之后,我将关闭这个问题,因为似乎Java应用程序正在正确地发送命令。