TCP编程-python实现

来源:互联网 发布:php 多用户商城 编辑:程序博客网 时间:2024/06/05 07:59

  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-8from socket import *serverPort = 9999                       #定义端口serverSocket = socket(AF_INET, SOCK_STREAM)     #第一个参数是地址族,即是IPV4还是IPV6,第二个是套接字类型serverSocket.bind(('', serverPort))             #参数元组的第一个字符串代表IP地址,第二个是端口serverSocket.listen(1)           #最大请求树1print('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-8from socket import *serverName = ''serverPort = 9999clientSocket = 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这样的协议等。




0 0