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连接使用的是"请求-响应方式",即在请求时 ...
随机推荐
- appium 爬取微信的相册内容(不知什么时候能写完)
# crowl wechat through appium from appium import webdriver from selenium.webdriver.support.ui import ...
- navicat连接mysql出现2059错误的解决方法
安装navicat之后新建连接出现了2059的错误 网上查询过后,发现这个错误出现的原因是在mysql8之前的版本中加密规则为mysql_native_password,而在mysql8以后的加密规则 ...
- 小白月赛22 D : 收集纸片
D:收集纸片 考察点 : 全排列,对数据范围的估计程度 坑点 : 注意算最后回到初始的那步距离 析题得侃 : 一看题目最短路,诶呦,这不是最拿手的 BFS 走最短路吗?哈哈,定睛一看 这么多目的地,这 ...
- R语言函数化编程笔记2
R语言函数化编程笔记2 我学过很多的编程语言,可以我写的代码很啰嗦,一定是我太懒了.或许是基础不牢地动山摇 1.为什么要学函数 函数可以简化编程语言,减少重复代码或者说面向对象的作用 2.函数 2.1 ...
- [CF1034A] Two Rabbits - 数学
判断能否整除即可 #include <bits/stdc++.h> using namespace std; int x,y,a,b; int main() { int t; ios::s ...
- Wannafly Camp 2020 Day 7H 游戏 - 欧拉筛,GCD
忘记特判 \(1\) ,血了一地 听说 \(O(n^2 \log n)\) 能过? #include <bits/stdc++.h> #define int long long using ...
- Redis 数据总结(1 数据导入)
理论基础部分:http://www.redis.cn/topics/mass-insert.html 几百上千万的数据建议使用pipe来完成导入. 1.windows 下数据导入命令: type ou ...
- Docker学习一篇就够了
Docker 1.简介 Docker是一个开源的应用容器引擎:是一个轻量级容器技术: Docker支持将软件编译成一个镜像:然后在镜像中各种软件做好配置,将镜像发布出去,其他使用者可以直接使用这个镜像 ...
- xmlns:android="http://schemas.android.com/apk/res/android 这句话的作用
xmlns:android="http://schemas.android.com/apk/res/android 有了这句话,你就可以alt+/作为提示,提示你输入什么,不该输入什么,什么 ...
- Docker最全教程——从理论到实战(十四)
本篇教程主要讲解基于容器服务搭建TeamCity服务,并且完成内部项目的CI流程配置.教程中也分享了一个简单的CI.CD流程,仅作探讨.不过由于篇幅有限,完整的DevOps,我们后续独立探讨. 为了降 ...