使用套接字通过TCP从服务器端向客户端发送一个包含字符串的ArrayList?

8
我将尽力帮助您翻译。以下是需要翻译的内容:

我正在尝试通过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();
        }   
    }   
}

只是一个建议:不要通过互联网发送您创建的对象。只发送原始类型。字符串、字节、整数、浮点数、双精度、字符,然后在两端转换为所需格式。 - OmniOwl
发送多个字符串,然后重新创建ArrayList,这样更好。 - Gianmarco
@ Gianmarco:这是个好主意,但我仍然想学习如何发送一个对象,而且这也是作业规定的一部分! - Bernard
@Bernard 一般的做法是不发送对象,而只发送原始数据。然后在接收端重新创建数据。 - OmniOwl
不要将对象写入套接字。将它们写入磁盘并读取回来。 - duffymo
显示剩余5条评论
1个回答

8

set 替换为 add 即可解决问题。

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

提示:正如其他人建议的那样,这不是一个好主意,仅供学习使用。


发布这条消息后1小时,我发现问题出在设置方法上。按照您所说的更改后,程序完美运行100%。 - Bernard
只是好奇,你的服务器代码不应该抛出IndexOutOfBoundsException异常吗?因为你正在为不存在的元素调用set方法。 - Klitos Kyriacou
@KlitosKyriacou:很遗憾,没有。它没有抛出任何异常,所以浪费了我五个小时的时间! - Bernard
1
这是因为你没有查看运行ServerSide时抛出的异常,正如KlitosKyriacou指出的那样,确实会抛出IndexOutOfBoundsException,这就是我找到解决方案的方法。 - shyam
@shyam:好的,现在我刚刚仔细检查了程序,发现出现了IndexOutBoundException异常!这是我之前没有注意到的。因为客户端错误通常会先提示,我没有看服务器端的错误 :(....不管怎样,感谢你的帮助。;) - Bernard

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接