Android-сервер падает
Я написал небольшое клиент-серверное приложение для Android. Клиент - это программа на Java, работающая на моем ПК, а мой телефон на Android - сервер. Я сталкиваюсь с проблемой принудительного закрытия в своей серверной программе. Сервер запускается довольно хорошо, но когда я отправляю строку с моего ПК-клиента, приложение (сервер) для Android закрывается. Это стало действительно раздражающим. Пожалуйста помоги!
Вот моя клиентская программа, работающая на моем ПК:
package javaNetPackage;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import javax.swing.JOptionPane;
public class javaClient {
/**
* @param args
*/
public static void main(String[] args) throws IOException {
Socket echoSocket = null;
PrintWriter out = null;
BufferedReader in = null;
String serverIpAddress = "10.81.242.220";
try {
InetAddress serverAddr = InetAddress.getByName(serverIpAddress);
echoSocket = new Socket(serverAddr, 4444);
out = new PrintWriter(echoSocket.getOutputStream(), true);
in = new BufferedReader(new InputStreamReader(
echoSocket.getInputStream()));
} catch (UnknownHostException e) {
System.err.println("Don't know about host");
System.exit(1);
} catch (IOException e) {
System.err.println("Couldn't get I/O for "
+ "the connection to server");
System.exit(1);
}
String str = JOptionPane.showInputDialog("Please give number");
out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(echoSocket.getOutputStream())),true);
out.println(str);
out.close();
in.close();
echoSocket.close();
}
}
А вот мой серверный код работает на Android:
package com.vinit.androidserver;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.widget.TextView;
public class MainActivity extends Activity {
ServerSocket ss = null;
String mClientMsg = "";
Thread myCommsThread = null;
protected static final int MSG_ID = 0x1337;
public static final int SERVERPORT = 4444;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final TextView tv=(TextView)findViewById(R.id.textView1);
tv.setText("Nothing from client yet");
this.myCommsThread = new Thread(new CommsThread());
this.myCommsThread.start();
}
@Override
protected void onStop() {
super.onStop();
try {
ss.close();
} catch (IOException e) {
e.printStackTrace();
}
}
Handler myUpdateHandler = new Handler() {
public void handleMessage(Message msg) {
switch (msg.what) {
case MSG_ID:
TextView tv = (TextView) findViewById(R.id.textView1);
tv.setText(mClientMsg);
break;
default:
break;
}
super.handleMessage(msg);
}
};
class CommsThread implements Runnable {
public void run() {
Socket s = null;
try {
ss = new ServerSocket(SERVERPORT );
} catch (IOException e) {
e.printStackTrace();
}
while (!Thread.currentThread().isInterrupted()) {
Message m = new Message();
m.what = MSG_ID;
try {
if (s == null)
s = ss.accept();
BufferedReader input = new BufferedReader(new InputStreamReader(s.getInputStream()));
String st = null;
st = input.readLine();
mClientMsg = st;
myUpdateHandler.sendMessage(m);
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
Разрешения:
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="17" />
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
Update:: Хорошо, я решил проблему принудительного закрытия. Я удалил теги разрешений в manifest.xml и набрал их заново. Но сейчас я столкнулся с другой проблемой. Отправленная строка с ПК-клиента не отображается в моем TextView сервера (textView1 в макете xml, в коде сервера это называется tv). Сообщение по умолчанию на телевидении "Ничего от клиента пока". Когда я отправляю строку с ПК-клиента, сообщение по умолчанию исчезает, но отправленная строка не обновляется на сервере TextView (TV).
1 ответ
Вы должны установить полученную строку на ваш Message
объект отправлен в myUpdateHandler.sendMessage(m);
вместо вашего mClientMsg
поле.
Вы можете создать и отправить Message
объект как показано ниже:
String st = null;
st = input.readLine();
Message msg = Message.obtain(myUpdateHandler, MSG_ID, st);
msg.sendToTarget();
Чтобы получить значение в вашем обработчике,
case MSG_ID:
TextView tv = (TextView) findViewById(R.id.textView1);
tv.setText((String) msg.obj);
break;
Я бы предложил вам использовать Bundle
объект вместо необработанного объекта, хотя. http://developer.android.com/reference/android/os/Message.html
Причина, по которой вы получаете пустую строку, заключается в том, что ваш обработчик и CommsThread
работать в разных потоках и, следовательно, не использовать один и тот же экземпляр mClientMsg
,
то есть изменения в CommsThread
в mClientMsg
не виден в вашем обработчике.