Java Android套接字客户端接收数据

Java Android套接字客户端接收数据,java,android,sockets,Java,Android,Sockets,我正在为android创建一个基本的测试应用程序,它可以连接到套接字服务器并发送和接收数据。我已经能够将数据从客户端发送到服务器,但似乎在让android接收数据时遇到了问题。服务器可以正常工作,因为我已经能够使用外部应用程序测试它 这是我的密码 package com.socket_sending_and_receving_test; import java.io.BufferedWriter; import java.io.IOException; import java.io.Outpu

我正在为android创建一个基本的测试应用程序,它可以连接到套接字服务器并发送和接收数据。我已经能够将数据从客户端发送到服务器,但似乎在让android接收数据时遇到了问题。服务器可以正常工作,因为我已经能够使用外部应用程序测试它

这是我的密码

package com.socket_sending_and_receving_test;

import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.io.BufferedReader;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Timer;
import java.util.TimerTask;

import android.os.Looper;
import android.os.Message;
import android.widget.Button;

import android.widget.TextView;
import android.os.Handler;
import android.app.Activity;
import android.os.Bundle;



import android.view.View;
import android.widget.EditText;

public class Sending_And_Receiving extends Activity {

    private Socket socket;

    String message = "";

    String mClientMsg;

    TextView text;

    final Handler myHandler = new Handler();

    int count = 0;

    public static String SERVERPORT;
    public static int SERVERPORT2;
    public static String SERVER_IP;


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.sending_and_receaving);
        text = (TextView) findViewById(R.id.textView);
        text.setText("0");


    }

    Handler myUpdateHandler = new Handler() {
        public void handleMessage(Message msg) {
            TextView tv = (TextView) findViewById(R.id.textView);
            tv.setText(mClientMsg);
            super.handleMessage(msg);
        }
    };

    class CommsThread implements Runnable {
        String st = null;
        public void run() {
            while (!Thread.currentThread().isInterrupted()) {
                Message m = new Message();
                {
                    BufferedReader input = null;
                    try {
                        InputStreamReader streamReader = new InputStreamReader(socket.getInputStream());
                        BufferedReader reader = new BufferedReader(streamReader);
                        st = reader.readLine();
                        mClientMsg = st;
                        myUpdateHandler.sendMessage(m);
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }



    public void connect(View view) {

        EditText ip = (EditText) findViewById(R.id.ip);
        EditText port = (EditText) findViewById(R.id.port);
        SERVER_IP = ip.getText().toString();
        SERVERPORT = port.getText().toString();
        new Thread(new ClientThread()).start();
        new Thread(new CommsThread()).start();



    }

    public void Disconnect(View view) {

        try {
            socket.shutdownInput();
            socket.shutdownOutput();
        } catch (IOException e) {
            e.printStackTrace();
        }


    }


    public void onClick(View view) {
        try {
            EditText et = (EditText) findViewById(R.id.ko);
            String str = et.getText().toString();
            PrintWriter out = new PrintWriter(new BufferedWriter(
                    new OutputStreamWriter(socket.getOutputStream())),
                    true
            );
            out.println(str);
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }



    class ClientThread implements Runnable {

        @Override
        public void run() {

            try {
                InetAddress serverAddr = InetAddress.getByName(SERVER_IP);

                SERVERPORT2 = Integer.parseInt(SERVERPORT);

                socket = new Socket(serverAddr, SERVERPORT2);

            } catch (UnknownHostException e1) {
                e1.printStackTrace();
            } catch (IOException e1) {
                e1.printStackTrace();
            }

        }

    }
}
连接完成后,应用程序崩溃。我不认为这是由于用户界面的更新,但我认为这是由于数据的接收

这是航海日志

07-08 21:59:57.915    7041-7041/com.socket_sending_and_receving_test D/libEGL﹕ loaded /system/lib/egl/libEGL_mali.so
07-08 21:59:57.920    7041-7041/com.socket_sending_and_receving_test D/libEGL﹕ loaded /system/lib/egl/libGLESv1_CM_mali.so
07-08 21:59:57.925    7041-7041/com.socket_sending_and_receving_test D/libEGL﹕ loaded /system/lib/egl/libGLESv2_mali.so
07-08 21:59:57.930    7041-7041/com.socket_sending_and_receving_test D/﹕ Device driver API match
    Device driver API version: 10
    User space API version: 10
07-08 21:59:57.930    7041-7041/com.socket_sending_and_receving_test D/﹕ mali: REVISION=Linux-r2p4-02rel0 BUILD_DATE=Tue Oct 16 15:37:13 KST 2012
07-08 21:59:57.965    7041-7041/com.socket_sending_and_receving_test D/OpenGLRenderer﹕ Enabling debug mode 0
07-08 21:59:57.965    7041-7041/com.socket_sending_and_receving_test E/SensorManager﹕ thread start
07-08 21:59:57.970    7041-7041/com.socket_sending_and_receving_test D/SensorManager﹕ registerListener :: handle = 0  name= LSM330DLC 3-axis Accelerometer delay= 200000 Listener= android.view.OrientationEventListener$SensorEventListenerImpl@42b1cf38
07-08 21:59:58.080    7041-7041/com.socket_sending_and_receving_test E/SpannableStringBuilder﹕ SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length
07-08 21:59:58.080    7041-7041/com.socket_sending_and_receving_test E/SpannableStringBuilder﹕ SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length
07-08 22:00:03.235    7041-7193/com.socket_sending_and_receving_test W/dalvikvm﹕ threadid=13: thread exiting with uncaught exception (group=0x41e792a0)
07-08 22:00:03.240    7041-7193/com.socket_sending_and_receving_test E/AndroidRuntime﹕ FATAL EXCEPTION: Thread-2791
    java.lang.NullPointerException
            at com.socket_sending_and_receving_test.Sending_And_Receiving$CommsThread.run(Sending_And_Receiving.java:74)
            at java.lang.Thread.run(Thread.java:856)
07-08 22:00:03.320    7041-7041/com.socket_sending_and_receving_test D/SensorManager﹕ unregisterListener::  Listener= android.view.OrientationEventListener$SensorEventListenerImpl@42b1cf38
07-08 22:00:03.320    7041-7041/com.socket_sending_and_receving_test D/Sensors﹕ Remain listener = Sending .. normal delay 200ms
07-08 22:00:03.320    7041-7041/com.socket_sending_and_receving_test I/Sensors﹕ sendDelay --- 200000000
07-08 22:00:03.320    7041-7041/com.socket_sending_and_receving_test D/SensorManager﹕ JNI - sendDelay
07-08 22:00:03.320    7041-7041/com.socket_sending_and_receving_test I/SensorManager﹕ Set normal delay = true
07-08 22:00:09.870    7041-7041/com.socket_sending_and_receving_test I/Choreographer﹕ Skipped 392 frames!  The application may be doing too much work on its main thread.
07-08 22:00:11.680    7041-7193/com.socket_sending_and_receving_test I/Process﹕ Sending signal. PID: 7041 SIG: 9
在此问题上的任何帮助都将不胜感激


干杯:)

您的套接字为空。这是因为比赛条件:

new Thread(new ClientThread()).start();
new Thread(new CommsThread()).start();
这两个线程都在这里启动,但是当CommsThread尝试使用套接字时,ClientThread将初始化套接字。但目前还没有草签


您可以在套接字=。。。或者,如果您确实需要第二个线程,请在那里启动。

在ClientThread完成连接之前,CommstThread正在运行。所以,'socket'仍然为空,并且您得到一个NPE


绝对没有理由让它们成为两条不同的线程。将它们组合在一起,以便首先建立连接,然后启动I/O。使用两个线程来执行必须是连续的任务基本上是没有意义的。

引发任何异常?它只是在android手机上崩溃。也就是说,基本上需要关闭应用程序。您将有一个带有错误/异常的LogCat。请发布。我看不出是否有任何异常。您(如您所见)在第74行有一个NullPointerException(Sending_and_Receiving.java:74)。请告诉我们这是哪一行代码。实际上,情况正好相反。ClientThread初始化套接字;CommsThread使用它。只是帮忙。使用两个线程,一个用于打开,另一个用于阅读,这是真的。感谢修复了崩溃问题:D.我对android非常陌生,并采取了一些简单的步骤来学习:)@user3816184 android与此无关。在任何平台上,额外的线程都是错误的。将必须是顺序的任务并行化是没有意义的。@EJP我理解。我应该换一种说法,我是编程新手,安卓是我的第一语言。这很难,但很有趣:)