Я пытаюсь отправить объект custome через сокет в java. Я знаю, что мне нужно поставить класс, у которого есть объект, который мне нужно отправить в том же пакете, иметь тот же serialVersionUID и реализовать Serializable. Я уже сделал это, но я все еще не могу отправить объект через сокет. Где я ошибся?
Вот код клиента:
пользователь класса в клиентеОтправить объект через сокет
package data;
import java.io.Serializable;
public class User implements Serializable {
/**
*
*/
public static final long serialVersionUID = 1L;
private String username = null;
private String hashedPassword = null;
private Integer code = null;
private String from = null;
private String to = null;
private Object data = null;
public User() {
}
public User(Integer code) {
this.code = code;
}
public User(Integer code, Object data) {
this.code = code;
this.data = data;
}
public User(String username, String hashedPassword, Integer code, String from, String to, Object data) {
this.username = username;
this.hashedPassword = hashedPassword;
this.code = code;
this.from = from;
this.to = to;
this.data = data;
}
public Integer getCode() {
return code;
}
// other getters and setters
}
Код для отправки объекта класса пользователя:
package tankclient;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;
import data.*;
public class Main {
public static void main(String args[]) {
Socket socket = null;
ObjectOutputStream oos = null;
ObjectInputStream ois = null;
boolean isConnected = false;
String ipServer = "localhost";
int portServer = 4444;
try {
// Print("connecting to server...");
socket = new Socket(ipServer, portServer);
isConnected = true;
oos = new ObjectOutputStream(socket.getOutputStream());
ois = new ObjectInputStream(socket.getInputStream());
oos.writeObject(new User());
// Print("connect server success");
} catch (Exception ex) {
isConnected = false;
ex.printStackTrace();
}
// DataTransfer transfer = new DataTransfer();
// //transfer.SendDataRequest(new DataRequest(3));
// transfer.TestSend();
}
}
Вот код сервера:
Код класса пользователя: Ровно то же, что и пользователь клиента (я копирую с клиента и вставляю его на сервер)
Код сервера для получения пользовательского объекта:
package tankserver;
import data.*;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class Main {
public static void main(String args[]) {
ServerSocket serverSocket = null;
Socket socket = null;
ObjectOutputStream oos = null;
ObjectInputStream ois = null;
boolean isConnected = false;
int portServer = 4444;
try {
System.out.println("waiting for client to connect ...");
serverSocket = new ServerSocket(portServer);
socket = serverSocket.accept();
oos = new ObjectOutputStream(socket.getOutputStream());
ois = new ObjectInputStream(socket.getInputStream());
isConnected = true;
System.out.println("connected");
User obj = (User) ois.readObject();
System.out.println(obj.toString());
} catch (Exception ex) {
isConnected = false;
ex.printStackTrace();
}
//DataTransfer transfer = new DataTransfer();
//transfer.GetDataRequest();
//transfer.TestRecieve();
}
}
здесь StackTrace я Получать (на стороне сервера):
java.net.SocketException: сброс соединения по java.net.SocketInputStream.read (SocketInputStream.java:209) при Java .net.SocketInputStream.read (SocketInputStream.java:141) в java.net.SocketInputStream.read (SocketInputStream.java:223) в java.io.ObjectInputStream $ PeekInputStream.peek (ObjectInputStream.java:2296) в java.io.ObjectInputStream $ BlockDataInputStream.readBlockHeader (ObjectInputStream.java:2476) в java.io.ObjectInputStream $ BlockDataInputStream.refill (ObjectInputStream.java:2546) в java.io.ObjectInputStream $ BlockDataInputStream.skipBlockData (ObjectInputStream.java:2448) в java.io.ObjectInputStream.skipCustomData (ObjectInputStream .java: 1944) на java.io.ObjectInputStream.readNonProxyDesc (ObjectInputStream.java:1621) на java.io.ObjectInputStream.readClassDesc (ObjectInputStream.java:1518) на java.io.ObjectInputStream.readOrdinaryObject (ObjectInputStream.java:1774) at java.io.ObjectInputStream.readObject0 (ObjectInputStream.java:1351) at java.io.ObjectInputSt ream.readObject (ObjectInputStream.java:371) на tankserver.Main.main (Main.java:31) BUILD УСПЕШНОГО (общее время: 8 секунд)
, когда я пытаюсь отлаживать затем следовать ситуации произойдет: когда я поставил точку останова в клиенте (запускал сервер normaly) и выполнял шаг за шагом, тогда он работает, но когда я добавляю точку останова на сервере (клиент запускает normaly) и запускаю шаг за шагом, он генерирует исключение в строке 28 ois = new ObjectInputStream (socket.getInputStream());
«Сброс соединения» обычно указывает на сетевую проблему. – Wyzard
Спасибо за публикацию полного, компилируемого примера. Я взял ваш код и запустил его в Eclipse, и он работал без каких-либо исключений. Что-то о вашей сетевой конфигурации мешает. Вы пробовали переходить через код в вашем отладчике? –
@Wyzard Обычно это указывает на проблему протокола приложения. – EJP