首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ObjectInputStream程序

ObjectInputStream程序
EN

Stack Overflow用户
提问于 2015-04-04 21:55:38
回答 1查看 98关注 0票数 0

我正试图在安卓设备上向客户端发送一个ArrayList。服务器说它发送了这个对象,但是在它挂起的android设备上。我已经了解到,在创建ObjectInputStream时,必须先创建ObjectOuputStream,然后才能刷新。我已经试过了,但是这对我不起作用。我没有发布获取客户端的代码,因为它只是简单地从文本文件中读取。客户端类是非常基本的,很少有属性,如用户名、密码和好友字符串数组。任何帮助都将不胜感激。服务器:

代码语言:javascript
复制
public class Server {
     private static final int port = 9001;
     private static final String IPAddr = "xxxxxxxxxxx";
     ServerSocket server = null;
     ArrayList <Client> users = new ArrayList<Client>();


     public Server(){           
        try{
            server = new ServerSocket(port);
            System.out.println("connected server on port" + port);
            while(true){
                System.out.println("waiting for connection my ip add is "+ InetAddress.getLocalHost().getHostAddress());
                Socket clientsocket = server.accept();
                System.out.println("Connect to client:"+ clientsocket.getInetAddress().getHostName());
                ClientThread client = new ClientThread(clientsocket);
                client.start();
            }
        } catch(IOException e) {
            System.err.println("Could not listen on port");
        }
     }


//Thread     
    public class ClientThread extends Thread {
        private Socket sckt = null;

        public ClientThread(Socket sckt){
            super("ClientThread");
            this.sckt = sckt;
        }
        public void run(){
        try{    
            PrintWriter out = new PrintWriter(sckt.getOutputStream(), true);
            BufferedReader input = new BufferedReader(new InputStreamReader(sckt.getInputStream()));
            ObjectOutputStream objectOutput = new ObjectOutputStream(sckt.getOutputStream());
            objectOutput.flush();

            String Username = input.readLine();
            String Password = input.readLine();
            System.out.println("recieved from client: "+ Username);
            int ClientIndex = isClient(Username);
            if (ClientIndex != -1){
                if(users.get(ClientIndex).password.equals(Password)){
                    //password correct  -> send friends
                    out.println("correct");
                    out.flush();
                    System.out.println(Username + " is correct");
                    LoadClientFriends(Username, ClientIndex);

                    objectOutput.writeObject(users.get(ClientIndex).Friends);
                    System.out.println("Friends sent");
                } else {
                    //password incorrect -> retry
                    out.println("password");
                    System.out.println(Username + " has wrong password");

                }


            } else {
                //not a registered client 
                out.println("wrong");
                System.out.println(Username + " is not a client");
            }
        } catch(Exception e){
            System.err.println("Couldnt connect to Client socket");
        }
        }
    }

    public static void main(String[] args){
        Server svr = new Server();
    }
}

Client/Android:

代码语言:javascript
复制
public class MainActivity extends ActionBarActivity {
//Varibles
    EditText username;
    EditText password ;
     private static final int port = 9001;
     private static final String IPAddr = "xxxxxxx";
//Methods

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.fragment_main);
      /*  Drawable d = getResources().getDrawable(R.drawable.actionbar_background);
        getActionBar().setBackgroundDrawable(d);*/
    }
    public void Login(View view) {
        //connect to server 

         Thread myThread2 = new Thread(Connect);
         myThread2.start();

    }

    public void Register(View view) {

            Intent i = new Intent(this, register_screen.class);
            startActivity(i);

    }      
    Runnable Connect = new Runnable()
    {
        public void run()
        {
            try {

                Socket connection = new Socket(IPAddr,port);

                BufferedReader input = new BufferedReader(new InputStreamReader(connection.getInputStream()));
                PrintWriter output = new PrintWriter(connection.getOutputStream(), true);


                //Sent the username a password for verifaction

                username = (EditText)findViewById(R.id.edtName);
                password = (EditText)findViewById(R.id.edtPassword);

                output.println(username.getText().toString());
                output.flush();
                output.println(password.getText().toString());
                output.flush();

                //Receive confirmation of client
                String res = input.readLine();

                if (res.contains("correct")){
                    ObjectOutputStream objectOutput = new ObjectOutputStream(connection.getOutputStream());
                    objectOutput.flush();
                    ObjectInputStream objectInput = new ObjectInputStream(new BufferedInputStream(connection.getInputStream())); //Error Line!

                    Object object = objectInput.readObject();
                    ArrayList<String> friends =  (ArrayList<String>) object;
                    Intent intent = new Intent(MainActivity.this,chat_screen.class);
                    intent.putExtra("Friends", friends);
                    startActivity(intent);

                }else if (res.contains("password")){

                    Intent i = new Intent(getBaseContext(), MainActivity.class);
                    startActivity(i);

                }else {


                }


            }catch (Exception e){


            }
            }

     };
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-04-04 22:39:15

您看到的错误是由于多个输出流格式造成的。坚持ObjectOutputStream/ObjectInputStreamPrintWriter/BufferedReader。我建议ObjectOutputStream/ObjectInputStream

服务器代码:对所有写操作都使用objectOutPut

代码语言:javascript
复制
// out.println("correct");
objectOutput.writeUTF("correct");

// Update code for password and wrong too - Use objectOutput.writeUTF("");

客户端代码:只使用ObjectInputStream而不是BufferedReader

在这里定义objectInput:

代码语言:javascript
复制
// BufferedReader input = new BufferedReader(new InputStreamReader(connection.getInputStream()));
ObjectInputStream objectInput = new ObjectInputStream(connection.getInputStream());
PrintWriter output = new PrintWriter(connection.getOutputStream(), true);

// Read data as follows:    
// String res = input.readLine();
String res = objectInput.readUTF();
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29451823

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档