【问题标题】:Sending objects through sockets java TCP server to android app通过套接字java TCP服务器将对象发送到android应用程序
【发布时间】:2016-04-26 19:49:51
【问题描述】:

我正在编写一个客户端-服务器对,其中服务器是在 Linux 上运行的 java TCP 服务器,客户端是在 Android Studio 中开发的 Android 应用程序。

我已经成功创建了一个客户端-服务器对,可以相互发送Message 对象,但是当我尝试在我的 Android 应用中实现类似的功能时,似乎什么也没有发生。

Android 应用程序在仅使用 BufferedReaderPrintwriter 类中的 readLine()println() 方法发送 Strings 时工作,但不适用于来自 ObjectOutputreadObject()writeObject() / InputStream 班级。

也尝试了writeUnshared() / 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;
    }

【问题讨论】:

  • 这些所谓的ObjectInputObjectOutput 流在哪里声明和初始化?我认为您实际上并没有向我们展示完整的问题
  • 我认为服务器工作正常,因为我让它与命令行客户端一起工作。增加了安卓应用的连接方式
  • 所以一切看起来都很好......据我所知。你没有在主线程上做任何网络对吗?
  • 不确定在哪个线程按钮侦听器上运行,但我有一个发送按钮,可将用户输入打包到消息对象中并发送。
  • 没有任何反应,因为您正在捕获异常。你不能在主线程上联网。

标签: java android sockets tcp


【解决方案1】:
  • 您需要在ObjectInputStream 之前,在两端创建ObjectOutputStream。否则你可能会陷入僵局。
  • 您的读取循环不正确。 readObject() 不会在流结束时返回 null,因此使用 null 作为循环条件没有意义。它可以在您发送空值时返回空值。当EOFException 被捕获时,循环应该终止。

【讨论】:

    猜你喜欢
    • 2012-12-01
    • 2011-07-29
    • 2012-12-03
    • 2020-01-28
    • 1970-01-01
    • 2011-05-03
    • 2015-12-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多