当前位置: 首页 > 知识库问答 >
问题:

使用ObjectInputStream进行CP连接和接收数据

陆俊捷
2023-03-14

求你了,我需要你的帮助。

我正在使用TCP连接在java服务器和android应用程序客户端之间建立TCP连接。假设我将发送一个序列化对象,但是每次在客户端,代码都会在中的Obj=(Person)处被阻塞。readObject;其中in是数据对象InputStream,Person是序列化对象。

然而,如果我发送的是字符串或整数,并且我使用Obj=in,代码就可以工作。readObject;直接地

所以请我需要知道我可以添加什么才能成功反序列化。

或者arraylist只是字符串,那么我该怎么办呢

    lst = (ListView) findViewById(R.id.list);    
         al = new ArrayList<String>();    
         ad = new ArrayAdapter<String>(this,R.layout.list, al);

try { 
      socket = new Socket("192.168.0.103", 8888);
      in = new ObjectInputStream(socket.getInputStream());
      Object obj = null;  
      while ((obj = in.readObject()) != null) {  
          if (obj instanceof Person) {    
    al.add(((Person) obj).toString());

    lst.setAdapter(ad);
    }}      

     } catch (UnknownHostException e) {
      e.printStackTrace();

    } catch (IOException e) {
      e.printStackTrace();

    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    }

    finally{
      if (in != null){

    try {
        in.close();

    } catch (IOException e) {
        e.printStackTrace();
       }
try {
   socket = serverSocket.accept();

oos = new ObjectOutputStream(socket.getOutputStream());

Person person = new Person();

person.setFirstName("James");

    person.setLastName("Ryan");

    person.setAge(19);

    String a = "Ahmed";

    oos.writeObject(a);

    oos.writeObject(person);  

   } catch (FileNotFoundException ex) {
       ex.printStackTrace();

   }catch (IOException e) {
    e.printStackTrace();

   }
   finally{

    if( oos!= null){

     try {
        oos.flush(); 
      oos.close();
     } catch (IOException e) {
      e.printStackTrace();
     }
public class Person implements Serializable {

    private String firstName;
    private String lastName;
    private int age; 
    public Person() {
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
       public String toString() {

        StringBuffer buffer = new StringBuffer();
        buffer.append(firstName);
        buffer.append("\n");
        buffer.append(lastName);
        buffer.append("\n");
        buffer.append(age);
        buffer.append("\n");

        return buffer.toString();
    }

共有1个答案

董子航
2023-03-14

这里有几个问题。

首先,readObject()在EOS时不返回null,因此循环条件是错误的。它抛出EOFEException,所以你需要捕捉它。

其次,我不知道为什么要使用序列化,如果您想要的只是接收对象上的toString()的结果。

第三,代码中没有抛出FileNotFoundException的内容,所以捕获它的原因是个谜。

第四,如果接收到的对象不是Person的实例,那么您的代码就不可能表现出这一点。

 类似资料:
  • 我第一次使用带有IISExpress的新Visual Studio 2013(以前 ASP.net VS2010上的开发服务器使用)。我在尝试调试项目时遇到问题。 这是我在Chrome看到的: 无法与服务器建立安全连接。这可能是服务器的问题,也可能需要您没有的客户端身份验证证书。错误代码:ERR_SSL_PROTOCOL_ERROR 我更新了我的计划—— 与localhost的连接中断。错误代码:

  • 乡亲们, 我在BigQuery中使用融合连接器进行数据传输。对于每个事件,我都创建了一个将在BigQuery中解释的avro模式。是否可以将任何事件字段定义为表分区? 它目前正在使用_PARTITIONTIME隐藏字段,但我需要它成为实际事件的字段,以便更容易处理重复。

  • 问题内容: 只是从github交叉发布。 我将xorm 0.4.3与go-mysql一起使用。我们使用Golang 1.4。 我们在和中指定了以下内容: 而且我们使用相同的单个实例来查询Mysql。 但是我们仍然看到很多连接的状态,这是远远超过这些数字我已经配置和 我们国家的时候- 我们还观察到,即使我们停止MySQL,连接号仍保持固定但处于状态。如果我们关闭应用程序,则所有连接都会消失。 但是在

  • 问题内容: 我正在使用套接字连接我的Android应用程序(客户端)和Java后端服务器。每次与服务器通信时,我都希望从客户端发送两个数据变量。 1)某种消息(由用户通过界面定义) 2)消息的语言(由用户通过界面定义) 我该如何发送这些消息,以便服务器将每个消息解释为一个单独的实体? 在读取了服务器端的数据并做出了适当的结论之后,我想向客户端返回一条消息。(我想我会没事的) 因此,我的两个问题是如

  • 问题内容: 我在两个表之间有多对多关系。 表包含我的餐厅。 表包含不同的类别。 表包含两列,每列分别包含两个表的ID。 以下陈述是我能想到的,但没有给我我想要的输出。 我希望输出是有关餐厅的信息,并在最后一列中是类别的连接行。 问题答案: 要串联值,可以使用。xml路径解决方案有误,应使用和特殊字符。 您也可以使用变量解决方案

  • 问题内容: 我试图绕过 ObjectInputStream / ObjectOutputStream ,所以我创建了一个非常简单的服务器- 客户端应用程序,其中客户端通过创建的流发送HashMap对象,服务器接收并打印该对象。 这是我的服务器代码: 这是我的客户代码: 我运行服务器文件,它运行正常。 然后运行客户端文件,并在服务器上收到以下错误: PS我不知道我是否需要做一些事情来序列化HashM