2016-05-22 2 views
3

Я пытаюсь отправить объект 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());

+0

«Сброс соединения» обычно указывает на сетевую проблему. – Wyzard

+0

Спасибо за публикацию полного, компилируемого примера. Я взял ваш код и запустил его в Eclipse, и он работал без каких-либо исключений. Что-то о вашей сетевой конфигурации мешает. Вы пробовали переходить через код в вашем отладчике? –

+0

@Wyzard Обычно это указывает на проблему протокола приложения. – EJP

ответ

1

Я знаю, что мне нужно поставить класс, который имеет объект, мне нужно отправить в одном пакете

Нет, если вы имеете в виду «тот же пакет, как и сам», который является тривиальным.

имеют один и тот же serialVersionUID

Да.

и реализовать Serializable.

Да.

Я уже сделал это, но я все еще не могу отправить объект через сокет. Где я неправ?

Вы не закрыли гнездо должным образом в классе клиента, поэтому соединение было сброшено. Закройте выходной поток, а не просто промойте его.

+0

Сокет закрывается, когда клиент заканчивается. Код отлично работает в Eclipse, поэтому что-то не так. –

+0

@JimGarrison Нет. Это зависит от платформы. Windows сбросит соединение. Unixen правильно закроет гнездо. Проблема OP - это доказательство. Код «отлично работает» на * вашей * Eclipse * на * вашей * платформе. – EJP

+0

который, случается, будет win7 –

Смежные вопросы