Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 发送ArrayList<;字符串>;使用套接字通过TCP从服务器端到客户端?_Java_Sockets_Tcp_Serversocket - Fatal编程技术网

Java 发送ArrayList<;字符串>;使用套接字通过TCP从服务器端到客户端?

Java 发送ArrayList<;字符串>;使用套接字通过TCP从服务器端到客户端?,java,sockets,tcp,serversocket,Java,Sockets,Tcp,Serversocket,我正在尝试通过TCP将一个对象从服务器端套接字发送到客户端套接字。我找不出问题出在哪里 以下是我在客户端遇到的错误: java.io.EOFException at java.io.ObjectInputStream$PeekInputStream.readFully(ObjectInputStream.java:2280) at java.io.ObjectInputStream$BlockDataInputStream.readShort(ObjectInputStream.

我正在尝试通过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)
java.io.EOFException
在java.io.ObjectInputStream$PeekInputStream.readFully处(ObjectInputStream.java:2280)
位于java.io.ObjectInputStream$BlockDataInputStream.readShort(ObjectInputStream.java:2749)
位于java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:779)
位于java.io.ObjectInputStream。(ObjectInputStream.java:279)
位于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.*;
导入java.net。*;
导入java.util.ArrayList;
公共类服务器端{
公共静态void main(字符串[]args){
尝试
{
ServerSocket myServerSocket=新的ServerSocket(9999);
Socket skt=myServerSocket.accept();
ArrayList my=新的ArrayList();
my.set(0,“Bernard”);
my.set(1,“灰色”);
尝试
{
ObjectOutputStream objectOutput=新的ObjectOutputStream(skt.getOutputStream());
objectOutput.writeObject(我的);
} 
捕获(IOE异常)
{
e、 printStackTrace();
} 
}
捕获(IOE异常)
{
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();
        }   
    }   
}
import java.io.*;
导入java.net.InetAddress;
导入java.net.Socket;
导入java.net.UnknownHostException;
导入java.util.ArrayList;
公共类客户端{
公共静态void main(字符串[]args)
{
试试{
插座=新插座(“10.1.1.2”,9999);
ArrayList titleList=新的ArrayList();
试一试{
ObjectInputStream objectInput=新ObjectInputStream(socket.getInputStream());//错误行!
试一试{
Object Object=objectInput.readObject();
titleList=(ArrayList)对象;
System.out.println(titleList.get(1));
}catch(classnotfounde异常){
System.out.println(“标题列表未来自服务器”);
e、 printStackTrace();
}
}捕获(IOE异常){
System.out.println(“读取对象的套接字有问题”);
e、 printStackTrace();
}           
}捕获(未知后异常e){
e、 printStackTrace();
}捕获(IOE异常){
e、 printStackTrace();
}   
}   
}

设置
更改为
添加
会起作用

ArrayList<String> my =  new ArrayList<String>();
my.add("Bernard");
my.add("Grey");
ArrayList my=new ArrayList();
my.add(“Bernard”);
my.add(“灰色”);

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

只是一个建议:不要通过互联网发送你制作的物品。仅发送基本类型。String、Byte、Integer、Float、Double、Char,然后在任意一侧转换为所需的格式。发送多个字符串,然后重新创建arraylist,这样更好@Gianmarco:这是个好主意,但我仍然想学习如何发送对象,这也是赋值规范的一部分@Bernard一般的方法是不发送对象,只发送原始数据。然后在接收到数据的最后重新创建数据。我建议解决这个问题。能否成功序列化和反序列化ArrayList?没有套接字,没有客户端;只需将其写入文件系统并读回即可。一旦你能做到这一点,那么就要担心套接字了。发布这条消息1小时后,我发现问题是在将其更改为你所说的方法后设置的。该程序运行100%良好。只是想知道,自从您为不存在的元素调用set以来,您的服务器代码不应该抛出IndexOutOfBoundsException吗?@KlitosKyriacou:不幸的是,没有。它没有抛出任何异常,所以浪费了我5个小时的时间!这是因为当您运行
ServerSide
时,您没有看到抛出的异常,KlitosKyriacou指出
IndexOutOfBoundsException
确实被抛出,这就是我发现异常的原因solution@shyam:嗯,现在我只是仔细检查了程序,我意识到有一个IndexOutBoundException!我以前没见过。因为客户端错误通常会首先出现提示,而我没有查看服务器端:(……无论如何,谢谢您的帮助。)