Android Socket 通信
Android socket 通信
安卓编写Socket客户端,实现连接Socket服务端通信。
创建Socket连接并获取服务端数据
先创建几个全局变量吧
private BufferedWriter writer = null;
Socket socket;
创建Socket
// 填好IPV4的IP地址和端口,服务端会提供,问服务端要
socket = new Socket("192.168.1.156", 1234);
// 下面三句照抄就行
writer = new BufferedWriter(new OutputStreamWriter(
socket.getOutputStream()));
InputStream inputStream = socket.getInputStream();
DataInputStream input = new DataInputStream(inputStream);
// 创建一个字节数组用来接收服务端发来的字节流,多大自己说了算
byte[] b = new byte[100000];
// 写一个死循环,不停的接收服务端发来的数据
while (true) {
// 将数据读入字节数组,返回长度
int length = input.read(b);
// 如果服务端没发数据就return不在往下执行,继续读数据
if (length <= 0) return;
// 如果服务端发的数据不为空,则把字节数组转成字符串
msg = new String(b, 0, length, "gb2312");
// 后边就可以调用数据解析的方法
....
}
一般的通讯格式都是Json的,查一下把json格式的字符串转换成json对象然后根据key值获取value的代码:
// 其中,data是json格式的字符串,转换成了jsonObject对象
JSONObject jsonObject = new JSONObject(data);
// 获取jsonObject对象的device_id值,当然device_id是String类型的,如果是int就用int
String i = jsonObject.getString("device_id");
发送数据给服务端
发送数据给服务端的前提是已经完成了Socket连接
// 首先判断一下socket是不是已经创建连接了,如果没有就不管它
if (socket == null) return;
// str是准备发给服务端的字符串
writer.write(str);
// 发出去(留坑,继续看完)
writer.flush();
这就完成了Android编写Socket与服务端通信的功能。但是这个Socket IPV4的地址可以,IPV6的地址我没试过,听说好像有点问题,但是大部分都用IPV4,如果真的用到IPV6的话,再百度!
纠错
问题来咯!!!
我遇到的大坑!
在很早之前我开发的时候上面的操作编写方式完全没问题!
但是,昨天我写的时候发现会报错!报错在 writer.flush() 这个地方。
百度之后发现:
老版的android不会有问题,但是新版本的android(好像是sdk10以上)已经不允许在UI线程(主线程)中发起网络请求了,会抛出NetWorkInUIThreadException。
所以说给服务端发送数据的时候需要写到子线程里。
new Thread(new Runnable() {
@Override
public void run() {
// 首先判断一下socket是不是已经创建连接了,如果没有就不管它
if (socket == null) return;
// str是准备发给服务端的字符串
writer.write("我是Android客户端发的数据");
// 发出去
writer.flush();
}
}).start();
这样就开一个子线程,在子线程中编写发送数据的代码或调用发送数据的方法就没问题了!
留坑!
生命不息,留坑不止!!
如果我们把发送数据的代码封装成一个方法,并且发送的数据需要方法传参,比如:
public void sendData(String str){
new Thread(new Runnable() {
@Override
public void run() {
// 首先判断一下socket是不是已经创建连接了,如果没有就不管它
if (socket == null) return;
// str是准备发给服务端的字符串,会报错,传进来的参数子线程进不来
writer.write(str);
// 发出去
writer.flush();
}
}).start();
}
发现父线程传进的参数,子线程读不到,我郁闷了好久,自己写了个内部类解决了。
/**
* 接口类,实现主线程向子线程传值
*/
class sendData implements Runnable {
String str;
public sendValueToServer(String str) {
this.str = str;
}
@Override
public void run() {
try {
// 如果socket连接失败,则停止执行
if (socket == null) return;
// 发送传进来的值
writer.write(str);
// 发出去
writer.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
}
然后在需要发送的地方写:
new Thread(new sendData ("传值数据")).start();
完成!哈哈哈,刺激!
Android Socket 通信的更多相关文章
- Android Socket通信详解
一.Socket通信简介 Android与服务器的通信方式主要有两种,一是Http通信,一是Socket通信.两者的最大差异在于,http连接使用的是“请求—响应方式”,即在请求时建立连接通道,当客 ...
- 浅谈android Socket 通信及自建ServerSocket服务端常见问题
摘 要:TCP/IP通信协议是可靠的面向连接的网络协议,它在通信两端各建立一个Socket,从而在两端形成网络虚拟链路,进而应用程序可通过可以通过虚拟链路进行通信.Java对于基于TCP协议的网络通 ...
- Android Socket通信
1.TCP: xml: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns: ...
- Android Socket通信编程
安卓客户端通过socket与服务器端通讯一般可以按照以下几个步骤:(1).通过IP地址和端口实例化Socket,请求连接服务器:socket = new Socket(HOST, PORT); //h ...
- JAVA ANDROID SOCKET通信检测(SERVER)连接是否断开
Pre 解决思路 代码后记: 客户端app上的部分代码 调用: 服务器上: 客户端判断服务器是否还活着代码: PRE 在利用socket写通讯程序的时候,想检测服务器是否还活着. 从网上找了很多资料, ...
- Android Socket编程学习笔记
http://blog.csdn.net/eyu8874521/article/details/8847173 度娘给出的描述:通常也称作"套接字",用于描述IP地址和端口,是一个 ...
- Android Socket编程
花了大概两天的时间,终于把Android的Socket编程给整明白了.抽空和大家分享一下: Socket Programming on Android Socket 编程基础知识: 主要分服务器端编程 ...
- Android之Socket通信、List加载更多、Spinner下拉列表
Android与服务器的通信方式主要有两种,一是Http通信,一是Socket通信.两者的最大差异在于,http连接使用的是“请求—响应方式”,即在请求时建立连接通道,当客户端向服务器发送请求后,服务 ...
- Android开发--Socket通信
一.Socket通信简介 Android与服务器的通信方式主要有两种,一是Http通信,一是Socket通信.两者的最大差异在于,http连接使用的是"请求-响应方式",即在请求时 ...
随机推荐
- link(外部资源关系)
规定了外部资源与当前文档的关系 常于链接样式表<link href="/media/examples/link-element-example.css" rel=" ...
- C语言 小技巧函数方法总结
1.使用^(异或) 不引入第三变量交换两个变量的值. /* 交换 int a 和 int b 的值*/ #include <stdio.h> int main(int argc, char ...
- linux 搭建python虚拟环境
requirements.txt 包含paramiko,pysfp.setuptools,适用python版本3.6.6+ 前提编译安装python wget wget https://www.pyt ...
- Netty中CompositeByteBuf的理解以及读写操作
转载请注明出处 https://www.cnblogs.com/majianming/articles/the_composite_byte_buf_read_and_wite_operation_o ...
- 安装配置oracle11gR2、client、plsql developer及学习
本文是一个目录,以后会持续更新 1,安装oracle11gR2 https://www.cnblogs.com/suterfo/p/10659208.html 2,安装oracle client及配置 ...
- .Net Core的总结
一.什么是.NET Core .NET Core是一个开源通用的开发框架,支持跨平台,即支持在Window,macOS,Linux等系统上的开发和部署,并且可以在硬件设备,云服务,和嵌入式/物联网方案 ...
- Python之六:模块
模块包含了大量的函数方法和变量,我们可以用下面的语句调用模块: import 模块名 这样我们就可以在后面的语句中使用模块中的函数或者变量了.调用时只需用 模块名.函数名的方式调用即可 from ...
- thinkphp5出现mkdir() Permission denied报错解决办法
如果没有runtime目录,则需要手动创建一个,并且给runtime添加权限: mkdir runtime chmod -R 777 runtime 报错如下:
- DataGridView 调整列顺序为设计的顺序
设置: dataGridView1.AutoGenerateColumns = false;
- 初识消息队列--ActiveMq
消息队列 即MessageQueue,是一种消息中间件,在遇到系统请求量比较大的情况下,导致请求堆积过多无法及时返回,可以通过它进行异步的消息处理,从而缓解系统压力. ActiveMq ActiveM ...