1

我有一个客户端和服务器,我在它们之间交换消息和对象。我的问题是当我在一个字符串
的帮助下发送对象时。toString如何从字符串中取出对象并将对象添加到列表中;我写了代码。

服务器代码:

import java.net.*;
import java.util.ArrayList;
import java.io.*;

public class Server  {

public static void main(String[] args) {
    ArrayList <PhoneBook> listPhone=new ArrayList<PhoneBook>(); 

    PhoneBook a = new PhoneBook("a","a","","",1);
    listPhone.add(a);
    PhoneBook pB = new PhoneBook();
    String ob;
    try{

        ServerSocket server = new ServerSocket(5555,50);

        System.out.println("Waiting Incoming Connection...");
        System.out.println("Local Address :"+server.getInetAddress()+" Port :"+server.getLocalPort());
        Socket sock = server.accept();

        ObjectOutputStream out =new ObjectOutputStream(sock.getOutputStream()); 
        ObjectInputStream  in =new ObjectInputStream(sock.getInputStream()); 

        String strin =(String) in.readObject();

        if (strin.equals("START")){ 
        out.writeObject("WAITING");
        out.flush();}
        strin =(String) in.readObject();
        String[] str=strin.split("\n");
        if(str[0].equals("REQUEST_SEARCH")){

               try{
                    // in this line is error
                   pB = (PhoneBook)in.readObject();  //String cannot be cast to PhoneBook
                   out.flush();
        }catch(ClassNotFoundException classnot){
          System.err.println("Data received in unknown format");}
               out.writeObject("RECORSDS"); 
               out.flush(); 
               String sName = pB.getsurName(); 
               for(int i=0;i<listPhone.size();i++) 
              if(listPhone.get(i).getsurName().equals(sName)){ 
              out.writeObject(pB.toString()); 
              out.flush(); 

        }else{
        out.writeObject("NXRECORD");
        out.flush();
        }}
        strin =(String) in.readObject();
        String[] st=strin.split("\n");

        if(st[0].equals("REQUEST_INSERT")){

            listPhone.add(pB); 
            System.out.println("The contact is add");
            out.writeObject("OK");
            out.flush();
        }
        out.flush();

        if(strin.equals("END")){ //bye = terminate the conversation

        in.close();
        out.close();
        sock.close();
        System.out.println("Connection Closing...");}
        }
        catch (Exception ex){
        System.out.println("Error during I/O");
        ex.getMessage();
        ex.printStackTrace();
        } } }

客户端代码:

     if (strin.equals("WAITING")) {
        System.out.println("The server says: " + strin);
        // out.writeObject("REQUEST_SEARCH\n");
        // out.flush();
        System.out.println("The server says: " + strin);
        System.out.print("Write the contact elements ");
        System.out.print("Write the name: ");
        String name = input.nextLine();
        System.out.print("Write the surname: ");
        String surName = input.nextLine();
        System.out.print("Write the job: ");
        String job = input.nextLine();
        System.out.print("Write the street: ");
        String street = input.nextLine();
        System.out.print("Write the phone number: ");
        int number = input.nextInt();
        PhoneBook p = new PhoneBook(name, surName, job, street, number);
        out.writeObject("REQUEST_SEARCH\n" + p.toString());
        out.flush();
    }

错误:

Connection reset
at java.net.SocketInputStream.read(Unknown Source)  at
java.net.SocketInputStream.read(Unknown Source)     at
java.net.SocketInputStream.read(Unknown Source)     at
java.io.ObjectInputStream$PeekInputStream.peek(Unknown Source)  at
java.io.ObjectInputStream$BlockDataInputStream.peek(Unknown Source)
    at java.io.ObjectInputStream$BlockDataInputStream.peekByte(Unknown Source) at 
       java.io.ObjectInputStream.readObject0(Unknown Source)    at
       java.io.ObjectInputStream.readObject(Unknown Source)     at Server.main

申请背景:

这个程序是一个带有联系人(服务器)的电话簿,客户端首先发送一个 START,服务器接收它并在客户端制作一个包含姓名、姓氏、工作、街道和电话的对象电话簿后发送 WAITING并与消息一起发送REQUEST_SEARCH 服务器获取消息和对象(联系人)并使用姓氏在数组列表中搜索是否存在联系人,如果存在则发回对象并显示姓名、姓氏、工作和其他toString()和消息记录然后客户端发送OK和服务器发回END并且连接正在关闭如果联系人不存在服务器发送消息NXRECORD客户端发回消息REQUEST_INSERT服务器接受它并将对象添加到arraylist中并发送OK和客户端发回 END 并关闭连接。

4

1 回答 1

1

我不知道您在此行之后向服务器发送了什么。

out.writeObject("REQUEST_SEARCH\n" + p.toString());

但我假设您正在向String Server 发送一个。而在服务器端检索它时,您正在将其键入PhoneBook而不是String 使用以下行:

pB = (PhoneBook)in.readObject();

这导致流不匹配..因此出现异常。
这个问题的解决方案可能如下:我假设你的PhoneBook班级是Serializable.

在客户端使用:

 out.writeObject("REQUEST_SEARCH\n" + p.toString());
 out.writeObject(p);//Given that PhoneBook is Serializable.
于 2013-03-16T21:05:58.327 回答