Android系统MulticastSocket编程的问题

kisshujinwen1 2010-11-15 02:20:27
先贴代码: 请耐心看看,有点多,但是简单,谢谢
package xiaobenben.muticast;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;
import java.util.Scanner;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class Muticast extends Activity {
/** Called when the activity is first created. */
private Button button_ok;
private TextView textview;
private Button button_begin;
private EditText edittext;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
button_ok = (Button)findViewById(R.id.button_ok);
button_begin = (Button)findViewById(R.id.button_begin);
textview = (TextView)findViewById(R.id.textview_text);
edittext = (EditText)findViewById(R.id.editview);
textview.setText("hi,xiaobenben!");
button_begin.setOnClickListener(new Button.OnClickListener(){

public void onClick(View v) {
// TODO Auto-generated method stub
try {
System.out.println("init() start");
new Multicast().init();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

});
}

class Multicast implements Runnable{
private static final String BROADCAST_IP = "230.0.0.1";
public static final int BROADCAST_PORT = 30000;
private static final int DATA_LEN = 4096;
private MulticastSocket socket = null;
private InetAddress broadcastAddress = null;
private Scanner scan = null;
byte[] inBuff = new byte[DATA_LEN];
private DatagramPacket inPacket = new DatagramPacket(inBuff , inBuff.length);
private DatagramPacket outPacket = null;
private String str;

public void init()throws IOException
{
try
{
socket = new MulticastSocket(BROADCAST_PORT);
broadcastAddress = InetAddress.getByName(BROADCAST_IP);
socket.joinGroup(broadcastAddress);
socket.setLoopbackMode(false);
outPacket = new DatagramPacket(new byte[0] , 0 ,broadcastAddress , BROADCAST_PORT);
new Thread(this).start();
scan = new Scanner(edittext.getText().toString());
while(scan.hasNextLine())
{
byte[] buff = scan.nextLine().getBytes();
outPacket.setData(buff);
socket.send(outPacket);
}
}
finally
{
socket.close();
}
}
public void run(){
try
{
while(true)
{

socket.receive(inPacket);

System.out.println("聊天信息:" + new String(inBuff , 0 , inPacket.getLength()));
textview.setText("聊天信息:" + new String(inBuff , 0 , inPacket.getLength()));
System.out.println(inPacket.getAddress().getHostAddress());
}
}

catch (IOException ex)
{
ex.printStackTrace();
try
{
if (socket != null)
{

socket.leaveGroup(broadcastAddress);

socket.close();
}
System.exit(1);
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
}
}

每次程序点击开始按钮后,也就是发送信息后,就强制我退出了。
看了Android API的,是支持MulticastSocket的,看看那儿有问题,或者是需要在manifest里面加申明么?谢谢了
...全文
920 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
weiyiding2008 2013-05-14
  • 打赏
  • 举报
回复
第一,子线程中要用Handler或post方法传值给textView.setText(...)。。。 第二,别老只catchIOException...要catchException。。。
whateverwhat 2013-03-28
  • 打赏
  • 举报
回复
这么久了。。 android里面,不允许通过子线程修改界面吧
xp19881115 2012-09-24
  • 打赏
  • 举报
回复
public void run(){
try
{
while(true)
{

socket.receive(inPacket);

System.out.println("聊天信息:" + new String(inBuff , 0 , inPacket.getLength()));
textview.setText("聊天信息:" + new String(inBuff , 0 , inPacket.getLength()));
System.out.println(inPacket.getAddress().getHostAddress());
}
}

catch (IOException ex)
{

这里面出错了。textView.setText(...);应该放到主线程里面,你可以在子线程使用Handler和主线程通信
  • 打赏
  • 举报
回复
你的线程好像都没启动
new Thread(new Multicat()).start();
天蓝控 2011-04-27
  • 打赏
  • 举报
回复
用android的线程消息管理器
hf307 2011-01-11
  • 打赏
  • 举报
回复
kisshujinwen1 问题解决了?
我在Android手机上测试,收不到广播消息是怎么回事
kisshujinwen1 2010-11-16
  • 打赏
  • 举报
回复
经过测试,就是这句话错了:
textview.setText("聊天信息:" + new String(inBuff , 0 , inPacket.getLength()));
这句话是内部类run()方法里面的,我原本想的是 在线程里面接收数据报,然后只在外部类定义的一个TextView里面显示,这样是不行的,那我该怎么来写这一句话呢?
kisshujinwen1 2010-11-16
  • 打赏
  • 举报
回复
看到了,它说 thread exitting with uncaught exception(group = 0x4001aa28)
Only the original thread that create a view hierarch can touch its views..

莫非是我的线程写错了????
纠结的木棉花 2010-11-16
  • 打赏
  • 举报
回复
你在DDMS中可以看到logcat的 没用过吗?
纠结的木棉花 2010-11-16
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 kisshujinwen1 的回复:]

经过测试,就是这句话错了:
textview.setText("聊天信息:" + new String(inBuff , 0 , inPacket.getLength()));
这句话是内部类run()方法里面的,我原本想的是 在线程里面接收数据报,然后只在外部类定义的一个TextView里面显示,这样是不行的,那我该怎么来写这一句话呢?
[/Quote]
//读取Socket中的数据,读到的数据放在inPacket所封装的字节数组里。

textview.setText("聊天信息:" +msg);
String msg = new String(inBuff , 0 , inPacket.getLength());
kisshujinwen1 2010-11-15
  • 打赏
  • 举报
回复
顶顶顶,没有人看了么?
kisshujinwen1 2010-11-15
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 sokopet 的回复:]

你应该异常信息贴出来看看
[/Quote]

没有异常,只是在模拟器上面运行的时候,点击按钮后,就强制关闭了
sokopet 2010-11-15
  • 打赏
  • 举报
回复
你应该异常信息贴出来看看
纠结的木棉花 2010-11-15
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 kisshujinwen1 的回复:]

请问下KISS能不能把QQ给我,我吧工程给你,你帮我看看,谢谢了
[/Quote]
我不能上qq
kisshujinwen1 2010-11-15
  • 打赏
  • 举报
回复
请问下KISS能不能把QQ给我,我吧工程给你,你帮我看看,谢谢了
kisshujinwen1 2010-11-15
  • 打赏
  • 举报
回复
我当时用Eclipse调试了下,程序在运行了 socket = new MulticastSocket(BROADCAST_PORT);之后,直接跳到了
finally
{
socket.close();
}
然后就完了。。。。按道理说那句话应该没错的。。。吧
纠结的木棉花 2010-11-15
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 kisshujinwen1 的回复:]

XML code
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_SMS"></uses-permission>

加了两条。。还是不行。。不知道为什么,
[/Quote]
你的程序有问题,你看看,程序的逻辑是不是存在问题,一般force close 都是程序存在小错
kisshujinwen1 2010-11-15
  • 打赏
  • 举报
回复
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_SMS"></uses-permission>

加了两条。。还是不行。。不知道为什么,
纠结的木棉花 2010-11-15
  • 打赏
  • 举报
回复
类似的权限:
<uses-permission android:name="android.permission.READ_SMS"></uses-permission>

有在manifest.xml中加吗?
kisshujinwen1 2010-11-15
  • 打赏
  • 举报
回复
没人看看么。。。郁闷了

80,349

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧