【问题标题】:Sending an ArrayList<String> from the server side to the client side over TCP using socket?使用套接字通过 TCP 将 ArrayList<String> 从服务器端发送到客户端?
【发布时间】: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


【解决方案1】:

set 更改为add 可以解决问题

ArrayList<String> my =  new ArrayList<String>();
my.add("Bernard");
my.add("Grey");

ps。正如其他人所建议的那样,这不是一个好主意,但仅用于学习

【讨论】:

  • 发布此消息 1 小时后,我发现问题出在设置方法上,将其更改为您所说的程序可以 100% 正常工作。
  • 只是想知道,由于您为不存在的元素调用 set,您的服务器代码不应该抛出 IndexOutOfBoundsException 吗?
  • @KlitosKyriacou:不幸的是没有。它没有抛出任何异常,所以浪费了我 5 个小时的时间!
  • 那是因为您没有查看运行 ServerSide 时抛出的异常,因为 KlitosKyriacou 指出确实抛出了 IndexOutOfBoundsException 这就是我找到解决方案的方法
  • @shyam :好吧,现在我仔细检查程序,我意识到有一个 IndexOutBoundException 异常!我以前没有看到它。因为以前先提示客户端错误,而我没有看服务器端:(..无论如何感谢您的帮助。;)
猜你喜欢
  • 1970-01-01
  • 2012-12-01
  • 1970-01-01
  • 2019-08-08
  • 2013-04-01
  • 1970-01-01
  • 2018-11-11
  • 2014-12-01
  • 1970-01-01
相关资源
最近更新 更多