本文介绍了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:软件导致连接中止:套接字写入错误写入一些值后出现异常的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!