0

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

4

1 回答 1

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在您的处理程序中不可见。

于 2013-06-14T05:33:42.367 回答