标签: objectinputstream

Java套接字编程

我正在使用java套接字构建一个简单的客户端/服务器应用程序并尝试使用ObjectOutputStream等.

当我讨论通过套接字传输对象时,我一直在这个URL http://java.sun.com/developer/technicalArticles/ALT/sockets开始关注教程.

请参阅我的客户端代码http://pastebin.com/m37e4c577然而,这似乎不起作用,我无法弄清楚什么是不起作用.底部注释掉的代码直接从教程中复制出来 - 当我只使用它而不是创建客户端对象时,这就有效.

任何人都可以看到我做错了吗?

java sockets network-programming objectinputstream

3
推荐指数
2
解决办法
1万
查看次数

编写和读取servlet时的java.io.EOFException

我在applet端有以下代码:

URL servlet = new URL(appletCodeBase, "FormsServlet?form=requestRoom");
URLConnection con = servlet.openConnection();

con.setDoOutput(true);
con.setDoInput(true);
con.setUseCaches(false);
con.setRequestProperty("Content-Type", "application/octet-stream");

ObjectOutputStream out = new ObjectOutputStream(con.getOutputStream());
out.writeObject(user);//user is an object of a serializable class
out.flush();
out.close();

ObjectInputStream in = new ObjectInputStream(con.getInputStream());
status = (String)in.readObject();
in.close();
if("success".equals("status")) {
    JOptionPane.showMessageDialog(rootPane, "Request submitted successfully.");
} else {
    JOptionPane.showMessageDialog(rootPane, "ERROR! Request cannot be made at this 
    time");
}
Run Code Online (Sandbox Code Playgroud)

在servlet方面,我收到如下代码:

    form = request.getParameter("form");
    if("requestRoom".equals(form)) {
        String fullName, eID, reason;
        UserRequestingRoom user;

        try {
            in = new ObjectInputStream(request.getInputStream());
            user = (UserRequestingRoom)in.readObject(); …
Run Code Online (Sandbox Code Playgroud)

java objectoutputstream objectinputstream eofexception

3
推荐指数
1
解决办法
4万
查看次数

发送更改的hashmap,但使用ObjectOutputStream和ObjectInputStream获取相同的hashmap

public static void main(String[] args) throws Exception {
    Socket socket = new Socket("127.0.0.1", 2345);

    ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
    Map<Integer, Integer> testMap = new HashMap<Integer, Integer>();

    testMap.put(1,1);
    oos.writeObject(testMap);
    oos.flush();

    testMap.put(2,2);
    oos.writeObject(testMap);
    oos.flush();

    oos.close();
}


public static void main(String[] args) throws Exception {
    ServerSocket ss = new ServerSocket(2345);
    Socket s = ss.accept();
    ObjectInputStream ois = new ObjectInputStream(s.getInputStream());

    System.out.println((HashMap<Integer, Integer>) ois.readObject());
    System.out.println((HashMap<Integer, Integer>) ois.readObject());

    ois.close;
}
Run Code Online (Sandbox Code Playgroud)

上面的代码来自两个文件.运行它们时,控制台会打印相同的结果:

{1=1}
{1=1}
Run Code Online (Sandbox Code Playgroud)

怎么会发生这种情况?

java hashmap objectoutputstream objectinputstream

3
推荐指数
1
解决办法
690
查看次数

ObjectInputStream readObject():ClassNotFoundException

在客户端和服务器类中,我有一个完全相同的内部类,称为Data.使用以下命令从服务器发送此Data对象:

ObjectOutputStream output= new ObjectOutputStream(socket.getOutputStream());
output.writeObject(d);
Run Code Online (Sandbox Code Playgroud)

(其中d是Data对象)

在客户端接收此对象并强制转换为Data对象:

ObjectInputStream input = new ObjectInputStream(socket.getInputStream());
Object receiveObject = input.readObject();
if (receiveObject instanceof Data){
    Data receiveData = (Data) receiveObject;
    // some code here... 
}
Run Code Online (Sandbox Code Playgroud)

我正在接受java.lang.ClassNotFoundException: TCPServer$Data这条线Object receiveObject = input.readObject();

我的猜测是它试图在服务器端寻找Data类而无法找到它,但我不确定......我该如何解决这个问题?

java tcp objectoutputstream objectinputstream classnotfoundexception

3
推荐指数
1
解决办法
5308
查看次数

从ObjectInputStream中读取不同的byte [],而不是写入ObjectOutputStream

我对java有一个奇怪的问题.我想在ObjectOutputStream中写一个byte []并从那里写到一个新文件.该字节数组表示从磁盘读取的另一个文件.

之后,在写入新创建的文件后,我想从该文件中读取.但是现在从ObjectInputStream读取的byte []与写入的不同.

这就是我的问题:为什么这个字节[]不同?

为了清楚说明并让每个人都检查,我写了一个简短的程序,它将准确地表明我的意思:

import java.io.*;
import java.net.URL;
import java.nio.channels.Channels;
import java.nio.channels.ReadableByteChannel;
import java.security.MessageDigest;
import org.bouncycastle.util.encoders.Hex;

public class MyTest {

    public static void main(String[] args) throws Exception {

        // 1st step:
        // ------------------------------------------------
        byte[] data = openFile();

        // Create file to write
        FileOutputStream fos = new FileOutputStream(new File("test"));
        ObjectOutputStream oosf = new ObjectOutputStream(fos);
        // Write byte[]-length and byte[]
        oosf.writeInt(data.length);
        oosf.write(data);

        // Flush & Close
        fos.flush();
        fos.close();

        // Print hash value of saved byte[]
        try {
            final MessageDigest messageDigest …
Run Code Online (Sandbox Code Playgroud)

java bytearray stream objectoutputstream objectinputstream

3
推荐指数
1
解决办法
3886
查看次数

ObjectInputStream.readObject() 给出 EOFException

我对编程完全陌生,所以我很难解决自己的错误。有人建议我在这个网站上尝试一下,所以我想为什么不试一试。

我发现的有关此错误的其他帖子似乎不太相关:大多数人建议关闭输入流,但我的代码已经这样做了。

我想要它做什么:将一个名为“photo”的 Photo 对象写入一个名为“test.ser”的文件中。然后读取文件“test.ser”并将“test.ser”中对象(“photo”)的路径返回给我。

它的实际作用:将一个名为“photo”的 Photo 对象写入“test.ser”。读取“test.ser”,返回一个 EOFException 并且没有路径。

返回路径实际上并不是很重要,只要它返回对我有价值的东西即可。但是当我使用“System.out.println(photo)”或“photo.getId()”时,我遇到了同样的错误。

我不太确定我需要在这里粘贴什么,所以我将发布用于序列化和反序列化对象的两个 try/catch-es:

序列化对象:

    File test = new File("path.../something.ser");
    Photo photo = new Photo(2, "..\\images\\2.jpg", getImage("..\\images\\2.jpg"));

    try {
        FileOutputStream fos = new FileOutputStream(test);
        ObjectOutputStream out = new ObjectOutputStream(fos);

        if (!test.exists()) {
            test.createNewFile();
        }
        out.writeObject(photo);
        out.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
Run Code Online (Sandbox Code Playgroud)

反序列化对象:

        try {
        FileInputStream fis = new FileInputStream(test);
        ObjectInputStream in = new ObjectInputStream(fis);

        in.readObject();

        photo = (Photo)in.readObject();
        photo.getPath();
        in.close();

    } catch (Exception e) {
        e.printStackTrace();
    } …
Run Code Online (Sandbox Code Playgroud)

java objectinputstream eofexception

3
推荐指数
1
解决办法
7341
查看次数

更改实例状态不会反映在序列化对象中

我写了以下简单的代码

public static void main(String args[]) throws FileNotFoundException, IOException, ClassNotFoundException
{
    ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(new File("data.txt")));
    Human human = new Human();
    human.setAge(21);
    human.setName("Test");
    System.out.println("Human : " + human);
    oos.writeObject(human);
    human.setName("Test123");
    oos.writeObject(human);
    ObjectInputStream ois = new ObjectInputStream(new FileInputStream(new File("data.txt")));
    Human newHuman1  = (Human)ois.readObject();
    System.out.println("newHuman1 :" + newHuman1);
    Human newHuman2  = (Human)ois.readObject();
    System.out.println("newHuman2 :" + newHuman2);
}
Run Code Online (Sandbox Code Playgroud)

它打印 -

Human : Human [age=21, name=Test]
newHuman1 :Human [age=21, name=Test]
newHuman2 :Human [age=21, name=Test]
Run Code Online (Sandbox Code Playgroud)

我无法理解为什么它不打印

newHuman2 :Human [age=21, name=Test123]
Run Code Online (Sandbox Code Playgroud)

为什么更改实例状态不会反映在序列化对象中?

java serialization objectoutputstream objectinputstream deserialization

3
推荐指数
1
解决办法
462
查看次数

while 循环中的 ObjectInputStream readObject

是否可以从ObjectInputStreamwhile 循环中读取,该循环将因套接字超时引发的异常而终止socket.setSoTimeout(4000);

while(Object obj = ois.readObject()) {  <-- Not Working
//do something with object    
}
Run Code Online (Sandbox Code Playgroud)

java compiler-errors objectinputstream

3
推荐指数
1
解决办法
9274
查看次数

为什么当我通过 writeObject 方法发送对象时它没有改变?

我正在用Java 制作网络程序。正如标题所示,服务器尝试发送的对象在接收它的客户端中发生了变化。我试图在从服务器收到新对象之前更改客户端中存在的对象。这是我的代码。第一个是 Server.sendIdea,第二个是 Client.rcvIdea。

void sendIdea(Idea _idea) throws IOException {
    objectOS.flush();
    Idea idea = _idea;
//when I look into 'idea' it's fine
    objectOS.writeObject(idea);
}
Run Code Online (Sandbox Code Playgroud)

..

Idea rcvIdea(int _ideaCode) throws ClassNotFoundException, IOException {
    objectOS.writeObject("sendIdea");
    objectOS.writeObject(_ideaCode);
    Idea returnValue = (Idea) objectIS.readObject();
//when I look into 'returnValue', it is not the one 'sendIdea' has sent.
    return returnValue;
}
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,正在使用方法sendIdea(Idea _idea)从类发送对象。并通过使用方法接收对象。(我相信你不必详细了解类)。客户端通过这种方法实际上在程序启动时收到了一些s,没有任何问题。但是,当我尝试通过此方法接收相同但略有更改的对象时,在类中该对象不会更改,不像在类中将通过方法发送的对象被正确更改。我尝试了大约5个小时来解决这个问题。我逐行检查了所有代码,没有发现任何结果。我很确定 writeObject 或 readObject 方法有问题。我试图澄清这条流和许多其他试验。我希望我能找到问题所在。下面是我程序中的一些代码IdeawriteObjectrcvIdea()readObject()IdeaIdeaIdeaClientServersendIdeaobjectOS.flush()

Client.class包ideaOcean;

import java.awt.HeadlessException;
import java.io.IOException;
import …
Run Code Online (Sandbox Code Playgroud)

java sockets objectoutputstream objectinputstream

3
推荐指数
1
解决办法
1314
查看次数

Android/Java:如何跟踪 InputStream 的进度

我的 Android 应用程序中有以下代码,不确定是否是我的谷歌搜索技能,但找不到关于如何监控 InputStream 进度的好教程。

private void restoreFromUri(Uri uri) {
    try {
        InputStream is = getContentResolver().openInputStream(uri);
        ObjectInputStream ois = new ObjectInputStream(is);
        ArrayList<String> myList = (ArrayList) ois.readObject();
        ois.close();
        is.close();
    } catch (Exception e) {
        Snackbar.make(snackView, e.getMessage(), Snackbar.LENGTH_LONG).show();
    }
}
Run Code Online (Sandbox Code Playgroud)

上面的代码运行良好,但在内容来自 GMail 的情况下,即使是一个小文件也需要几秒钟来读取和填充 ArrayList。

是否可以显示带有文件/内容读取百分比的进度条?

java android uri inputstream objectinputstream

3
推荐指数
1
解决办法
1961
查看次数