Android服务器崩溃

时间:2013-06-14 04:44:50

标签: android client-server forceclose java-client

我为android编写了一个小型客户端服务器应用程序。客户端是在我的PC上运行的Java程序,而我的Android手机是服务器。我在服务器程序中面临强制关闭问题。服务器启动相当不错,但是当我从我的PC客户端发送一个字符串时,android应用程序(服务器)强制关闭。它变得非常烦人。请帮忙!

这是我的PC上运行的客户端程序:

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"/>

更新::好的,我解决了强制关闭的问题。我删除了manifest.xml中的权限标记并重新输入了它们。但是现在,我在这里遇到了一个不同的问题。来自PC客户端的发送字符串未显示在我的服务器TextView中(布局xml中的textView1,在服务器代码中称为tv)。 tv中的默认消息是“Nothing from yet yet”。当我从PC客户端发送字符串时,默认消息消失但发送的字符串未在服务器TextView(tv)中更新。

1 个答案:

答案 0 :(得分:0)

您应该将收到的字符串设置为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#setData(android.os.Bundle)

您最终得到一个空字符串的原因是因为您的处理程序和CommsThread在不同的线程中运行,因此不使用mClientMsg的相同实例。

即。 CommsThreadmClientMsg的更改在您的处理程序中不可见。