Android 安卓服务器崩溃

Android 安卓服务器崩溃,android,client-server,forceclose,java-client,Android,Client Server,Forceclose,Java Client,我已经为android编写了一个小型客户机-服务器应用程序。客户端是在我的PC上运行的Java程序,而我的Android手机是服务器。我在服务器程序中面临强制关闭问题。服务器启动很好,但当我从PC客户端发送字符串时,android应用程序(服务器)强制关闭。这真的很烦人。请帮忙 这是我在电脑上运行的客户端程序: package javaNetPackage; import java.io.BufferedReader; import java.io.BufferedWriter; import

我已经为android编写了一个小型客户机-服务器应用程序。客户端是在我的PC上运行的Java程序,而我的Android手机是服务器。我在服务器程序中面临强制关闭问题。服务器启动很好,但当我从PC客户端发送字符串时,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"/>


更新:好的,我解决了强制关闭的问题。我删除了manifest.xml中的权限标记并重新键入它们。但现在,我面临着一个不同的问题。从PC客户端发送的字符串未显示在我的服务器文本视图中(布局xml中的文本视图1,在服务器代码中称为tv)。电视中的默认消息是“尚未收到来自客户端的任何信息”。当我从PC客户端发送字符串时,默认消息将消失,但发送的字符串不会在服务器文本视图(tv)中更新。

您应将收到的字符串设置为在
myUpdateHandler.sendMessage(m)中发送的
消息
对象而不是
mclientsg
字段

您可以创建并发送
消息
对象,如下所示:

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;
我建议您使用
捆绑
对象,而不是原始对象

以空字符串结尾的原因是处理程序和
CommsThread
在不同的线程中运行,因此没有使用相同的
mclientsg
实例


i、 e.
CommsThread
mclientsg
的更改在您的处理程序中不可见。

Android进程日志告诉您有关您的进程的信息是什么?它将为您提供发生的任何异常的名称和位置。非常感谢!对不起,这个愚蠢的问题!为什么我们不能在textView(同一线程)中简单地编写input.readLine()@VinitShandilya您可以将textView的引用作为成员字段,如
mycommstread
,并在您的线程中使用它来设置textView的内容。