java.net.SocketException:软件导致连接中止:套接字写入错误写入一些值后出现异常 [英] java.net.SocketException: Software caused connection abort: socket write error Exception after writing some values

查看:117
本文介绍了java.net.SocketException:软件导致连接中止:套接字写入错误写入一些值后出现异常的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个程序是由不在这里的人写的。现在的问题是程序在写完一些行之后抛出异常。



代码如下:



类:InclinometerCommunicator.java

I have a program which is written by the man who is not here. Now the problem is that the program throws the exception after writing some lines.

The code is as follows:

Class: InclinometerCommunicator.java

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.SocketException;

import javax.comm.SerialPort;
import javax.comm.UnsupportedCommOperationException;

import org.dellroad.jvser.TelnetSerialPort;
import org.apache.commons.net.telnet.TelnetClient;

public class InclinometerCommunicator {

private static final int DEFAULT_TCP_PORT = 10001;

private static final byte ADDRESS = (byte) 0xB1;
private static final byte ENQUIRY = 5;

private static final int PACKET_LENGTH = 11;

private TelnetSerialPort port; 

public static final int BAUD_RATE = 9600;
public static final int DATA_BITS = SerialPort.DATABITS_8;
public static final int PARITY_BITS = SerialPort.PARITY_NONE;
public static final int STOP_BITS = SerialPort.STOPBITS_1;
public static final int FLOW_CONTROL = SerialPort.FLOWCONTROL_NONE;

public InclinometerCommunicator(InetAddress host) throws UnsupportedCommOperationException, SocketException, IOException {
    this(host, DEFAULT_TCP_PORT);
}

public InclinometerCommunicator(InetAddress host, int tcpPort) throws UnsupportedCommOperationException, SocketException, IOException {
    port = new TelnetSerialPort();
    port.setSerialPortParams(BAUD_RATE, DATA_BITS, STOP_BITS, PARITY_BITS);
    port.setFlowControlMode(FLOW_CONTROL);
    port.setDTR(true);
    port.setRTS(false);
    port.getTelnetClient().connect(host, tcpPort);


}

public float getAngle() throws IOException, InterruptedException {
    sendFlowControl();
    Thread.sleep(100);
    sendEnquiry();
    Thread.sleep(200);
    receiveFlowControl();
    Thread.sleep(200);
    byte[] packet = readPacket();
    return parsePacket(packet);
    //return (float)1.5;
}

private void sendFlowControl() {
    port.setDTR(false);
    port.setRTS(true);
}

private void sendEnquiry() throws IOException {
    OutputStream out = port.getOutputStream();
    out.write(new byte[]{ADDRESS, ENQUIRY});
    out.flush();

}

private void receiveFlowControl() {
    port.setRTS(false);
    port.setDTR(true);
}

private byte[] readPacket() throws IOException {
    InputStream in = port.getInputStream();
    byte[] buf = new byte[PACKET_LENGTH];
    int totalRead = 0;
    int i = 0;

    while (totalRead < PACKET_LENGTH && i < 100) {
        totalRead += in.read(buf, totalRead, PACKET_LENGTH - totalRead);
        i++;
    }
    return buf;
}

private float parsePacket(byte[] packet) {
    //TODO add additional checking
    /*
    for(byte b: packet)
        System.out.print(b+" ");
    System.out.print("\n");
    */
    return (float) ((100*atoi(packet[1])) + (10*atoi(packet[2])) + atoi(packet[3]) + (.1*atoi(packet[5])) + (.01*atoi(packet[6])));
}

private int atoi(byte a) {
    return (byte) (a - '0');
  }
} 

And the other class is this:

QService.java


import java.net.InetAddress;

public class QService {

private InclinometerCommunicator communicator;

public static void main(String[] args) {
    QService rc = new QService();
    rc.run("10.168.217.106");   
}

public void run(String ip) 
{

    try 
    {
        communicator = new InclinometerCommunicator(InetAddress.getByName(ip), 9999);
    } 
    catch (Exception e) 
    {
        e.printStackTrace();
    }

    while (true) 
    {
        float angle ;

        try 
        {

                angle = communicator.getAngle();

                    System.out.println("Angle:" + angle);
                    Thread.sleep(1000);


        } 
        catch (Exception e) 
        {
            System.out.println("Exception is coming here"+e); // Here is the place where exception is coming.

        }

    }
 }
}
And the output is as follows:
Angle:-670.48
Angle:7118.36
Angle:367.57
Angle:7351.34
Angle:3094.42
Angle:-1599.83
Angle:527.55
Angle:7119.96
Angle:3857.8
Angle:209.53
java.net.SocketException: Software caused connection abort: socket write error
at java.net.SocketOutputStream.socketWrite0(Native Method)
at java.net.SocketOutputStream.socketWrite(Unknown Source)
at java.net.SocketOutputStream.write(Unknown Source)
at java.io.BufferedOutputStream.flushBuffer(Unknown Source)
at java.io.BufferedOutputStream.flush(Unknown Source)
at org.dellroad.jvser.telnet.TelnetClient._flushOutputStream(TelnetClient.java:81)
at org.dellroad.jvser.telnet.TelnetOutputStream.flush(TelnetOutputStream.java:146)
at InclinometerCommunicator.sendEnquiry(InclinometerCommunicator.java:67)
at InclinometerCommunicator.getAngle(InclinometerCommunicator.java:50)
at QService.run(QService.java:30)
at QService.main(QService.java:9)

推荐答案

这篇关于java.net.SocketException:软件导致连接中止:套接字写入错误写入一些值后出现异常的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆