【发布时间】:2016-04-26 19:49:51
【问题描述】:
我正在编写一个客户端-服务器对,其中服务器是在 Linux 上运行的 java TCP 服务器,客户端是在 Android Studio 中开发的 Android 应用程序。
我已经成功创建了一个客户端-服务器对,可以相互发送Message 对象,但是当我尝试在我的 Android 应用中实现类似的功能时,似乎什么也没有发生。
Android 应用程序在仅使用 BufferedReader 和 Printwriter 类中的 readLine() 和 println() 方法发送 Strings 时工作,但不适用于来自 ObjectOutput 的 readObject() 和 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;
}
【问题讨论】:
-
这些所谓的
ObjectInput和ObjectOutput流在哪里声明和初始化?我认为您实际上并没有向我们展示完整的问题 -
我认为服务器工作正常,因为我让它与命令行客户端一起工作。增加了安卓应用的连接方式
-
所以一切看起来都很好......据我所知。你没有在主线程上做任何网络对吗?
-
不确定在哪个线程按钮侦听器上运行,但我有一个发送按钮,可将用户输入打包到消息对象中并发送。
-
没有任何反应,因为您正在捕获异常。你不能在主线程上联网。