TCP编程-python实现

本文介绍了TCP协议的基本原理,包括面向连接的特性、三次握手的过程及如何通过套接字进行通信。并通过Python代码实现了简单的TCP服务器和客户端,演示了数据的发送与接收。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  TCP是一个面向连接的协议。这意味着客户和服务器要先握手和创建一个TCP连接,才能互相发送数据。在创建这个连接时,客户端通过套接字地址(IP和端口号)和服务器的套接字地址(IP和端口号)关联起来。然后,在之后的通信中,服务器和客户端如果要发送数据,直接把数据交给套接字就可以进行传送。(与之相对的时UDP,每次发送数据都要附带客户端地址,而且并不保证数据传输完整,但不需要像TCP一样耗费维持连接的资源。)

  在TCP服务器与客户端连接中,客户端总是作为首先发起请求的一端,所以TCP服务器程序要保持一直运行,随时准备接收客户端的请求。
在细节中表示为,客户通过创建自己的套接字发起向服务器的TCP连接。客户生成这个套接字时,就指定了服务器端的套接字地址。即服务器的IP地址和套接字端口。这个套接字地址也被称为欢迎套接字(serverSocket)。
  随后进行的三次握手期间,服务器会生成一个专门服务这个客户端的套接字,称为连接套接字(connection Socket)。
  现在从服务器端或客户端看,客户套接字和服务器套接字通过一根管道(连接套接字)相连。客户进程和服务器进程可以通过这根管道发送任意字节,接收任意字节,并且,TCP保证这些字节保质保量严格按照发送顺序到达目的地。



接下来用python实现一个简单的TCP服务器和客户端。大致流程如下:



首先是服务器端的实现方法。Python版本3.5.2

#!/usr/bin/env python
# coding=utf-8

from socket import *

serverPort = 9999                       #定义端口
serverSocket = socket(AF_INET, SOCK_STREAM)     #第一个参数是地址族,即是IPV4还是IPV6,第二个是套接字类型
serverSocket.bind(('', serverPort))             #参数元组的第一个字符串代表IP地址,第二个是端口
serverSocket.listen(1)           #最大请求树1
print('the server is ready to receive')
while True:
    connectionSocket, addr = serverSocket.accept()
    sentence = connectionSocket.recv(1024)
    capitalizedSentence = sentence.upper()   #upper()是转换成大写的函数
    connectionSocket.send(capitalizedSentence)
    connectionSocket.close()
以定义端口号为第一行。
第二行,创建一个IPV4,套接字类型是TCP流式套接字的socket对象,这个对象就是上面说的欢迎套接字。
第三行,绑定服务器的地址和端口号。
第四行,服务器可接受的最大请求数是1个。
第五行,就是服务器要一直运行并监听端口,随时等待来自客户端的连接请求。
第六行,接听连接,完成握手,返回一个专门服务该客户的socket对象(也就是连接套接字),和连接另一端套接字的地址。
第七行,表示每一次接受的最大数据是1024字节,并返回接收到的字节对象。
第九行,把转换的大写数据发送出去。
第十行,关闭连接。进入while循环,继续监听端口。这只是练习,实际中需要多线程来处理请求。


接下来是客户端

#!/usr/bin/env python
# coding=utf-8

from socket import *

serverName = ''
serverPort = 9999
clientSocket = socket(AF_INET, SOCK_STREAM)
clientSocket.connect((serverName, serverPort))
sentence = input('Input lowercase sentence:').encode('ascii')
clientSocket.send(sentence)
modifiedSentence = clientSocket.recv(1024)
print('from server:', modifiedSentence)
clientSocket.close()

以定义服务器名称为第一行。
第三行,创建了客户端的socket对象。客户端的套接字端口号不是由自己添加的,而是由操作系统添加的。
第四行,前面说过客户和服务器发送数据之前,要先建立TCP连接,这一行就发起了客户和服务器之间的连接。参数就是服务器地址。这行代码执行完毕后,三次握手,并在客户和服务器之间建立起连接。
第六行,在连接管道中向服务器发送消息。从这一行和服务器的send就能看出,只要TCP连接建立起来,客户和服务器的消息就可以在这条管道中任意通行(毕竟维护这条管道也是付出代价的)。

运行结果:



  TCP/IP代表传输控制协议/网际协议,指的是一系列协议。“IP”代表网际协议,TCP和UDP使用该协议从一个网络传送数据包到另一个网络。把IP想像成一种高速公路,它允许其它协议在上面行驶并找到到其它电脑的出口。TCP和UDP是高速公路上的“卡车”,它们携带的货物就是像HTTP,文件传输协议FTP这样的协议等。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值