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 не виден в вашем обработчике.

Другие вопросы по тегам