Android中基于TCP协议的网络通信之使用Socket进行通信
TCP协议被称为一种端到端的协议。这是因为它为两台计算机的连接起到了重要作用:当一台计算机需要与另一台计算机进行接连时,TCP协议会他们之间建立一个连接:用于发送和接收数据的虚拟链路。
TCP协议负责收集这些信息包,并将其按适当的顺序放好传送,在接收端收到后再将其正确地还原。TCP协议确保了数据包在传送中准确无误。TCP协议使用重发机制:当一个通信实体发送一个消息给另一个通信实体后,需要收到另一个通信实体的确认信息,如果没有收到另一个通信实体的确认信息,则会重发刚才发送的消息。可以通过下面的图例来简单了解TCP协议控制两个通信实体互相通信的过程:
Java中能接收其他通信实体连接请求的类是ServerSocket,ServerSocket对象用来监听来自客户端的Socket连接,如果没有连接,它将一直处于等待状态。
根据上面的示意图,可以看出我们至少需要两个计算机设备才能进行通信。一个是服务器端,一个客户端。在这里可能有人会说:那两个人聊QQ、微信的时候两个都是客户端啊。不错,的确两个都是客户端。但是,要知道,这两个客户端都要和腾讯的服务器连接才能通信。好了,下面我们就来用代码来做一个综述。
首先是服务器端(Java程序,运行于PC):
public class SimpleServer {public static void main(String[] args) throws IOException{ServerSocket ss = new ServerSocket(30000);while (true) {Socket s = ss.accept();OutputStream os = s.getOutputStream();os.write(("我是william的忠实服务器!" + Calendar.getInstance().getTimeInMillis()).getBytes("utf-8"));os.close();s.close();}}
}
这里我用的端口号是30000,一般来说我们推荐使用1024以上的端口号,主要是为了避免与其他的应用程序的通用端口发生冲突。
这里我们用了一个死循环来监听来自客户端的连接信息。这里我们是把当前毫秒时间传给了Socket的outputStream。这里一点需要注意,那就是我用了一个.getBytes("utf-8")。这是因为,我们的服务器端是运行在PC上,一般是Windows主机,当直接使用PrintStream输出字符串时默认使用系统平台的字符串(GBK)编码,但客户端都是Android程序,运行于Linux平台,因为客户端读取网络数据时默认使用UTF-8字符集进行解码,这样就会造成乱码。
----------------------------------------------------------------------------------------------------------------------------------------------------------
下面是客户端程序(Android程序,运行于Android机):
Handler handler = new Handler(){public void handleMessage(android.os.Message msg) {if (msg.what == 123) {try {Socket socket = new Socket("192.168.1.105", 30000);BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));String line = reader.readLine();TextView showTextView = (TextView) findViewById(R.id.activity_simple_client_textview);showTextView.setText("来自服务器的数据:" + line);reader.close();socket.close();} catch (Exception e) {e.printStackTrace();}}};};
这里只提供了在Handler线程中的关键代码,因为在UI线程的部分非常简单,这里不给出代码,完整代码后面会有接连源码下载。
在客户端我们使用了IP为192.168.1.105的主机,因为笔者的PC就是这个IP。如果你的电脑你不知道怎么查看IP或是你的IP地址是设置为自动获取IP地址,那么可以使用下图的方法(在开始菜单下输入cmd进入命令提示符窗口):
进入cmd的方法:
另外如果你需要修改你的服务器端程序,并且要运行修改后的程序,你可能会遇到这样的一种情况:
遇到这种情况,不是你的程序修改的时候有问题。而是因为这个时候,你的服务器端程序里写了一个死循环,这个死循环会一直在运行。我们可以通过任务管理器查看到这个进程还在运行着,如下:
我们只在kill掉这个进程,然后再运行服务器程序,这样就可以了。
运行程序,如下结果:
本博客参考资料:《疯狂Android讲义》
这里是我的程序源码(服务器端和客户端):点击下载源码
Android中基于TCP协议的网络通信之使用Socket进行通信相关推荐
- android 网络通信方式,Android中基于TCP协议的网络通信
一.Android网络简介 Android与服务器的通信方式主要有两种,一种是Http通信,另一种是Socket通信. HTTP通信:Android中内置HttpClient,这样可以发方便的发送Ht ...
- Java学习系列(十六)Java面向对象之基于TCP协议的网络通信
TCP/IP的网络分层模型:应用层(HTTP/FTP/SMTP/POPS...),传输层(TCP协议),网络层(IP协议,负责为网络上节点分配唯一标识),物理层+数据链路层). IP地址用于标识网络中 ...
- python中基于tcp协议的通信(数据传输)
tcp协议:流式协议(以数据流的形式通信传输).安全协议(收发信息都需收到确认信息才能完成收发,是一种双向通道的通信) tcp协议在OSI七层协议中属于传输层,它上承用户层的数据收发,下启网络层.数据 ...
- Android中的TCP协议与UDP协议
TCP和UDP在网络传输中非常重要,在Android开发中同样重要. 什么是TCP? TCP:Transmission Control Protocol 传输控制协议TCP是一种面向连接(连接导向)的 ...
- Java中通过TCP协议发送和接收数据-Socket编程
TCP TCP协议是面向连接.保证高可靠性(数据无丢失.数据无失序.数据无错误.数据无重复到达)传输层协议. TCP通过三次握手建立连接,通讯完成时要拆除连接,由于TCP是面向连接的所以只能用于端到端 ...
- socket 网络通信(基于tcp协议)以及粘包解决方案
socket 网络通信(基于tcp协议)以及粘包解决方案 参考文章: (1)socket 网络通信(基于tcp协议)以及粘包解决方案 (2)https://www.cnblogs.com/amiee- ...
- 基于TCP协议的Socket网络通信
前言 一. 什么是网络(了解七层网络模型)? 二. 什么是TCP/UDP协议? 三.什么是socket? 定义 四.基于TCP协议的socket通信的实现步骤是怎样的? 客户端的实现 服务端的实现 测 ...
- 异常处理、socke基于TCP协议编程
一.异常处理 1.错误和异常 1.程序中难免出现错误,而错误分成两种 (1)语法错误(这种错误过不了Python解释器的语法检测,必须在程序执行前改正) #语法错误示范一 if#语法错误示范二 def ...
- 基于TCP协议RSA与Base64加密的聊天程序
一.理论依据 1.TCP协议 TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的.可靠的.基于字节流的传输层通信协议.其中TCP提供IP环境下的数据可靠 ...
最新文章
- java的父类java.lang.object_根父类:java.lang.Object
- 计算机科学与技术类高水平国际学术刊物,莘莘学子 | 计算机科学与技术学院本科生薛传雨在国际期刊上发表高水平学术论文...
- B2c商城图片尺寸设定研究 尺寸应该多大合适
- python使用del保留字定义一个函数-函数和代码复用 --Python
- 吴恩达深度学习课程deeplearning.ai课程作业:Class 1 Week 3 assignment3
- android 仿ios tabs,React Native兼容iOS Android的TabBar
- tmux多窗口工具基本操作
- c语言字符串文库总结,C语言程序设计入门:字符串函数
- android用sax解析xml,Android:采用SAX解析XML实例
- 作为一个对电脑配置一概不知的人,怎样才能一步一步了解电脑构造并且由此来学会怎样自己配置电脑?
- 借助JavaEE中Timer API实现定时关闭计算机的功能
- 思科模拟器Cisco Packet Tracer安装指南
- 《ABAQUS 6.14超级学习手册》——1.5 ABAQUS帮助文档
- 简单Web服务器程序设计与实现
- 传染病模型-java代码
- 网站建设教程:企业怎么自己建网站?
- 网络打不其他计算机的共享文件,快速解决“电脑无法访问共享文件夹”的4种方法!...
- Python周刊518期
- 图片分享和加载失败的原因之一
- WordPiece 和 BPE 的区别
热门文章
- 【Flask】数据的CRUD操作之聚合函数
- python虚拟环境的使用
- [register]-ARMV8-aarch64的通用寄存器介绍和总结
- 在linux kernel中netlink的使用示例
- AttnGAN: Fine-Grained Text to Image Generation with Attentional Generative Adversarial Networks论文解读
- http error code
- win10如何换pip源
- angr学习笔记(6)(内存地址单元符号化)
- 2020——网鼎杯 (青龙组)jocker
- Python借助队列实现进程通信