首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android服务器崩溃

Android服务器崩溃
EN

Stack Overflow用户
提问于 2013-06-14 12:44:50
回答 1查看 833关注 0票数 0

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

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

代码语言:javascript
复制
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上运行的服务器代码:

代码语言:javascript
复制
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();
                    }
                }
            }
            }
     }

权限:

代码语言:javascript
复制
<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 )。电视中的默认消息是“还没有来自客户端的消息”。当我从PC客户端发送字符串时,默认消息消失,但服务器TextView (tv)中发送的字符串没有更新。

EN

回答 1

Stack Overflow用户

发布于 2013-06-14 13:33:42

您应该将接收到的字符串设置为在myUpdateHandler.sendMessage(m);中发送的Message对象,而不是mClientMsg字段。

您可以通过如下方式创建并发送Message对象:

代码语言:javascript
复制
String st = null;
st = input.readLine();
Message msg = Message.obtain(myUpdateHandler, MSG_ID, st);
msg.sendToTarget();

要获取处理程序中的值,

代码语言:javascript
复制
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实例。

也就是说,对mClientMsgCommsThread更改在您的处理程序中不可见。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17101245

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档