问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

我在Android开发上,想要连接socket。报错NetworkOnMainThread这么...

发布网友 发布时间:23小时前

我来回答

1个回答

热心网友 时间:3小时前

耗时的子程序不许放在主线程中,你得用线程运行它。
错误就是你的 网络操作在主线程中;

package com.Android.tcpchat;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.net.ServerSocket;
import java.net.Socket;
//import java.text.SimpleDateFormat;
//import java.util.Date;
import java.util.Vector;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class MainActivity extends Activity {

//--------Socket服务端----------------------
TextView textView1;
ServerSocket serverSocket;
Handler sHandler;
Vector<Socket> vector; // 管理客户
//--------Socket客户端----------------------
TextView textView2;
EditText editText1;
Button button1;
Button button2;
Socket clientSocket;
Handler cHandler;
//--------Socket服务端----------------------
Handler timer_handler;
Runnable timer_runnable;
void initTimer() // 初始定时器
{
timer_handler=new Handler();
timer_runnable=new Runnable()
{
public void run()
{ //

timer_handler.postDelayed(this,1000); // this指runnable自已,再次启动
}
};
}
void startTimer() // 启动定时器
{
timer_handler.post(timer_runnable); // 立即执行runnable对象
}
void closeTimer() // 关闭定时器
{
timer_handler.removeCallbacks(timer_runnable);
}
//--------------------------------------------

void dispClients()
{ //显示所有客户
int n=vector.size();
String ss="\n"+n+" clients:\n";
for (int i=0;i<vector.size();i++)
{
Socket sk=vector.get(i);
String ip=sk.getInetAddress().toString();
String port=""+sk.getPort();
ss+=""+ip+","+port+"\n";
}
textView1.setText(ss);
}
void writeSocket(Socket sk,String s)
{ // 向客户端Socket发字符串
DataOutputStream outf;
try
{
outf=new DataOutputStream(sk.getOutputStream());
if (!sk.isClosed())
outf.writeUTF(s);
}
catch(Exception e)
{

}
}
void writeSock(final Socket sk,final String s)
{ // 子线程中向客户端Socket发字符串
new Thread(new Runnable()
{
@Override
public void run()
{
writeSocket(sk,s);
}
}).start();
}
void sendAll(final String s)
{ // 向所有管理中的客户Socket发串

for (int i=0;i<vector.size();i++)
{
Socket sk=vector.get(i);
writeSock(sk,s);
}
}

void readSocket(Socket sk)
{ // 服务端读Socket
DataInputStream inf;
try
{
inf=new DataInputStream(sk.getInputStream());
while(sk.isConnected() && !sk.isClosed())
{
String s=inf.readUTF();
if (s.length()>0)
{ // 读到字符串后,通知主程序处理
String ip=sk.getInetAddress().toString();
String port=""+sk.getPort();
s=ip+","+port+":"+s+"\n";
Message msg=sHandler.obtainMessage(1,s);
sHandler.sendMessage(msg);
}
}
}
catch(Exception e)
{
}
}
void readSock(final Socket sk)
{ // 子线程中读
new Thread(new Runnable()
{
@Override
public void run()
{
readSocket(sk);
}
}).start();
}

void listen(ServerSocket ssk) // 接受多个客户端连接请求
{
while (!ssk.isClosed())
try
{
Socket sk=ssk.accept();
vector.add(sk); // 有客户连接
readSock(sk);
// 通知刷新客户列表
Message msg=sHandler.obtainMessage(0,"");
sHandler.sendMessage(msg);
}
catch(Exception e)
{
}
}
void listen() // 线程接受多个客户端连接请求
{
new Thread(new Runnable()
{
@Override
public void run()
{
listen(serverSocket);
}
}).start();
}

//------------Socket客户端----------------------
Socket newSocket(String ip,int port)
{
Socket sk=null;
try
{
sk=new Socket(ip,port);
}
catch(Exception e)
{

}
return(sk);
}
void clientRead(Socket sk)
{ // 客户端读Socket
DataInputStream inf;
try
{
inf=new DataInputStream(sk.getInputStream());
while(sk.isConnected() && !sk.isClosed())
{
String s=inf.readUTF();
if (s.length()>0)
{
Message msg=cHandler.obtainMessage(2,s);
cHandler.sendMessage(msg);
}
}
}
catch(Exception e)
{

}
}
void clientRead(final String ip,final int port)
{ // 子线程中客户端读Socket
new Thread(new Runnable()
{
@Override
public void run()
{
Socket sk=newSocket(ip,port);
clientSocket=sk;
if (sk!=null)
clientRead(sk);
}
}).start();
}

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//---------------Socket服务端---------------------------------
textView1=(TextView)findViewById(R.id.textView1);
textView1.setText("");
//-----服务端的消息处理器sHandler
sHandler=new Handler()
{
@Override
public void handleMessage(Message msg)
{
switch (msg.what)
{
case 0:
dispClients(); // list clients
break;
case 1:
String s=msg.obj.toString();
sendAll(s);
break;
}
}
};
vector=new Vector<Socket>();
try
{
serverSocket=new ServerSocket(9003);
listen();
}
catch(Exception e)
{
}
//---------Socket客户端----------------------------------
cHandler=new Handler()
{ // 客户端消息处理器
@Override
public void handleMessage(Message msg)
{
String s=msg.obj.toString();
textView2.append(s);
}
};
clientRead("127.0.0.1",9003);
clientRead("10.0.2.15",9003);

textView2=(TextView)findViewById(R.id.textView2);
textView2.setText("");
editText1=(EditText)findViewById(R.id.editText1);
button1=(Button)findViewById(R.id.button1);
button1.setOnClickListener(new OnClickListener()
{
public void onClick(View v)
{
try
{
String s=editText1.getText().toString();
writeSock(clientSocket,s);
}
catch(Exception e)
{
}
} //public
});

button2=(Button)findViewById(R.id.button2);
button2.setOnClickListener(new OnClickListener()
{
public void onClick(View v)
{
try
{
String s="中华人民共和国";
writeSock(clientSocket,s);
}
catch(Exception e)
{
}
} //public
});

}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event)
{ // 按返回键的退出处理
if (keyCode == KeyEvent.KEYCODE_BACK )
{
try
{ // 防止出现端口已绑定的错误
serverSocket.close();
finish();
System.exit(0);
}
catch(Exception e)
{
}
}
return(false);
}

}
我在Android开发上,想要连接socket。报错NetworkOnMainThread这么...

package com.Android.tcpchat;import java.io.DataInputStream;import java.io.DataOutputStream;import java.net.ServerSocket;import java.net.Socket;//import java.text.SimpleDateFormat;//import java.util.Date;import java.util.Vector;import android.app.Activity;import android.os.Bundle;import ...

我的程序出现android.os.NetworkOnMainThreadException

从Honeycomb SDK(3.0)开始,google不再允许网络请求(HTTP、Socket)等相关操作直接在Main Thread类中,其实本来就不应该这样做,直接在UI线程进行网络操作,会阻塞UI、用户体验相当bad!即便google不禁止,一般情况下我们也不会这么做吧~还可以这样:在发起Http请求的Activity里面的onCreate函数里面添加如下...

android NetworkOnMainThreadException异常报错怎么改?

自己手动写一个线程,将访问网络的操作写到自己的线程中去,比如使用异步加载AsyncTask、new Thread等,Android在4.0后默认写在主线程UI线程中的网络操作会报这个异常。

网络请求不能放在主线程执行,不然可能发生以下报错

at android.os.StrictMode 1.resolveInetAddresses(Network.java:29)at com.android.okhttp.internal.http.RouteSelector.resetNextInetSocketAddress(RouteSelector.java:187)at com.android.okhttp.internal.http.RouteSelector.nextProxy(RouteSelector.java:156)at com.android.okhttp.internal.http.Ro...

哪位大神可以帮我读一下LogCat的内容,问题出在哪里

避免主线程被阻塞。造成这样的错误原因是代码不符合Android规范,如果把上面访问方式改为异步操作就不会出现在4.0上访问出现 android.os.NetworkOnMainThreadException异常,需要网络操作的部分必须放到线程中,简单的说就是你在ui主线程中进行了网络操作。 查看原帖&gt;&gt; ...

手机屏幕上总是出来timeout是什么原因

本人遇到的情况就是,在一些2.X系统手机上访问URL正常,但是在4.x系统手机上就报错:03-07 13:17:06.132: E/ConnectionManager(25522): android.os.NetworkOnMainThreadException 或者一些Timeout的异常 通过查阅相关资料,发现,自从Android 2.3之后,系统增加了一个类:StrictMode。这个类对网络的访问...

android 7.0对开发者会有哪些影响

呈现出这种行为的应用引发 android.os.NetworkOnMainThreadException。一般情况下,我们不建议在主线程上执行网络操作,因为这些操作通常都有可能导致 ANR 和卡顿的高尾延迟。Debug.startMethodTracing() 方法族现在默认在您的共享的存储空间上的软件包特定目录中存储输出,而非 SD 卡顶级。 这意味着应用不再需要请求WRITE...

安卓FATAL EXCEPTION: main

看了错误的大概意思是我写的activity找不到,但看在Manifest的activity部分是正确的,后来仔细对比了一下我这个工程与自动生成的工程的差异,发现我的src下的activity包名与gen下的包名不同,而自动生成的包名是相同的,GEN下的包名是我建立工程时填写的包名,然后我修改GEN下的包名(应该直接修改SRC下的...

android 微信7.0怎么获取存储权限

呈现出这种行为的应用引发android.os.NetworkOnMainThreadException。一般情况下,我们不建议在主线程上执行网络操作,因为这些操作通常都有可能导致ANR和卡顿的高尾延迟。Debug.startMethodTracing()方法族现在默认在您的共享的存储空间上的软件包特定目录中存储输出,而非SD卡顶级。这意味着应用不再需要请求WRITE_EXTERNAL_...

如何搭建 android 开发环境

closesocket(sockConn);} } 他采用了一个while死循环去监听客户端的请求。先上源代码 public final class ActivityThread { public static void main(String[] args) { SamplingProfilerIntegration.start();CloseGuard.setEnabled(false);Environment.initForCurrentUser();EventLogger.setReporter(new Event...

android连接socket socket websocket androidsocket框架 Aeron rsocket socket连接错误 websocket连接 websocket无法连接 rsocket长连接 socket无法连接
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
电动车遥控锁住了遥控丢了怎么办 ...我想知道能不能先用4:3模板,然后改成16:9的比例? word的标题底纹是怎么弄的word的标题底纹是怎么弄的图片 身份证的证照编号是多少 华晨雨张杰林俊杰徐良属于什么类型 QQ空间发说说..手机root了改哪个文件能自定义手机型号尾巴.._百度知... ...如果说人们遇见这种鸟会怎么样?是好或不好? 我是冠军青岛啤酒·我是冠军 救救我家哈士奇老打喷嚏流浓涕和喘急谢谢 哈士奇状态不好没精神怎么办?警惕犬瘟疾病! 体表皮肤裂伤处理原则及注意事项 左手手指裂伤 缝了六针 今天是第八天 请问什么时候拆线最好呢 拆线多... 手裂口子抹红霉素软膏管用吗 手流血了怎么止血 撕裂伤口多久长好 南极洲的气候有哪些 BIGBANG LOVESONG MV大约花了多少钱 信阳市适合情侣玩的地方,南湾湖景区里面有酒店吗 粉底棒和气垫哪个好用 有哪些丽江古城的游玩攻略可以分享? 凹凸世界最强角色是什么_凹凸世界最强角色排行榜一览 我快递一箱芒果结果到目的地后没给我送,又把芒果错派到其它地方呆误_百... 海南寄芒果到江苏徐州的费用跟时间 芒果名学魔盒什么时候发货 荣耀9和华为P10哪个更值得购买? 是以众议举宠为督的下一句是以众议举宠为督的下一句是什么 2024年10月26日适合剃头吗 2024年10月剃头吉日一览表 2024年10月15日剃头吉日一览表 2024年10月15日是剃头的黄道吉日吗_百度... 2024年10月12日适合剪头发吗 2024年10月剪头发吉日一览表 2024年10月15日适合剪头发吗 2024年10月剪头发吉日一览表 从Linux源码角度看套接字的Listen及连接队列 泰拉瑞亚里面比较吊的稿子怎么获得 合肥学院历届主要领导 杨承宗人物生平 安徽 合肥学院 91年的 校长叫什么名字? ...时间比较充裕~想多去几个地方~我们做火车道苏州。希望有人能帮我... 晚上睡觉牙齿出血,早上满口腔是血是怎么回事 每次睡觉起来,吐口水里带血 是怎么回事。 不管是早上还是睡一个小时... 我牙龈老出血,晚上睡觉,第二天早上,嘴里都有发黑的血渍,这是咋的了... ...了一句歌词:你是个匿名的宝贝,藏在我心里飞呀飞,如果有 发动机机油的五大作用是什么? 单片机中位地址7CH与字节地址7CH具体如何区分? 沈阳辽宁中医药大学到南塔客运站最快的到达方式要多长时间 245路公交凤城八路坐太元路多长时间 阜新到通辽多远多少公里:距离245公里,通辽到阜新旅游攻略自驾 滨州自驾游到锦州锦州古塔要多长时间 广州开车到湛江需要多久,广州去湛江自驾旅游线路 未出席的业主大会会议决定是否有效 业主大会怎么决议才有效 设置表格边框0.75磅