前言

我们知道TCP协议(Transmission Control Protocol, 传输控制协议)是一种面向连接的传输层通信协议,它能提供高可靠性通信,像HTTP/HTTPS等网络服务都采用TCP协议通讯。那么网络通讯方面都会涉及到socket编程,当然也包括TCP协议。Python作为一门适应于快速开发的工具,在它浩瀚的第三方库中也一定包括了socket模块,那么本文就给大家介绍Python的socket编程实现TCP协议连接的方法。

socket介绍

socket(套接字)起源于UNIX,主要用于网络进程间通讯,它是在应用层和传输层之间的一个软件抽象层,它把TCP/IP复杂的操作抽象为几个简单的接口供应用层调用来实现进程在网络中的通信。因为在Unix中一切皆为文件,所以socket通过"open—read/write—close"模式来实现进程在网络中的通信。服务器和客户端各自维护一个"文件",建立连接后相当于打开了文件,各自可以向自己文件写入内容供对方读取或者读取对方内容,通讯结束时则关闭文件。

TCP连接流程

socket主要以"open—read/write—close"的模式来实现客户端和服务器之间TCP协议的连接,交互流程如下图所示。TCP服务器的建立可以归纳这几步:1)创建socket(套接字);2)绑定socket的ip地址和端口;3)监听客户端的连接请求;4)接受客户端的连接请求;5)与客户端对话;6)关闭连接。TCP客户端的创建可总结为这几步:1)创建socket(套接字);2)连接服务器socket;3)与服务器对话;4)关闭连接。厦门叉车出租电话是多少

需要注意的是TCP客户端连接到服务器的ip和端口要与TCP服务器监听的ip和端口相同,服务器调用listen()开始监听端口,而后调用accept()时刻准备接受客户端的连接请求,此时服务器处于阻塞状态,直到服务器监听到客户端的请求后,接收请求并建立连接为止。

TCP服务器/客户端例程

提供给大家两个Python实现socket连接例程,一个为TCP服务器和客户端的短连接例程,即服务器接受客户端连接后创建一个线程,在线程中与客户端收发数据后关闭连接,另一个为TCP服务器和客户端的长连接例程,服务器与客户端建立连接后彼此循环收发数据,不关闭连接。

这里要注意的是服务器接收客户端发送数据时是处于阻塞状态的。server.close()是关闭服务端的socket程序本身的连接,关闭后整个服务端socket程序就退出运行。client_socket.close()是关闭服务端socket程序与客户端的连接,关闭后服务端的socket程序仍然还在运行。

TCP服务器短连接实现
import socket
import threading bind_ip = "127.0.0.1"
bind_port = 12345 server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind((bind_ip, bind_port))#bind ip and port
server.listen(5)#start listen max connection print "[*] listening on %s:%d" % (bind_ip, bind_port) def handle_client(client_socket): request = client_socket.recv(1024)
print "[*] Received: %s" % request
client_socket.send('ACK!')
client_socket.close() while True:
client, addr = server.accept()
print "[*] Accepted connection from: %s:%d" % (addr[0], addr[1])
client_handler = threading.Thread(target=handle_client, args=(client,))
client_handler.start()
server.close()
TCP客户端短连接实现
import socket target_host = '127.0.0.1'
target_port = 12345 #Creat socket object AF_INET means use the normod IPv4 address and hots name;OCK_STREAM one tcp client
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect((target_host, target_port))
client.send("i am TCP client") response = client.recv(4096)
print response
TCP服务器长连接实现
import socket
import threading bind_ip = "127.0.0.1"
bind_port = 12345 server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind((bind_ip, bind_port))#bind ip and port
server.listen(5)#start listen max connection
print "[*] listening on %s:%d" % (bind_ip, bind_port) while True: client, addr = server.accept()
print "[*] Accepted connection from: %s:%d" % (addr[0], addr[1]) while True:
request = client.recv(1024)
print "[*] Received: %s" % request
client.send('ACK!')
print "[*] Sended: ACK!"
client.close() server.close()
TCP客户端长连接实现
import socket target_host = '127.0.0.1'
target_port = 12345 client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect((target_host, target_port)) while True:
client.send("TCP client connect")
response = client.recv(4096)
print response

最新文章

  1. ajax 如何接受 PHP页面返回的json数组
  2. IOS开发_中遍历数组的方法及比较
  3. WP中的语音识别(上):基本识别
  4. 使用SandCastle创建.Net帮助文档
  5. MySql和SQL Server数据类型 对比
  6. cocos2dx游戏开发——捕鱼达人mini版学习笔记(一)——FishAchor的搭建
  7. windows8 开发教程 教你制作 多点触控Helper可将任意容器内任意对象进行多点缩放
  8. Delphi Xe2 后的版本如何让Delphi程序启动自动“以管理员身份运行"
  9. 对cnblogs.com用户体验的评价
  10. Thinkphp 验证码、文件上传
  11. iOS 获取字符串中的单个字符
  12. NuGet的使用、部署、搭建私有服务
  13. [Inside HotSpot] C1编译器HIR的构造
  14. Dapp的PVP发模式--magic-maze-2d游戏解读
  15. Errors running builder 'DeploymentBuilder' on project
  16. IdentityServer4 中文文档 -7- (简介)贡献
  17. inheritCombination.js
  18. svn更新的时候出现ERROR:Previous operation has not finished,run "clean up" if it wa interrupted;进行clean up命令也报错
  19. spring中MessageSource的配置使用方法2--ReloadableResourceBundleMessageSource【转】
  20. 移动端混合开发----ionic

热门文章

  1. 使用 git push 出现error setting certificate verify locations问题记录
  2. 多线程之并发容器ConcurrentHashMap(JDK1.6)
  3. D. Timetable
  4. modbustcp封装使用获取设备数据示例
  5. 转:超级好用的流程图js框架
  6. #leetcode刷题之路50-Pow(x, n)
  7. Golint的简易使用方法
  8. Scala(四):对象
  9. 如何在mac上运行vue项目
  10. 20155220 吴思其 《网络攻防》 Exp1 PC平台逆向破解(5)M