簡體   English   中英

套接字DataOutputStream似乎只能正確發送第一個字節

[英]Socket DataOutputStream seems only send the first byte correctly

我必須控制用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);
    }
 }
}

接口: 接口JavaFX

附加信息:

-當我單擊按鈕時,我看到Wireshark中正在進行通信。

-我有三個按鈕,所以我在其中一個中添加了.flush()方法,但沒有區別。

-我更改了.close()方法以最終阻止其中一種方法,但也沒有任何區別。

Wireshark命令: Wireshark命令

在分析Wireshark數據之后,我將關閉此問題,因為似乎Java應用程序正確發送了命令。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM