【问题标题】:Try to get ObjectInputStream from Server (TCP) to deserialize objects尝试从服务器 (TCP) 获取 ObjectInputStream 以反序列化对象
【发布时间】:2013-04-27 05:37:05
【问题描述】:

我基本上想从服务器发送一个数组列表到我的客户端,它必须被序列化,所以我使用 ObjectI/OStream。但这是第一次创建客户端/服务器程序,所以我真的不知道该怎么做。我什至无法在客户端程序中构造 ObjectInputStream 构造函数。我得到错误:

线程“main”java.net.SocketException 中的异常:对等方重置连接:套接字写入错误 在 java.net.SocketOutputStream.socketWrite0(本机方法) 在 java.net.SocketOutputStream.socketWrite(未知来源) 在 java.net.SocketOutputStream.write(未知来源) 在 java.io.ObjectOutputStream$BlockDataOutputStream.drain(未知来源) 在 java.io.ObjectOutputStream$BlockDataOutputStream.setBlockDataMode(未知来源) 在 java.io.ObjectOutputStream.(未知来源) 在 SalesServer.main(SalesServer.java:35)

代码:

  import java.io.IOException;
  import java.io.InputStreamReader;
  import java.io.ObjectInputStream;
  import java.io.ObjectOutputStream;
  import java.net.Socket;
  import java.net.UnknownHostException;
  import java.util.Scanner;


  public class SalesClient {
      public static void main(String[] args) throws IOException{

    Socket ssocket = null;
    ObjectOutputStream out = null;
    ObjectInputStream inp = null;
    Scanner in = null;

    try {
        ssocket = new Socket("FahadAhmed-PC", 6667);
        in = new Scanner(System.in);
        inp = new ObjectInputStream();

    }catch(UnknownHostException e) {
        System.err.println("Don't know about host: FahadAhmed-PC");
        System.exit(1);
    }catch(IOException e){
        System.err.println(e);
        System.exit(1);
    }
}

}

服务器代码。首先它扫描一个文本文件,然后将一个销售对象添加到 arraylist:

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.Scanner;


public class SalesServer {

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

        ServerSocket serverSocket = null;

        try {
        serverSocket = new ServerSocket(6667);
    } catch (IOException e){
        System.out.println("Could not listen on port: 5555.");
        System.exit(1);
    }

    Socket clientSocket = null;
    try{
        clientSocket = serverSocket.accept();
    }catch (IOException e){
        System.out.println("Accept failed.");
        System.exit(1);
    }

    ArrayList<Sales> salesList = getSalesList();

    ObjectOutputStream out = new ObjectOutputStream(clientSocket.getOutputStream());

}

private static ArrayList<Sales> getSalesList() throws FileNotFoundException {
    ArrayList<Sales> list = new ArrayList<Sales>(10);
    Scanner in = new Scanner(new BufferedReader(new FileReader("sales.txt")));
    while(in.hasNext()){
        String state;
        int q1, q2, q3, q4;
        state = in.nextLine();
        q1 = in.nextInt();
        q2 = in.nextInt();
        q3 = in.nextInt();
        q4 = in.nextInt();
        in.nextLine();
        Sales sale = new Sales(state, q1, q2, q3, q4);
        System.out.println(sale.toString());
        list.add(sale);
    }
    return null;
}

}

【问题讨论】:

  • 你使用的是什么版本的JDK?如果您使用 JDK7,那么我可以给您一个使用 NIO2 的示例,它的性能优于阻塞

标签: java serialization tcp client-server deserialization


【解决方案1】:

这是一个关于套接字编程的很好的例子http://www.tutorialspoint.com/java/java_networking.htm

【讨论】:

  • 其中没有 ObjectOutputStream。没有答案。
  • 你只需要在ObjectOutputStream out = new ObjectOutputStream (server.getOutputStream());上更改DataOutputStream out = new DataOutputStream(server.getOutputStream());
  • 因此将其纳入您的答案中,但这些都不能完成对象的编写,这是本问题的主题。
【解决方案2】:
  1. 您的客户端代码无法编译。

  2. 它在执行任何 I/O 之前退出,这会关闭套接字,从而导致另一端出现异常。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-19
    • 2020-02-22
    • 1970-01-01
    相关资源
    最近更新 更多