#java #multithreading #sockets #object #serializable
#java #многопоточность #сокеты #объект #сериализуемый
Вопрос:
У меня есть следующий поток, который принимает входящие соединения на определенном порту:
public class ClientThread implements Runnable {
ServerSocket serverSocket;
Socket clientSocket;
int serverPort = 6500;
private String serverIpAddress = "127.0.0.1";
DataInputStream is;
ObjectOutputStream os=null;
Coordinate coord;
protected BlockingQueue queue = null;
public ClientThread(BlockingQueue queue) {
this.queue = queue;
}
public void run() {
try {
InetSocketAddress serverAddr = new InetSocketAddress(
serverIpAddress, serverPort);
serverSocket = new ServerSocket();
serverSocket.bind(serverAddr);
System.out.println("s-a creat");
} catch (UnknownHostException e) {
System.err.println("Don't know about host");
} catch (IOException e) {
System.err.println("Couldn't get I/O for the connection to host");
}
try {
clientSocket = serverSocket.accept();
System.out.println("S-a conectat clientul de monitorizare!");
os=new ObjectOutputStream(clientSocket.getOutputStream());
try{
while(true){
coord=(Coordinate)queue.take();
System.out.println(coord.getLat() coord.getLon() coord.getwId());
os.writeObject(coord);
os.flush();
}
} catch(Exception e) {
e.printStackTrace();
}
} catch (IOException e) {
System.out.println(e);
try {
clientSocket.close();
os.close();
}catch(Exception e1) {
e1.printStackTrace();
}
}
}
}
Объект, который я пытаюсь отправить, является экземпляром следующего класса:
public class Coordinate implements Serializable{
private final int lon;
private final int lat;
private final int workerId;
public Coordinate(int lat, int lon, int workerId) {
this.lat = lat;
this.lon = lon;
this.workerId=workerId;
}
public int getLon() {
return lon;
}
public int getLat() {
return lat;
}
public int getwId() {
return workerId;
}
}
Но когда я запускаю поток и принимаю подключение, я получаю следующую ошибку:
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.ObjectOutputStream$BlockDataOutputStream.drain(Unknown Source)
at java.io.ObjectOutputStream$BlockDataOutputStream.setBlockDataMode(Unknown
at java.io.ObjectOutputStream.writeNonProxyDesc(Unknown Source)
at java.io.ObjectOutputStream.writeClassDesc(Unknown Source)
at java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source)
at java.io.ObjectOutputStream.writeObject0(Unknown Source)
at java.io.ObjectOutputStream.writeFatalException(Unknown Source)
at java.io.ObjectOutputStream.writeObject(Unknown Source)
at servers.ClientThread.run(ClientThread.java:55)
at java.lang.Thread.run(Unknown Source)
У кого-нибудь есть идеи о том, что не так?
Эта ошибка java.net.SocketException: Программно вызванное прерывание соединения появляется при завершении одного из сокетов crashes….in моим случаем был end, который подключался к ClientThread (), и когда я пытался записать в буфер, появилась ошибка.
Комментарии:
1. Какая строка является строкой 55 из ClientThread.java ?
2. os.writeObject (coord); этот, но не беспокойтесь об этом, потому что моя проблема в другом… У меня есть геокодер на другой стороне сокета, который приводит к сбою моего соединения… Я попытаюсь это исправить, и если это не сработает, я отправлю другой вопрос.Спасибо
Ответ №1:
Вы не разместили код на стороне клиента, и трудно понять, что может сделать клиент, но я вижу одну часть кода, где может быть проблема. Это
while(true){
coord=(Coordinate)queue.take();
System.out.println(coord.getLat() coord.getLon() coord.getwId());
os.writeObject(coord);
os.flush();
}
Что это java.net.SocketException: Software caused connection abort: socket write error
означает? Это означает, что соединение было закрыто, НО вы пытались записать некоторые данные в сокет. Но я могу ошибаться.
Комментарии:
1. Ни в одном из вас нет ничего неправильного… соединение было закрыто с другой стороны;) ….. вы хороши в этом;)
2. Будет лучше анализировать весь код, а не только одну сторону, пожалуйста, в будущем публикуйте всю область кода 🙂 Приветствия 🙂