二、网络编程-socket之TCP协议开发客户端和服务端通信
知识点:之前讲的udp协议传输数据是不安全的,不可靠不稳定的,tcp协议传输数据安全可靠,因为它们的通讯机制是不一样的。udp是用户数据报传输,也就是直接丢一个数据包给另外一个程序,就好比寄信给别人,信丢了你也不知道,tcp传输需要先和服务端建立连接,当客户端与服务器连接时,服务器会给出应答,我俩连上了,而且数据传过来还会进行一个数据包数量验证,不一致会重新发送,还有其他种种验证,总之保证了数据传输安全可靠
这一章主要介绍使用套接字,编写一个tcp协议客户端和服务端。同样要用到上一章节提到小工具,网络调试助手作为客户端或服务端与编写的服务端或客户端进行通讯验证
1、客户端,详情看代码注解:
import socket def client_main():
# 创建套接字
tcp_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM) # SOCK_STREAM代表tcp协议 # 与服务端建立连接
server_ip = input('请输入ip地址:')
server_port = int(input('请输入端口号:'))
tcp_socket.connect((server_ip, server_port)) # 使用connect方法与服务器进行连接 # 发送数据
tcp_date = input('请输入要发送的数据:')
tcp_socket.send(tcp_date.encode('utf-8')) # 关闭套接字
# tcp_socket.close() if __name__ == '__main__':
client_main()
交互效果如下:

2、服务端开发,下面的代码是先把主流程写通,往下面再附上优化后的服务端代码
import socket def server():
# 创建套接字
tcp_socket_server = socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 绑定地ip和端口
tcp_socket_server.bind(('',7785)) # 监听套接字,因为创建的套接字默认是主动给别人发消息,作为服务端,要随时监听别人发来的请求连接
tcp_socket_server.listen(128) # 当客户端发来与服务端连接成功后,使用accept方法解堵塞,accept返回一个有俩个值的元祖,需要拆包
# 拆包后,第一个值是新的套接字,也就是连接进来的的客户端,此时新的套接字开始于客户端进行通讯,第二个值是新的套接字这个客户端的ip和端口
new_socket_clien,new_socket_addres = tcp_socket_server.accept() # 接收客户端发来的消息
tcp_data = new_socket_clien.recv(1024)
print(tcp_data.decode('gbk')) # 关闭套接字,先关闭新的套接字,再关闭监听套接字
new_socket_clien.close()
tcp_socket_server.close() if __name__ == '__main__':
server()
交互效果如图:

3、服务端代码优化,1、循环等待新的客户端到来 2、循环为一个客户端提供服务:
#!/usr/bin/env python
# coding=utf-8
# author:刘仲
# datetime:2018/7/20 9:25
# software: PyCharm import socket def server():
# 创建套接字
tcp_server_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 绑定ip和端口
# server_ip = input('请输入ip:')
# server_port = int(input('请输入端口号:'))
tcp_server_socket.bind(('192.168.1.110', 7598)) # 监听套接字
tcp_server_socket.listen(128) # listen里面的参数代表最多监听128个客户端,参数最大不能超过1024 # 循环等待新的客户端到来
while True:
# 等待客户端发消息
# 当客户端连接成功后,accept进行解堵塞,返回一个元祖,然后对元祖进行拆包,拆包后第一个值是客户端新的套接字,使用这个新的套接字
# 为这个客户端服务,第二个值是连进来这个客户端的地址
print('等待新的客户端到来......')
new_socket_server, new_socket_adress = tcp_server_socket.accept()
print('新的客户端来啦......')
while True:
tcp_data = new_socket_server.recv(1024) # 接收客户端消息
print('客户端发来的消息:%s' % tcp_data.decode('gbk'))
if tcp_data:
new_socket_server.send('已收到'.encode('utf-8')) # 服务器给个回应给客户端
elif not tcp_data:
break
new_socket_server.close() # 关闭新的套接字
tcp_server_socket.close() # 关闭监听套接字 if __name__ == '__main__':
server()
解释如下:

二、网络编程-socket之TCP协议开发客户端和服务端通信的更多相关文章
- Python进阶----SOCKET套接字基础, 客户端与服务端通信, 执行远端命令.
Python进阶----SOCKET套接字基础, 客户端与服务端通信, 执行远端命令. 一丶socket套接字 什么是socket套接字: 专业理解: socket是应用层与TCP/IP ...
- java网络编程socket\server\TCP笔记(转)
java网络编程socket\server\TCP笔记(转) 2012-12-14 08:30:04| 分类: Socket | 标签:java |举报|字号 订阅 1 TCP的开销 a ...
- 网络编程Socket之TCP之close/shutdown具体解释(续)
接着上一篇网络编程Socket之TCP之close/shutdown具体解释 如今我们看看对于不同情况的close的返回情况和可能遇到的一些问题: 1.默认操作的close 说明:我们已经知道writ ...
- Java实现TCP之Echo客户端和服务端
Java实现TCP之Echo客户端和服务端 代码内容 采用TCP协议编写服务器端代码(端口任意) 编写客户机的代码访问该端口 客户机按行输入 服务器将收到的字符流和接收到的时间输出在服务器consol ...
- Netty入门之客户端与服务端通信(二)
Netty入门之客户端与服务端通信(二) 一.简介 在上一篇博文中笔者写了关于Netty入门级的Hello World程序.书接上回,本博文是关于客户端与服务端的通信,感觉也没什么好说的了,直接上代码 ...
- python 之 网络编程(基于TCP协议的套接字通信操作)
第八章网络编程 8.1 基于TCP协议的套接字通信 服务端套接字函数 s.bind() 绑定(主机,端口号)到套接字 s.listen() 开始TCP监听 s.accept() 被动接受TCP客户的连 ...
- 网络编程Socket之TCP
服务端: 1. 创建 ServerSocket 对象并监听一个端口 2. 调用accept()方法等待客户端的连接(阻塞式) 3. 输入流(记取客户端发送过来的数据) 4. 输出流(响 ...
- 网络编程之Socket的TCP协议实现客户端与客户端之间的通信
我认为当你学完某个知识点后,最好是做一个实实在在的小案例.这样才能更好对知识的运用与掌握 如果你看了我前两篇关于socket通信原理的入门文章.我相信对于做出我这个小案列是完全没有问题的!! 既然是小 ...
- Python socket编程客户端与服务端通信
[本文出自天外归云的博客园] 目标:实现客户端与服务端的socket通信,消息传输. 客户端 客户端代码: from socket import socket,AF_INET,SOCK_STREAM ...
随机推荐
- RianbowDesign
换了很多个名字,最后换成这个. 主要考虑把自己所学的.所经历的都结合到一起,用这种方式来保持热情. 算是一个设计网站,管理咨询,游戏设计,平面logo之类,想最多地攘括到里边.就像自己不确定的主业一样 ...
- 数据库技术丛书:SQL Server 2016 从入门到实战(视频教学版) PDF
1:书籍下载方式: SQL Server2016从入门到实战 PDF 下载 链接:https://pan.baidu.com/s/1sWZjdud4RosPyg8sUBaqsQ 密码:8z7w 学习 ...
- ORA-00257: archiver error. Connect internal only, until freed.| Oracle数据库归档日志满导致应用系统反应缓慢的问题处理
一:查看原因 查看了下V$FLASH_RECOVERY_AREA_USAGE,看看归档目录使用的情况.果然是归档满了. Disconnected from Oracle Database 11g En ...
- JAVA覆写Request过滤XSS跨站脚本攻击
注:本文非本人原著. demo的地址:链接:http://pan.baidu.com/s/1miEmHMo 密码:k5ca 如何过滤Xss跨站脚本攻击,我想,Xss跨站脚本攻击令人为之头疼.为什么呢. ...
- Confluence 6 使用页面请求属性来对慢性能进行问题解决
这个页面告诉你如何启用页面请求属性.当这个属性启用以后,你可以查看在 Confluence 任何页面完成的一个记录消耗的时间(毫秒).如果 Confluence 反应缓慢的话,一个关于慢页面请求的内部 ...
- Git- 命令及使用
关于Git相关介绍这里就不介绍了,可转<Git- 简介>或者查看官网信息.这篇整理一下git相关的命令. 1) 远程仓库相关命令 克隆下载仓库:$ git clone git://gi ...
- 闭包&装饰器
闭包 1.函数引用 def test(): print('--test--') # 调用函数 test() # 引用函数 ret = test print(id(ret)) print(id(test ...
- You are my brother
问题 : You are my brother 时间限制: 1 Sec 内存限制: 128 MB 题目描述 Little A gets to know a new friend, Little B, ...
- PHP编译安装时常见错误解决办法
转载自:http://www.bkjia.com/PHPjc/1008013.html This article is post on https://coderwall.com/p/ggmpfa c ...
- 20165323 实验一 Java开发环境的熟悉
一.实验报告封面 课程:Java程序设计 班级:1653班 姓名:杨金川 学号:20165323 指导教师:娄嘉鹏 实验日期:2018年4月2日 实验时间:13:45 - 15:25 实验序号:一 实 ...