首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在安卓中通过MulticastSocket接收数据出现问题

在安卓中通过MulticastSocket接收数据出现问题
EN

Stack Overflow用户
提问于 2012-01-25 07:58:40
回答 1查看 796关注 0票数 0

我最近一直在构建一个Android应用程序,我在网络部分遇到了一些问题。首先,我得到了this错误,现在我已经升级了程序,但现在我有另一个问题。我有一个单独的类,它启动自己的发送线程和另一个接收线程。下面是要发送的内容:

代码语言:javascript
复制
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;

import android.widget.EditText;

public class Sender implements Runnable {

    private MulticastSocket so;
    private InetAddress serverAddress;
    private int port;
    private EditText messageBoard;
    private EditText eText1;
    private EditText eText2;
    private EditText eText3;
    private Thread myActivity = new Thread(this);

    public Sender(EditText etHost, EditText etPort, EditText messageBoard, EditText etSend) {
        eText1 = etHost;
        eText2 = etPort;
        eText3 = etSend;
        this.messageBoard = messageBoard;
        myActivity.start();
    }

    @Override
    public void run() {

        // convert the host name to InetAddress
        try {
            //serverAddress = InetAddress.getByName(eText1.getText().toString());
            serverAddress = InetAddress.getByName("atlas.dsv.su.se");
        } catch (Exception e) {}

        //convert the port to an int
        //port = Integer.parseInt(eText2.getText().toString());
        port = 4456;

        // create socket and start communicating
        try {
            so = new MulticastSocket(port);
            so.joinGroup(serverAddress);
        } catch (IOException e) {}

        // start listening for incoming messages
        new Receiver(so, messageBoard);
    }

    /**
     * This method copies the text from the input text field to the conversation text field and
     * cleans the input text field
     */
    public void sendMessage() {

        // get the text that they contain and add the new messages to the old ones
        String message = eText3.getText().toString();
        String conversation = messageBoard.getText().toString();
        String newConverstion = conversation.concat("\n[You] ").concat(message);

        // make the messages text view editable
        messageBoard.setFocusable(true);
        messageBoard.setText(newConverstion);   // add the new message to the text view
        messageBoard.setFocusable(false);   // make the messages text view not editable

        // erase the text on the second text view that has just been sent
        eText3.setText("");

        // Send message to server

        // convert message to bytes array
        byte[] data = (message).getBytes();

        // create and send a datagram
        DatagramPacket packet = new DatagramPacket(data, data.length, serverAddress, port);

        try {
            so.send(packet);
        } catch (IOException e) {}


    }   // end of sendMessage

}

下面是用于接收的代码:

代码语言:javascript
复制
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.MulticastSocket;

import android.widget.EditText;

public class Receiver implements Runnable {

    private Thread myActivity = new Thread(this);
    private MulticastSocket so;
    private EditText messageBoard;

    public Receiver(MulticastSocket sock, EditText messBo) {
        so = sock;
        messageBoard = messBo; 
        myActivity.start();
    }

    @Override
    public void run() {
        byte[] data = new byte[1024];   // received data container

        while (true) {
            try {
                // create a datagram for receiving
                DatagramPacket packet = new DatagramPacket(data, data.length);

                // wait for the next message
                so.receive(packet);

                String message = new String(data, 0, packet.getLength());

                // add the new messages to the old ones
                String conversation = messageBoard.getText().toString();
                String newConverstion = conversation.concat("\n[Remote] ").concat(message);

                // make the messages text view editable
                messageBoard.setFocusable(true);
                messageBoard.setText(newConverstion);   // add the new message to the text view
                messageBoard.setFocusable(false);   // make the messages text view not editable


            } catch (IOException ioe) {}
        }
    }

}

当我运行它时,我得到:

代码语言:javascript
复制
01-25 00:23:27.281: W/dalvikvm(582): threadid=12: thread exiting with uncaught exception (group=0x409c01f8)
01-25 00:23:27.281: E/AndroidRuntime(582): FATAL EXCEPTION: Thread-80
01-25 00:23:27.281: E/AndroidRuntime(582): java.lang.NullPointerException
01-25 00:23:27.281: E/AndroidRuntime(582):  at com.regeduser00x.proj1.Receiver.run(Receiver.java:31)
01-25 00:23:27.281: E/AndroidRuntime(582):  at java.lang.Thread.run(Thread.java:856)

第31行是so.receive(packet);,它的问题是什么?

EN

回答 1

Stack Overflow用户

发布于 2012-01-25 08:13:18

我最好的猜测是你的套接字进入了你的接收器构造函数null。但是如果看不到你是如何尝试使用它的,我就不能确定了。

但是我可以说,您可能会发现使用AsyncTask实现您的类会更简单。它们是专门为了简化线程的创建和交互而创建的。

这里有一些需要检查的东西,它们将帮助你实现你想要实现的目标。

这两个是开发人员文档的一部分:

http://developer.android.com/resources/articles/painless-threading.html

http://developer.android.com/reference/android/os/AsyncTask.html

这里有一个使用AsyncTask的很好的例子:

http://www.screaming-penguin.com/node/7746

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

https://stackoverflow.com/questions/8996123

复制
相关文章

相似问题

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