我在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主线程中进行了网络操作。 查看原帖>> ...
手机屏幕上总是出来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...