只能在wifi直接P2P连接中从客户端向主机发送消息,而不能从主机向客户端发送消息

时间:2018-10-27 17:38:19

标签: java android networking wifi wifi-direct

在这个应用程序中,我正在通过wifi direct p2p连接两个设备,其中一个是“主机”,另一个是“客户端”。然后,我对在设备之间发送消息的功能进行了编码。客户端可以很好地发送消息,但是当主机尝试发送消息时,应用程序崩溃,这是发送消息的代码:

static final int MESSAGE_READ = 1;

Handler handler = new Handler(new Handler.Callback() {
    @Override
    public boolean handleMessage(Message msg) {
        switch (msg.what) {
            case MESSAGE_READ:
                byte[] readBuff = (byte[]) msg.obj;
                String tempMsg = new String(readBuff, 0, msg.arg1);
                read_msg_box.setText(tempMsg);

                break;
        }
        return true;
    }
});

public class ServerClass extends Thread {
    Socket socket;
    ServerSocket serverSocket;

    @Override
    public void run() {
        super.run();
        try {
            serverSocket = new ServerSocket(8888);
            socket = serverSocket.accept();
            sendReceive = new SendReceive(socket);
            sendReceive.start();


        } catch (IOException e) {
            Log.v("MainActivity", "" + e);
        }

    }
}

private class SendReceive extends Thread {
    private Socket socket;
    private InputStream inputStream;
    private OutputStream outputStream;

    public SendReceive(Socket skt) {
        socket = skt;
        try {
            inputStream = socket.getInputStream();
            outputStream = socket.getOutputStream();
        } catch (IOException e) {
            Log.v("MainActivity", "" + e);
        }
    }

    @Override
    public void run() {
        byte[] buffer = new byte[1024];
        int bytes;

        while (socket != null) {
            try {
                bytes = inputStream.read(buffer);
                if (bytes > 0) {
                    handler.obtainMessage(MESSAGE_READ, bytes, -1, buffer).sendToTarget();

                }

            } catch (IOException e) {
                Log.v("MainActivity", "" + e);
            }

        }
    }

    public void write(byte[] bytes) {
        try {
            outputStream.write(bytes);
        } catch (IOException e) {
            Log.v("MainActivity", "" + e);
        }
    }
}

public class ClientClass extends Thread {
    Socket socket;
    String hostAdd;

    public ClientClass(InetAddress hostAddress) {
        hostAdd = hostAddress.getHostAddress();
        socket = new Socket();
    }

    @Override
    public void run() {
        try {
            socket.connect(new InetSocketAddress(hostAdd, 8888), 500);
            sendReceive = new SendReceive(socket);
            sendReceive.start();

        } catch (IOException e) {
            Log.v("MainActivity", "" + e);
        }
    }
}

以及在以编辑文本形式写入消息后单击“ btnSend”按钮时的代码(“ writeMsg”是一个EditText对象):

btnSend.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            String msg = writeMsg.getText().toString();
            sendReceive.write(msg.getBytes());
        }
    });

这是我在主机设备上按“发送”时显示的错误

E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.hosse.myapplication, PID: 8546
android.os.NetworkOnMainThreadException
at android.os.StrictMode$AndroidBlockGuardPolicy.
onNetwork(StrictMode.java:1303)
at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:111)
at java.net.SocketOutputStream.write(SocketOutputStream.java:145)
at com.example.hosse.myapplication.MainActivity
$SendReceive.write(MainActivity.java:292)
at com.example.hosse.myapplication.MainActivity
$4.onClick(MainActivity.java:138)
at android.view.View.performClick(View.java:6261)
at android.widget.TextView.performClick(TextView.java:11164)
at android.view.View$PerformClick.run(View.java:23752)
at android.os.Handler.handleCallback(Handler.java:751)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6776)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit
$MethodAndArgsCaller.run(ZygoteInit.java:1510)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1400)

那么我在做错什么导致了此错误?预先感谢。

0 个答案:

没有答案