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 通信的更多相关文章

  1. Android Socket通信详解

    一.Socket通信简介  Android与服务器的通信方式主要有两种,一是Http通信,一是Socket通信.两者的最大差异在于,http连接使用的是“请求—响应方式”,即在请求时建立连接通道,当客 ...

  2. 浅谈android Socket 通信及自建ServerSocket服务端常见问题

    摘  要:TCP/IP通信协议是可靠的面向连接的网络协议,它在通信两端各建立一个Socket,从而在两端形成网络虚拟链路,进而应用程序可通过可以通过虚拟链路进行通信.Java对于基于TCP协议的网络通 ...

  3. Android Socket通信

    1.TCP: xml: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns: ...

  4. Android Socket通信编程

    安卓客户端通过socket与服务器端通讯一般可以按照以下几个步骤:(1).通过IP地址和端口实例化Socket,请求连接服务器:socket = new Socket(HOST, PORT); //h ...

  5. JAVA ANDROID SOCKET通信检测(SERVER)连接是否断开

    Pre 解决思路 代码后记: 客户端app上的部分代码 调用: 服务器上: 客户端判断服务器是否还活着代码: PRE 在利用socket写通讯程序的时候,想检测服务器是否还活着. 从网上找了很多资料, ...

  6. Android Socket编程学习笔记

    http://blog.csdn.net/eyu8874521/article/details/8847173 度娘给出的描述:通常也称作"套接字",用于描述IP地址和端口,是一个 ...

  7. Android Socket编程

    花了大概两天的时间,终于把Android的Socket编程给整明白了.抽空和大家分享一下: Socket Programming on Android Socket 编程基础知识: 主要分服务器端编程 ...

  8. Android之Socket通信、List加载更多、Spinner下拉列表

    Android与服务器的通信方式主要有两种,一是Http通信,一是Socket通信.两者的最大差异在于,http连接使用的是“请求—响应方式”,即在请求时建立连接通道,当客户端向服务器发送请求后,服务 ...

  9. Android开发--Socket通信

    一.Socket通信简介 Android与服务器的通信方式主要有两种,一是Http通信,一是Socket通信.两者的最大差异在于,http连接使用的是"请求-响应方式",即在请求时 ...

随机推荐

  1. P1341 无序字母对【欧拉路径】- Hierholzer模板

    P1341 无序字母对 提交 24.87k 通过 6.80k 时间限制 1.00s 内存限制 125.00MB 题目提供者yeszy 难度提高+/省选- 历史分数100 提交记录 查看题解 标签 福建 ...

  2. LeetCode 第二题 Add Two Numbers 大整数加法 高精度加法 链表

    题意 You are given two non-empty linked lists representing two non-negative integers. The digits are s ...

  3. JQ input输入框回车生成标签,可删除,并获取标签的值

    在网上找的,效果如下 html代码 <!DOCTYPE html> <html lang="zh-CN"> <head> <title&g ...

  4. 【你不知道的javaScript 上卷 笔记5】javaScript中的this词法

    function foo() { console.log( a ); } function bar() { var a = 3; foo(); } var a = 2; bar(); 上面这段代码为什 ...

  5. Wannafly Camp 2020 Day 5A Alternative Accounts

    There are n different accounts on the website, and some of them competed in the recent k contests. H ...

  6. PP: Deep r -th Root of Rank Supervised Joint Binary Embedding for Multivariate Time Series Retrieval

    from: Dacheng Tao 悉尼大学 PROBLEM: time series retrieval: given the current multivariate time series se ...

  7. 删除Eclipse中的SVN账号信息-SVN切换用户

    在eclipse中经常用到用svn进行代码版本控制,为了提交或更新代码的时候不反复地提示我们输入用户名和密码,于是我们就习惯把访问SVN的用户名密码自动保存起来. 以便下次自动使用,不要再次手工多次输 ...

  8. android 如何查看socket、websocket通信数据 抓包

    怎么使用可以自行百度

  9. mysql视图的创建、基本操作、作用

    一.mysql视图的创建 作用:提高了重用性,就像一个函数.如果要频繁获取user的name和goods的name.就应该使用以下sql语言.示例: 先创建3张表 1.1user表 1.2goods表 ...

  10. 荣耀TCL都玩智慧屏“噱头”,海信却引行业未来方向

    编辑 | 于斌 出品 | 于见(mpyujian) 如今手机联接我们生活方方面面的同时,大家却也由此习惯了低头示人.据美国的一家数据研究中心显示,目前中国智能手机普及率已达到68%,居民日均手机屏幕使 ...