Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.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 在Socket.getInputStream之前向SocketInputStream发送内容?_Java_Multithreading_Sockets - Fatal编程技术网

Java 在Socket.getInputStream之前向SocketInputStream发送内容?

Java 在Socket.getInputStream之前向SocketInputStream发送内容?,java,multithreading,sockets,Java,Multithreading,Sockets,我刚才遇到了一个奇怪的错误。我在玩可序列化对象,我在使用两个对象,通过套接字连接彼此通信。这两个应用程序是相同的(对等2对等),但有两个实例正在运行并尝试通信 问题似乎围绕着从套接字InputStream获取ObjectInputStream展开。我的错误发生在reader=newobjectinputsream(cliIn)上,我被抛出了一个SocketTimeoutException(这本身就很奇怪,我本以为在read()上,而不是在装饰我的流时。下面是我试图做的事情 Socket clie

我刚才遇到了一个奇怪的错误。我在玩可序列化对象,我在使用两个对象,通过套接字连接彼此通信。这两个应用程序是相同的(对等2对等),但有两个实例正在运行并尝试通信

问题似乎围绕着从套接字
InputStream
获取
ObjectInputStream
展开。我的错误发生在
reader=newobjectinputsream(cliIn)
上,我被抛出了一个SocketTimeoutException(这本身就很奇怪,我本以为在
read()
上,而不是在装饰我的流时。下面是我试图做的事情

Socket clientSocket;
clientSocket = new Socket(InetAddress.getByName(aHostIP), aPort);
clientSocket.setSoTimeout(3000);

InputStream cliIn = clientSocket.getInputStream();
ObjectInputStream reader = null;
reader = new ObjectInputStream(cliIn); // <--- Error here
ObjectOutputStream writer;
writer = new ObjectOutputStream(new BufferedOutputStream(
     clientSocket.getOutputStream()
));

writer.writeObject(new Request(aPort));
writer.flush();
另一方(响应方)如下所示:

ObjectInputStream in = new ObjectInputStream(aConnection.getInputStream());
Object req = in.readObject();
SysIO.print("FROM OBJECT! : " + req.toString());
SysIO.print("FROM OBJECT! Port: " + ((Request) req).getPort());

Request res = new Request(15);

ObjectOutputStream out = new ObjectOutputStream(
      new BufferedOutputStream(aConnection.getOutputStream()));
out.writeObject(res);
out.flush();
它现在可以工作了,但我很想知道这个问题是什么,以供将来参考。我可以看出,可能很难准确地说出来,但可能您有一些进一步调查的指针,并发性问题,我使用的套接字或缓冲区是否错了

(为了更清楚,我省略了一些错误处理。)

答案如下:

创建从指定的InputStream读取的ObjectInputStream。从流中读取序列化流标头并进行验证。此构造函数将阻止,直到相应的ObjectOutputStream写入并刷新标头。

如果安装了安全管理器,则当重写ObjectInputStream.readFields或ObjectInputStream.readUnshared方法的子类的构造函数直接或间接调用时,此构造函数将检查“EnableSubassImplementation”SerializablePermission

参数:

中的
-要读取的输入流

抛出:

StreamCorruptedException
-如果流标题不正确

IOException
-如果在读取流头时发生I/O错误

SecurityException
-如果不受信任的子类非法重写安全敏感方法

NullPointerException
-如果
中的
为空

在构造过程中,流试图从套接字读取序列化标头,但套接字读取超时,因为另一方尚未发送任何序列化对象。

答案在:

创建从指定的InputStream读取的ObjectInputStream。从流中读取序列化流标头并进行验证。此构造函数将阻止,直到相应的ObjectOutputStream写入并刷新标头。

如果安装了安全管理器,则当重写ObjectInputStream.readFields或ObjectInputStream.readUnshared方法的子类的构造函数直接或间接调用时,此构造函数将检查“EnableSubassImplementation”SerializablePermission

参数:

中的
-要读取的输入流

抛出:

StreamCorruptedException
-如果流标题不正确

IOException
-如果在读取流头时发生I/O错误

SecurityException
-如果不受信任的子类非法重写安全敏感方法

NullPointerException
-如果
中的
为空


在构造过程中,流试图从套接字读取序列化头,但套接字读取超时,因为另一方尚未发送任何序列化对象。

非常感谢您的回答。因此,正是通过此读取来获取抛出
SocketTimeoutException
的头?据我所知,没有c的方法100%确定地检查缓冲区是否为空。这样的操作是必要的还是足够让我将输入和输出流的打开与上述服务器匹配?(如建议的那样?)是的,套接字超时是由于读取流标头造成的,因为当时没有可读取的标头。在服务器发送其
ObjectOutputStream
标头之前,您的客户端无法创建
ObjectOutputStream
标头,直到您的客户端首先发送其
ObjectOutputStream
标头之后才会发生。非常感谢您的回答。因此,这篇文章是为了得到抛出
SocketTimeoutException
的头部?据我所知,没有办法100%确定地检查缓冲区是否为空。这样的操作是必要的,还是足够让我将输入和输出流的开头与上述服务器匹配?(如建议的那样?)是的,套接字超时是由于读取流标头造成的,因为当时没有可读取的标头。在服务器发送其
ObjectOutputStream
标头之前,您的客户端无法创建
ObjectOutputStream
标头,直到您的客户端首先发送其
ObjectOutputStream
标头之后才会发生。
ObjectInputStream in = new ObjectInputStream(aConnection.getInputStream());
Object req = in.readObject();
SysIO.print("FROM OBJECT! : " + req.toString());
SysIO.print("FROM OBJECT! Port: " + ((Request) req).getPort());

Request res = new Request(15);

ObjectOutputStream out = new ObjectOutputStream(
      new BufferedOutputStream(aConnection.getOutputStream()));
out.writeObject(res);
out.flush();
public ObjectInputStream(InputStream in)
                  throws IOException