簡體   English   中英

通過套接字Java TCP服務器向Android應用發送對象

[英]Sending objects through sockets java TCP server to android app

我正在編寫一個客戶端-服務器對,其中服務器是在Linux上運行的Java TCP服務器,客戶端是在Android Studio中開發的Android應用。

我已經成功地建立了一個客戶端-服務器對,可以彼此發送Message對象,但是當我嘗試在Android應用中實現類似功能時,似乎什么也沒發生。

Android應用程序可以正常工作,而只是通過BufferedReaderPrintwriter類的readLine()println()方法發送Strings ,而不是通過ObjectOutput / InputStream類的readObject()writeObject()發送Strings

還嘗試了writeUnshared() / readUnshared()方法,但沒有readUnshared()運氣。

//Message.java
package Message;
import java.io.*;

public class Message implements Serializable {
    String msg;
    String tag;
    String username;

    private static final long serialVersionUID = 4L;
        // Methods.
    }

    // Reading MessageObjects in Server.java.
    @Override
    public void run() {
        Message message = null;
        try {
            while ((message = (Message)reader.readObject()) != null) {
                // Processing message.
            }
        }
    }

    // Sending Message Objects in android App.
    public void onClick(View v) {
        if(!msgBox.getText().toString().equals("")) {
            final String msg;
            try {
                msg = msgBox.getText().toString();
                writer.writeObject(new Message(msg, CLIENT, username));
                msgBox.setText("");
                writer.flush();
                // Updating ui etc.
            }
            catch (IOException e) {
                 e.printStackTrace();
            }
            textBox.smoothScrollBy(textBox.getMaxScrollAmount(), 100);
        }
    }

    // Connection-method in android app, initalizes streams.
    private boolean connect(String username, String address, int port) {
        boolean connected = false;
        try {
            server = new Socket(address, port);
            InputStreamReader(server.getInputStream());
            reader = new ObjectInputStream(server.getInputStream());
            writer = new ObjectOutputStream(server.getOutputStream());
            writer.writeObject(new Message("!newUser",AUTOMATED,username));
            writer.flush();
            connected = true;
            System.out.println("Connected!");
        }
        catch (Exception ex) {
            ex.printStackTrace();
            System.out.println("Cannot Connect!");
            connected = false;
            // UI-things.
        }
        if(connected){
            // Thread that listens for replies.
            listenThread(); 
        }
        return connected;
    }
  • 您需要在兩端的ObjectInputStream之前創建ObjectOutputStream 否則,您可能會陷入僵局。
  • 您的讀取循環不正確。 readObject()在流的末尾不會返回null,因此使用null作為循環條件沒有任何意義。 發送空值時,它可以返回空值。 當捕獲到EOFException時,循環應終止。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM