关于多线程与socket的几个问题

futosky 2012-03-10 08:32:53
我在MainActivity里面开启了一个线程监听连接,客户端使用 PC机,通过WIFI相连

1、希望这个线程accept连接后,将这个socket传递给一个新的Activity,在新的Activity里面再开一个线程接收数据,但是貌似Bundle支持的数据类型里面没有socket啊,刚接触ANDROID开发,基础不牢。。。
2、在线程里面:

//A模块连接处理线程
private void startServerA() throws IOException
{
ServerSocketA.Listen(9220);
ModuleAConnected=1;
while(ServerSocketA.socket.isConnected()==true)
{
;
}
ModuleAConnected=0;
}
但是如果在这个函数里面加上对界面操作的语句,例如
TextView.setText("msg");程序立马挂掉,这是为什么?

3、用VB的Winsock控件 winsock.SendData "Hello" 如何在Android上解析?书上的例子解析不出来。。。。
...全文
195 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
futosky 2012-03-17
  • 打赏
  • 举报
回复
in.read(ReceivebufferA);
是不是接收到数据才会继续执行?
futosky 2012-03-16
  • 打赏
  • 举报
回复

while(socket.isClosed()==false)
{
//ServerSocketA.GetData(ReceivebufferA);
InputStream in=socket.getInputStream();
//InputStream in=ServerSocketA.socket.getInputStream();
ReceivebufferA=new byte[in.available()];
in.read(ReceivebufferA);
Message messageData= new Message();
messageData.what = MainFrame.GETDATA_A;
MainFrame.this.myHandler.sendMessage(messageData);
Thread.sleep(100);

这里接受数据会阻塞吗?为什么没有接收到数据还是一遍一遍的执行?
danielinbiti 2012-03-14
  • 打赏
  • 举报
回复
1.首先消息有没有发过来,是接收不对还是没发过来
2.人为断开把socket也释放吧,如果要检测网络是否连接正常,加上心跳
3.关键你socket有没有close,如果没有close,那么连接通道还是存在。
futosky 2012-03-13
  • 打赏
  • 举报
回复
单独开的线程如下:

//A模块连接处理线程
private void startServerA() throws IOException, InterruptedException
{
//ServerSocketA.Listen(9220);
ServerSocket server=new ServerSocket(9220);
Socket socket=server.accept();
//连接成功继续执行
ModuleAConnected=1;
Message message = new Message();
message.what = MainFrame.CONNECT_A;
MainFrame.this.myHandler.sendMessage(message);

while(socket.isClosed()==false)
{
//ServerSocketA.GetData(ReceivebufferA);
InputStream in=socket.getInputStream();
//InputStream in=ServerSocketA.socket.getInputStream();
ReceivebufferA=new byte[in.available()];
in.read(ReceivebufferA);

Message messageData= new Message();
messageData.what = MainFrame.GETDATA_A;
MainFrame.this.myHandler.sendMessage(messageData);
Thread.sleep(100);
}
ModuleAConnected=0;
Message messageClose = new Message();
messageClose.what = MainFrame.CLOSED_A;
MainFrame.this.myHandler.sendMessage(messageClose);
}


Hander处理:

Handler myHandler = new Handler()
{
public void handleMessage(Message msg)
{
switch (msg.what)
{
case MainFrame.CONNECT_A:
{
ButtonConnectA.setText("连接成功");
break;
}
case MainFrame.CLOSED_A:
{
ButtonConnectA.setText("等待连接中");
ButtonConnectA.setEnabled(true);
break;
}
case MainFrame.GETDATA_A:
{
String msg1 =new String(ReceivebufferA);
Toast tA=Toast.makeText(getApplicationContext(),msg1, Time);
tA.show();
ButtonConnectA.setText(msg1);
break;
}
}
super.handleMessage(msg);
}
};

在PC机上使用VB的winsock控件
1、winsock.SendData "hello" 为什么接收不到?
2、怎么才能判断连接连接是否断开?
3、为什么accept()应该只是执行了一次,而
winsock.connect方法可以在断开后还能再连接成功?
futosky 2012-03-10
  • 打赏
  • 举报
回复
谢谢回答,原本是打算每个新的Activity对应一个子模块,接收每个子系统传利用socket来的信息,实时显示结果,如果用Hander的话是不是可以不传递socket直接刷新新开启的Activity界面?
danielinbiti 2012-03-10
  • 打赏
  • 举报
回复
1。为什么要传递socket,线程可以独立于activity的,会为什么要设计成在Activity里呢,java有这么多的设计模式呢。
2。线程不能直接操作UI
3。正常的java socket接收就行

80,493

社区成员

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

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