转载请注明出处:http://blog.csdn.net/vnanyesheshou/article/details/74896575

之前做过的一个局域网内TCP通信、聊天的demo(当然不是局域网也可以进行通信,刚试了一下可以的),周日整理了一下。该demo可以做客户端,也可以做服务端。两个手机都安装该应用,一个做客户端、一个做服务端,然后进行通信(连接在同一局域网,或服务器是外网ip,客户端可以上网)。
20180728修改:Android7.0以上socket发送数据失败,需要将发送的操作放到子线程中,最新demo以更新。

demo下载地址:http://www.demodashi.com/demo/10567.html


1 简介

TCP(Transmission Control Protocol):传输控制协议,是一种面向连接的、可靠的、基于字节流的传输层通信协议。

在Internet协议族(Internet protocol suite)中,TCP层是位于IP层之上,应用层之下的中间层。不同主机的应用层之间经常需要可靠的、像管道一样的连接,但是IP层不提供这样的流机制,而是提供不可靠的包交换。

Socket 英文原义是“孔”或“插座”。通常称为”套接字”,用于描述IP地址和端口,是一个通信链的句柄,可以用来实现不同虚拟机或不同计算机之间的通信。在Internet上的主机一般运行了多个服务软件,同时提供几种服务。每种服务都打开一个Socket,并绑定到一个端口上,不同的端口对应于不同的服务(客户若是需要哪种服务,就讲插头连到相应的插座上),客户的“插头”也是一个socket。
Socket通信,需要服务端和客户端,两端都要实例化一个Socket。但服务器和客户端的Socket是不一样的。

  • 客户端:可以连接服务端、发送数据、接收数据、关闭连接等。
  • 服务端:可以实现绑定绑定端口,接收客户端的连接、接收数据,发送数据等。

Android在包java.net包下提供了ServerSocketSocket类,ServerSocket用于创建服务器的Socket。Socket用于实例化客户端的Socket。当连接成功,客户端和服务端都会产生一个Socket实例,通过此Socket进行通信。
先看下效果图:


2 服务端

服务端ServerSocket的构造方法有以下几种:

  • ServerSocket ():构造一个新的未绑定的ServerSocket。
  • ServerSocket (int port):构造一个新的ServerSocket并绑定到指定端口,如果port等于0,则端口由系统自动分配。
  • ServerSocket (int port, int backlog):构造一个新的ServerSocket并绑定到指定端口,并指定进入队列的数目。如果port等于0,则端口由系统自动分配。
  • ServerSocket (int port, int backlog, InetAddress localAddress):构造一个新的ServerSocket并绑定到指定端口和指定的地址,并指定进入队列的数目。如果port等于0,则端口由系统自动分配。如果localAddress为null,则可以使用任意地址。
  • -

TCP服务端工作具体步骤:
步骤1:创建一个ServerSocket,并绑定到指定端口上。

try {//开启服务、指定端口号ServerSocket mServerSocket = new ServerSocket(5566);
} catch (IOException e) {e.printStackTrace();Toast.makeText(this, "服务开启失败", Toast.LENGTH_SHORT).show();return;
}

步骤2:调用ServerSocket的accept(),监听连接请求,如果客户端请求连接,则接收连接,返回Scoekt对象。

Socket mSocket = mServerSocket.accept();
步骤3:调用Socket类的getInputStream()和getOutputStream()获取输入输出流。

class SocketAcceptThread extends Thread{@Overridepublic void run() {try {//等待客户端的连接,Accept会阻塞,直到建立连接,//所以需要放在子线程中运行。mSocket = mServerSocket.accept();//获取输入流mInStream = mSocket.getInputStream();//获取输出流mOutStream = mSocket.getOutputStream();} catch (IOException e) {e.printStackTrace();mHandler.sendEmptyMessage(MSG_SOCKET_ACCEPTFAIL);return;}Log.i(TAG, "accept success");mHandler.sendEmptyMessage(MSG_SOCKET_CONNECT);}
}

步骤4:开始发送、接收数据。
发送数据:

private void writeMsg(String msg){if(msg.length() == 0 || mOutStream == null)return;try {   //发送mOutStream.write(msg.getBytes());mOutStream.flush();}catch (Exception e) {e.printStackTrace();}
}

接收数据:(从输入流读取数据,需要在一个子线程中循环运行下面的方法。)

byte[] buffer = new byte[1024];
//循环执行read,用来接收数据。
//数据存在buffer中,count为读取到的数据长度。
int count = mInStream.read(buffer);

步骤5:服务不再需要,则关闭服务。

if(mServerSocket != null){try {mServerSocket.close();} catch (IOException e) {e.printStackTrace();}
}

3 客户端

TCP客户端工作具体步骤:
步骤1:创建一个Socket,连接到服务器端、指定端口号。放在子线程中运行,否则会有问题。

class SocketConnectThread extends Thread{public void run(){try {//指定ip地址和端口号mSocket = new Socket(mIpAddress,mClientPort);if(mSocket != null){//获取输出流、输入流mOutStream = mSocket.getOutputStream();mInStream = mSocket.getInputStream();}} catch (Exception e) {e.printStackTrace();mHandler.sendEmptyMessage(MSG_SOCKET_CONNECTFAIL);return;}Log.i(TAG,"connect success");mHandler.sendEmptyMessage(MSG_SOCKET_CONNECT);}}

步骤2:调用Socket类的getInputStream()和getOutputStream()获取输入输出流。
具体代码如上所示。
步骤3:发送、接收数据。(发送接收数据与服务端方法相同。)
发送数据:

private void writeMsg(String msg){if(msg.length() == 0 || mOutStream == null)return;try {   //发送mOutStream.write(msg.getBytes());mOutStream.flush();}catch (Exception e) {e.printStackTrace();}
}

接收数据:(从输入流读取数据,需要在一个子线程中循环运行下面的方法。)

byte[] buffer = new byte[1024];
//循环执行read,用来接收数据。
//数据存在buffer中,count为读取到的数据长度。
int count = mInStream.read(buffer);

步骤4:关闭Socket

public void closeConnection(){try {if (mOutStream != null) {mOutStream.close(); //关闭输出流mOutStream = null;}if (mInStream != null) {mInStream.close(); //关闭输入流mInStream = null;}if(mSocket != null){mSocket.close();  //关闭socketmSocket = null;}} catch (IOException e) {e.printStackTrace();}if(mReceiveThread != null){mReceiveThread.threadExit();mReceiveThread = null;}}

4 总结

在清单文件中添加权限

<uses-permission android:name="android.permission.INTERNET"/>

TCP通信的使用基本就完成了,最后看一下图片,更容易理解其通信机制。

Android TCP socket通信相关推荐

  1. 基于Java的TCP Socket通信详解(计算机端/Android手机端)

    TCP Socket通信是一种比较常用的基于连接的网络通信方式.本文通过Java实现TCP Socket通信,并将其用于计算机端.Android手机端,同时做到代码规范化,实现代码最大化复用. 本文代 ...

  2. python安卓开发实例_python服务器与android客户端socket通信实例

    本文实例讲述了python服务器与android客户端socket通信的方法.分享给大家供大家参考.具体实现方法如下: 首先,服务器端使用python完成,下面为python代码: #server.p ...

  3. android 手机 与 python服务器_python服务器与android客户端socket通信实例

    本文实例讲述了python服务器与android客户端socket通信的方法.分享给大家供大家参考.具体实现方法如下: 首先,服务器端使用python完成,下面为python代码: #server.p ...

  4. java tcp read_【Java TCP/IP Socket】TCP Socket通信中由read返回值造成的的死锁问题(含代码)(转)...

    书上示例 在第一章<基本套接字>中,作者给出了一个TCP Socket通信的例子--反馈服务器,即服务器端直接把从客户端接收到的数据原原本本地反馈回去. 书上客户端代码如下: 书上的服务器 ...

  5. 【Java TCP/IP Socket】TCP Socket通信中由read返回值造成的的死锁问题(含代码)(转)...

    书上示例 在第一章<基本套接字>中,作者给出了一个TCP Socket通信的例子--反馈服务器,即服务器端直接把从客户端接收到的数据原原本本地反馈回去. 书上客户端代码如下: 1 2 3 ...

  6. Android中socket通信简单实现

    Android中socket通信简单实现 socket通信需要有一个服务器和客户端,可以把同一个APP作为服务器跟客户端,也可以分开成两个APP. 先上个图: 这里以一个APP作为服务器跟客户端为示例 ...

  7. python 实现TCP socket通信和 HTTP服务器、服务器和客户端通信python实例

    python 实现TCP socket通信和 HTTP服务器.服务器和客户端通信实例 socket是什么? 服务器和客户端通信的流程 python 实现TCP socket通信例子 关于Host和PO ...

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

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

  9. Android蓝牙Socket通信

    Android的蓝牙部分暂且分为2.0,4.0,虽然苹果已经出了5.0版本了,咱先不说这个. 简单讲解一下,4.0是兼容2.0的功能的,今天讲的bluetoothSocket通信是在2.0上面就已经有 ...

最新文章

  1. 2021《程序员》数字科技企业研发实力榜TOP50
  2. 整合hive基于cdh6_Flink 作为现代数据仓库的统一引擎:Hive 集成生产就绪!
  3. vuewebsocket做消息提醒_企业微信群怎么定时群发消息?如何突破群发次数限制?...
  4. 将VIM配置成强大的IDE(三)
  5. 电大计算机考试将网页保存到桌面,电大计算机网考小抄.pdf
  6. markdown内容转wiki格式内容
  7. [转]PhotoShop小技巧
  8. go语言中输入的方式,获取用户的输入信息
  9. 织梦 - PHP开源网站管理系统
  10. 魔兽世界服务器维护后稀有宠物刷新,魔兽世界猎人稀有宠物图签与刷新方式时间介绍...
  11. Php抖音引流源码,Thinkphp抖音快手点赞在线任务交易系统,引流必备
  12. 【LeetCode】274. H指数
  13. 赶紧收藏!41个Web UI工具包资源免费及付费下载
  14. 2021-07-27-
  15. Django框架之视图函数views
  16. Linux命令之who命令的使用
  17. 联想小新air15 2021 16G版魔改加装固态硬盘
  18. uniapp App端后台间隔时间发送定位功能实现
  19. 对今天知识的回顾15
  20. 核心微生物分析_微生物多样研究—微生物深度分析概述

热门文章

  1. python汽车数据分析_用python对汽车油耗进行数据分析
  2. 为什么常常会出现人+机人的现象?
  3. 互联网日报 | iPhone 12系列手机正式发布;盒马入局火锅市场;东风汽车A股IPO申请获受理...
  4. 百度(baidu)、bing、sogo、360关键字 - 图片批量下载
  5. 微信小程序订单语音播报
  6. 【开发教程1】开源蓝牙心率防水运动手环-套件检测教程
  7. 在 linux 中更新IP对主机名称实战脚本~~~
  8. IBM SPSS 实习总结
  9. 数据资产价值计算研究与实践
  10. AI人工智能会取代项目经理吗?