【发布时间】:2020-04-13 07:33:17
【问题描述】:
我正在尝试通过 TCP 将一个对象从服务器端套接字发送到客户端套接字。我找不到问题出在哪里。
这是我在客户端遇到的错误:
java.io.EOFException
at java.io.ObjectInputStream$PeekInputStream.readFully(ObjectInputStream.java:2280)
at java.io.ObjectInputStream$BlockDataInputStream.readShort(ObjectInputStream.java:2749)
at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:779)
at java.io.ObjectInputStream.<init>(ObjectInputStream.java:279)
at ClientSide.main(ClientSide.java:16)
服务器端代码:
import java.io.*;
import java.net.*;
import java.util.ArrayList;
public class ServerSide {
public static void main(String[] args) {
try
{
ServerSocket myServerSocket = new ServerSocket(9999);
Socket skt = myServerSocket.accept();
ArrayList<String> my = new ArrayList<String>();
my.set(0,"Bernard");
my.set(1, "Grey");
try
{
ObjectOutputStream objectOutput = new ObjectOutputStream(skt.getOutputStream());
objectOutput.writeObject(my);
}
catch (IOException e)
{
e.printStackTrace();
}
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
客户端代码:
import java.io.*;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.ArrayList;
public class ClientSide {
public static void main(String[] args)
{
try {
Socket socket = new Socket("10.1.1.2",9999);
ArrayList<String> titleList = new ArrayList<String>();
try {
ObjectInputStream objectInput = new ObjectInputStream(socket.getInputStream()); //Error Line!
try {
Object object = objectInput.readObject();
titleList = (ArrayList<String>) object;
System.out.println(titleList.get(1));
} catch (ClassNotFoundException e) {
System.out.println("The title list has not come from the server");
e.printStackTrace();
}
} catch (IOException e) {
System.out.println("The socket for reading the object has problem");
e.printStackTrace();
}
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
【问题讨论】:
-
只是一个建议:不要通过互联网发送您制作的对象。只发送原始类型。 String、Byte、Integer、Float、Double、Char,然后在任一侧转换为您想要的格式。
-
发送多个字符串然后重新创建arraylist,这样更好
-
@Gianmarco:这是个好主意,但我仍然想学习如何发送对象,这也是分配规范的一部分!
-
@Bernard 一般的方法是您不发送对象,而只是发送原始数据。然后在收到数据的那一端重新创建数据。
-
我建议解决问题。你能成功序列化和反序列化ArrayList吗?没有套接字,没有客户端;只需将其写入文件系统并读回即可。一旦你能做到这一点,然后担心套接字。
标签: java sockets tcp serversocket