Android实现TCP通信出现NetworkOnMainThreadException,怎么在子线程实例化Socket?

程序能跑起来就好(っ•̀ω•́)っ✎⁾⁾ ,错误出现在客户端

//服务器端
public class TCPServer {
    public static void main(String args[]) {
        try {
            //为服务器指定一个大于1024的端口号
            ServerSocket serverSocket = new ServerSocket(8888);
            while (true) {
                System.out.println("等待接收客户端的连接::");
                Socket socket = serverSocket.accept();

                System.out.println("建立连接成功!");

                //读取客户端发来的信息
                BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                String str = in.readLine();
                System.out.println("客户端发来的信息:" + str);

                //向客户端发送消息
                PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter
                        (socket.getOutputStream())), true);
                out.println("He11o,I am Server!");
                in.close();
                out.close();
                socket.close();
                serverSocket.close();//
            }
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("服务开启失败");//
        }
    }
}


//客户端
public class MainActivity extends ActionBarActivity {

    private Socket mysocket;
    private EditText clientText;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        clientText = (EditText) findViewById(R.id.ClientText);

        try {
            //指定服务器的IP地址和服务器端口,和服务器端建立连接
                        //实例化mysocket出现错误
            mysocket = new Socket("192.168.1.108", 8888);

            //通过PrintWriter向服务器发送信息
            String cmessage = "I am client!";
            PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter
                    (mysocket.getOutputStream())), true);
            out.println(cmessage);
            System.out.println(cmessage);////////

            //通过BufferedReader读取服务器发送过来的信息
            BufferedReader br = new BufferedReader(new InputStreamReader(mysocket.getInputStream()));
            String smessage = br.readLine();

            //将信息显示在输入框中
            clientText.setText(smessage);

            out.close();
            br.close();
            mysocket.close();
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("与服务器连接失败!");
        }

    }

}

1个回答

new socket 写在子线程里 图片说明

qq_42660156
追忆~似水年华 回复简单吗: mysocket = new Socket("192.168.1.100", 8888);前面的日志有,后面的就没了,还是老问题,不过这次没有出错
6 天之前 回复
qq_20800531
简单吗 这。。。。创建线程、开启线程 没啥毛病才对啊,你再研究研究吧,奥里给!
6 天之前 回复
qq_42660156
追忆~似水年华 回复简单吗: 线程没有运行
6 天之前 回复
qq_20800531
简单吗 回复追忆~似水年华: 你写上log日志看看有没有走到那些代码里
6 天之前 回复
qq_42660156
追忆~似水年华 用了这个后运行Activity没有显示,不知道是什么情况
6 天之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
Python+OpenCV计算机视觉

Python+OpenCV计算机视觉

android TCP通信,包头问题

请问大家 , android里面进行TCP通讯,手机作为客户端,问题是,如何获取从服务端发送过来的消息中的包头数据?

Android作为Socket通信客户端的代码分析

基于Android Studio编写Socket的客户端,与基于Python的Socket服务器进行通信。 这是MainActivity相关代码: ``` import android.annotation.SuppressLint; import android.os.Handler; import android.os.Message; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.Button; import android.view.View.OnClickListener; import android.os.Bundle; import android.widget.EditText; import android.widget.TextView; import android.widget.Toast; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.net.Socket; public class MainActivity extends AppCompatActivity { private TextView result = null; private TextView result2 = null; private static final String HOST = "192.168.80.100"; private static final int PORT = 12345; private Socket socket = null; private BufferedReader bufferedReader = null; private PrintWriter printWriter = null; private String content = ""; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); final EditText eturl= findViewById(R.id.eturl); Button btn= findViewById(R.id.btn); result = findViewById(R.id.result); result2 = findViewById(R.id.result2); initSocket(); btn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { String msg; msg = eturl.getText().toString(); if (socket.isConnected()){ if (!socket.isOutputShutdown()){ Toast.makeText(MainActivity.this,"正在发送,请稍等……",Toast.LENGTH_LONG).show(); sendMsg(msg); result.setText("正在连接" + HOST + "\n" + "发送URL" + "\n" + "等待接收检测结果" + "\n"); recv(); } } } }); } public void sendMsg(final String msg){ new Thread(new Runnable() { @Override public void run() { if(socket.isConnected()){ if(!socket.isOutputShutdown()){ printWriter.println(msg); } } } }).start(); } public void initSocket(){ new Thread(new Runnable() { @Override public void run() { try{ socket=new Socket(HOST,PORT); bufferedReader=new BufferedReader(new InputStreamReader(socket.getInputStream())); printWriter=new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())),true); }catch (Exception e){ e.printStackTrace(); } } }).start(); } public void recv(){ new Thread(new Runnable() { @Override public void run() { try{ while (true){ if(socket.isConnected()){ if(!socket.isInputShutdown()){ if((content = bufferedReader.readLine()) != null){ content += "\n"; mhandler.sendMessage(mhandler.obtainMessage()); }else{ } } } } }catch (Exception e){ e.printStackTrace(); } } }).start(); } @SuppressLint("HandlerLeak") public Handler mhandler = new Handler(){ public void handleMessage(Message msg) { super.handleMessage(msg); result2.setText(content); } }; } ``` 目前可以正常发送,但接收时有些问题,收不到,安卓客户端没有任何显示。服务器端用另外基于Python的客户端测试过,没问题,应该就是安卓客户端与接收有关的代码可能有问题。 从上面的代码中能看出有什么不妥吗,急求大神指点!!!

android tcp接收数据问题

我要实现一个功能就是在android客户端点击一个dialog的确定按钮之后,提交数据并接收服务端返回的数据,目前提交的数据服务器端是可以接收的到,但是服务器端返回的数据却接收不到。我的客户端代码如如图。![图片说明](https://img-ask.csdn.net/upload/201702/22/1487741939_677082.jpg)![图片说明](https://img-ask.csdn.net/upload/201702/22/1487741946_899437.jpg)![图片说明](https://img-ask.csdn.net/upload/201702/22/1487741956_208220.jpg)接收的时候总是在in.readline位置就停止了,然后报异常说 socket close。请问要怎么解决啊。

android tcp通信如何做到心跳管理

我想实现一个TCP通信:点击登陆后将用户名和密码打包(包为bytes)发送给服务器后,服务器发送包给客户端。 登陆成功后还需要做两个动作:1、客户端没隔30S给客户端发送一次bytes ;2、当服务器有数据过来时,客户端自动接收数据。 现在的问题是我是做两个线程还是做一个线程呢。我做了两个线程,一个接一个发,但是我怎么实现第二点呢。哪位大神可以给我点详细的指点么。本人新手,菜鸟一个。跪求大神指点。

局域网下两台电脑如何进行TCP通信

局域网下两台电脑如何进行TCP通信 现在需要软件与硬件进行通信 主要通过TCP/UDP进行通信

Android 用socket实现语音通信

Android 用socket实现语音通信,最好能是跟server一起,使其能长连接

androidSocket通信TCP接收数据问题

rivate Button send; private TextView rec; private static Socket client; private PrintWriter write; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); rec=(TextView)findViewById(R.id.textView3);; Thread aa=new Thread(new Runnable() { @Override public void run() { // TODO Auto-generated method stub try { //服务器的ip的地址 和端口号 client=new Socket(InetAddress.getByName("192.168.1.101"),4312); BufferedReader read=new BufferedReader (new InputStreamReader(client .getInputStream())); rec.setText("123"); String s = ""; while(true){ s=read.readLine(); rec.setText(s); } } catch(IOException e){ rec.setText("123123"); } } }); aa.start(); } 在 while(true){ s=read.readLine(); rec.setText(s); }为什么只能接收服务器的一次消息第二次手机就会跳出程序

JAVA TCP与硬件通信!!

大佬们好,作为客户端的Java程序,利用TCP与硬件通信,在通信的过程中往往由于网络的原因导致指令无法完整的到达硬件设备,或者在与硬件通信过程中存在Java程序TCP客户端的响应速度过快(过快:就是客户端主动关闭了socket长连接)导致硬件在接收指令的时候,只接收到了一部分,这种情况下本人不知道利用什么技术去做这样的特殊处理,望有懂得的大佬给予一些指导建议,万分感谢!

安卓和C# 用TCP通信发送数据

目前在做一个程序,安卓手机每一秒钟向PC机发送若干条数据,有可能一台机器发,也有可能若干台同时发,PC机用C#接收数据。我测试了一台安卓发数据可以正常接收,可是当若干台同时发数据的时候,就出现问题了。后来我发现不知道为什么,这些安卓设备的IP地址用DHCP自动获取IP的时候IP都是一样的,我想会不会就是因为两个相同IP的机器发送数据的时候,因为后来发后数据的机器会把原先正在发送的机器建立的TCP通信链接给关掉然后自己在发送数据,现在由于实验室路由器比较特殊,我没有权限改成静态获取,所以在此问一下是不是因为这个原因出的错,下面列出代码,麻烦大家帮忙看一看,出错的地方我用注释标记出来了 安卓端发送数据代码 ``` public void sendToPC(String data){ try { s =new Socket("192.168.0.104",8730); } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } DataOutputStream dout=null; try { dout =new DataOutputStream(s.getOutputStream()); Thread.sleep(50, 0); dout.writeBytes(data); dout.flush(); }catch(Exception e){ } } ``` C#段代码 ``` private void listenConnect() { while (true) { tcpClient = myListener.AcceptTcpClient(); //获取网络流 User user = new User(tcpClient); Thread receiveThread = new Thread(receiveData); receiveThread.IsBackground = true; receiveThread.Start(user); } } string receiveString = ""; public void receiveData(object u) { User user = (User)u; NetworkStream netStream1 = user.client.GetStream(); while(true){ byte[] myReadBuffer = new Byte[1024]; int numberOfBytesRead = 0; StringBuilder myCompleteMessage = new StringBuilder(); int nodeId = 0; do { numberOfBytesRead = netStream1.Read(myReadBuffer, 0, myReadBuffer.Length);//出错总是在这一句,提示错误“远程主机主动关闭现有连接” myCompleteMessage.AppendFormat("{0}", Encoding.UTF8.GetString(myReadBuffer, 0, numberOfBytesRead)); } while (netStream1.DataAvailable); receiveString = myCompleteMessage.ToString(); string[] receivearr = receiveString.Split('!'); for (int i = 0; i < receivearr.Length-1;i++ ) { string[] infoarr = receivearr[i].Split('#'); DoWork(infoarr[1], infoarr[0]); } } } } ```

怎么在Android上实现ping tcp和udp,求帮助

怎么在Android上实现ping tcp和udp,最好有第三方框架介绍一下

VBnet的TCP通信问题, 希望各位大神指点一下

希望各位大神指点一下 最近开始学习VBnet的TCP通信 https://bbs.csdn.net/topics/392454709?page=1 完全按照上面网站的方法进行编写程序时,点击按钮1时,报以下错误 ![图片说明](https://img-ask.csdn.net/upload/201811/07/1541581013_316714.png) 想问下是什么原因,怎样解决 顺便问下,VBnet的TCP通信,应该怎样去学习,本人会一点VBnet,但对于TCP完全不懂,怎么学习才好?

java实现tcp的多客户端通信时,每个客户端只能通信一次

每个客户端与服务端只能通信一次,第二次通信就会抛出连接异常,求大神指导

基于Android 实现局域网内设备之间的通信(物联网)

1.硬件设备有,称重机器,网络摄像头,还有主控机器(单片机,modbus协议),主要是通过手机端的Android应用程序去控制主控设备进行拍照和称重等操作,然后把数据上传到服务器,除了手机把采集到的信息上传到服务器以外的一切操作是基于局域网去完成的,不需要外网。我现在遇到的问题是不知道怎么在android 应用程序(已经开发了的)当中添加这部分功能。该怎么上手?有没有大神可以帮我分析一下?小型局域网,用tcp协议好还是udp协议好?

TCP通信 数据接收 数据分析

我在用c++做TCP客户端 建立连接之后能够向服务器端发送数据 但是新建立的线程用来接收服务器的回发数据 并进行数据分析 再输出 ~~ 一直接收不到数据~~有木有大神给个例子 参考下 980020740@qq.com

安卓端,请问下TCP通讯是否只能用于局域网?两台非局域网的手机如何建立通讯?

通过代码测试及应用商店已有应用“网络测试”app都测试了,发现只有两部手机连接同一个WIFI才能建立连接,手机各自使用流量时无法建立连接。那非局域网的设备间应该怎么通讯呢?

Android与服务器采用tcp长连接传输数据的弊端

在做一个项目,有一个实时的统计的需求,想用tcp建立长连接来实现,但是感觉长连接会很耗电,有没有大神做过这方面的研究,想知道一下使用tcp长连接的利弊,会有哪些用户体验上面的影响

Android和linuxTCP服务器通信收到乱码

![图片说明](https://img-ask.csdn.net/upload/202002/14/1581649251_810291.png)![图片说明](https://img-ask.csdn.net/upload/202002/14/1581649262_395607.png)![图片说明](https://img-ask.csdn.net/upload/202002/14/1581649272_590169.png)![图片说明](https://img-ask.csdn.net/upload/202002/14/1581649288_572156.jpg)![图片说明](https://img-ask.csdn.net/upload/202002/14/1581649299_853323.png) 求助啊~~~~~~~~~~~~~~~~如图 安卓收到的是乱码 我用c测试过服务器端的代码 可以收到合适的数据,安卓代码就不行了 看看是哪里除了问题呢

java web端实现TCP服务器端开发

需求是这样的: 有一个通讯模块是采用的TCP/UDP通讯协议,现在公司要求做一个接口,来实现基于TCP协议的服务器端开发,要求接口部署到WEB应用服务器WebLogic中之后就开始对本地某个端口进行监听,获取客户端的请求

如何修复 android.os.networksonmainthreadexception?

<div class="post-text" itemprop="text"> <p>I got an error while running my Android project for RssReader. </p> <p>Code:</p> <pre><code>URL url = new URL(urlToRssFeed); SAXParserFactory factory = SAXParserFactory.newInstance(); SAXParser parser = factory.newSAXParser(); XMLReader xmlreader = parser.getXMLReader(); RssHandler theRSSHandler = new RssHandler(); xmlreader.setContentHandler(theRSSHandler); InputSource is = new InputSource(url.openStream()); xmlreader.parse(is); return theRSSHandler.getFeed(); </code></pre> <p>And it shows the below error:</p> <pre><code>android.os.NetworkOnMainThreadException </code></pre> <p>How can I fix this issue?</p> </div> <p>转载于:https://stackoverflow.com/questions/6343166/how-do-i-fix-android-os-networkonmainthreadexception</p>

2019 Python开发者日-培训

2019 Python开发者日-培训

150讲轻松搞定Python网络爬虫

150讲轻松搞定Python网络爬虫

设计模式(JAVA语言实现)--20种设计模式附带源码

设计模式(JAVA语言实现)--20种设计模式附带源码

YOLOv3目标检测实战:训练自己的数据集

YOLOv3目标检测实战:训练自己的数据集

java后台+微信小程序 实现完整的点餐系统

java后台+微信小程序 实现完整的点餐系统

三个项目玩转深度学习(附1G源码)

三个项目玩转深度学习(附1G源码)

初级玩转Linux+Ubuntu(嵌入式开发基础课程)

初级玩转Linux+Ubuntu(嵌入式开发基础课程)

2019 AI开发者大会

2019 AI开发者大会

玩转Linux:常用命令实例指南

玩转Linux:常用命令实例指南

一学即懂的计算机视觉(第一季)

一学即懂的计算机视觉(第一季)

4小时玩转微信小程序——基础入门与微信支付实战

4小时玩转微信小程序——基础入门与微信支付实战

Git 实用技巧

Git 实用技巧

Python数据清洗实战入门

Python数据清洗实战入门

使用TensorFlow+keras快速构建图像分类模型

使用TensorFlow+keras快速构建图像分类模型

实用主义学Python(小白也容易上手的Python实用案例)

实用主义学Python(小白也容易上手的Python实用案例)

程序员的算法通关课:知己知彼(第一季)

程序员的算法通关课:知己知彼(第一季)

MySQL数据库从入门到实战应用

MySQL数据库从入门到实战应用

机器学习初学者必会的案例精讲

机器学习初学者必会的案例精讲

手把手实现Java图书管理系统(附源码)

手把手实现Java图书管理系统(附源码)

极简JAVA学习营第四期(报名以后加助教微信:eduxy-1)

极简JAVA学习营第四期(报名以后加助教微信:eduxy-1)

.net core快速开发框架

.net core快速开发框架

玩转Python-Python3基础入门

玩转Python-Python3基础入门

Python数据挖掘简易入门

Python数据挖掘简易入门

微信公众平台开发入门

微信公众平台开发入门

程序员的兼职技能课

程序员的兼职技能课

Windows版YOLOv4目标检测实战:训练自己的数据集

Windows版YOLOv4目标检测实战:训练自己的数据集

HoloLens2开发入门教程

HoloLens2开发入门教程

微信小程序开发实战

微信小程序开发实战

Java8零基础入门视频教程

Java8零基础入门视频教程

相关热词 c#跨线程停止timer c#批量写入sql数据库 c# 自动安装浏览器 c#语言基础考试题 c# 偏移量打印是什么 c# 绘制曲线图 c#框体中的退出函数 c# 按钮透明背景 c# idl 混编出错 c#在位置0处没有任何行
立即提问