基于TCP/IP通信协议的socket,是由一个IP地址和一个端口号唯一确定的。网络上两个程序通过一个双向的通信连接实现数据的交换,这个双向链路的一端就称为一个socket。TCP/IP通信协议的传输层包含两个传输协议:面向连接的TCP和非面向连接的UDP。使用TCP还是UDP的指导方针:
以下情况应该使用TCP:
1.你需要一个可靠的数据传输,以确保你的数据完整无缺地到达目的地;
2.你的协议需要不止一个请求和服务器的回答;
3.你需要发送较多的数据;
4.初始连接出现短暂的延迟是可以容忍的。
以下情况应该考虑使用UDP:
1.你不太关心信息包是否到达,或者不太在意信息包到达的顺序是否正确,再或者你自己可以察觉到这些问题并自己解决;
2.你的协议之包括基本的请求和回答;
3.你需要尽快建立网络会话;
4.只传输很少一部分数据。UDP的限制是一个信息包不超过64KB的数据,通常人们只用UDP传输1KB以下的数据。
基于socket的TCP程序框架如下图:
服务器端:ChatServerTCP.py
import socket
serversocket=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #创建服务器socket,基于IPV4的TCP协议
serversocket.bind(("127.0.0.1",8000)) #绑定到IP地址和端口号
serversocket.listen(1) #开始侦听,队列长度为1
clientsocket,clientaddress=serversocket.accept() #使用阻塞方法accept以等待客户机连接请求
print("Connection from ",clientaddress) #打印输入客户机的信息
while 1:
data=clientsocket.recv(1024) #接收数据缓存大小
if not data:
break #如果接收数据为空,则跳出循环
print("Received from client: ",repr(data)) #输出接收到的数据,repr是个字符串转换函数
print("Echo: ",repr(data)) #输出发送到客户机数据的信息
clientsocket.send(data) #回送数据到客户机
clientsocket.close() #关闭客户机socket
serversocket.close() #关闭服务器
客户端:ChatClientTCP.py
import socket
clientsocket=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #创建客户机socket
clientsocket.connect(("127.0.0.1",8000)) #连接到服务器
while 1:
data=raw_input('>') #接收用户输入数据
clientsocket.send(data.encode()) #把数据转换为bytes对象,并发送到服务器
if not data:
break #如果数据为空,终止循环
newdata=clientsocket.recv(1024) #接收服务器的回送数据
print("Received from server: ",repr(newdata)) #输出接收到的回送数据
clientsocket.close() #关闭客户机socket
在Windows的IDLE环境下运行时需要打开两个IDLE的shell窗口,然后先运行服务器端的程序,在运行客户端程序。执行结果如下:
(服务器端结果)
(客户端结果:)
在Linux环境下运行,需要同时打开两个终端,先运行服务器端程序,在运行客户端程序,结果如下:
(服务器端:)
(客户机端:)