无连接不可靠的UDP socket 编程
首先我们编写客户端
#!/usr/bin/env python3 # -*-coding:utf-8 -*- from socket import * serverName='192.168.1.107' severPort=12000 clientSocket=socket(AF_INET,SOCK_DGRAM) message=input('input lowercase sentence:') clientSocket.sendto(message.encode(),(serverName,severPort)) modifiedMessage,serverAddress=clientSocket.recvfrom(2048) print(modifiedMessage.decode()) clientSocket.close()
我们看到我们只要知道了服务端的ip和端口号就能向服务端发送UDP报文,创建UDP socket 是SOCK_DGRAM
然后编写服务端
#!/usr/bin/env python3 # -*-coding:utf-8 -*- from socket import * severPort=12000 serverSocket=socket(AF_INET,SOCK_DGRAM) serverSocket.bind(('',severPort)) print('the server is ready to receive') while True: message,clientAddress=serverSocket.recvfrom(2048) print('receive from',clientAddress,'message:',message.decode()) modifiedMessage=message.decode().upper() serverSocket.sendto(modifiedMessage.encode(),clientAddress)
服务端也是建立SOCK_DGRAM socket 并绑定12000 端口,程序启动后一直循环等待从客户端接收消息。
在上面的程序中我们看到UDP 只要简单知晓 服务器UDP 端口号就可以发送相关UDP报文。
面向连接的可靠的TCP socket 编程
客户端代码:
#!/usr/bin/env python3 # -*-coding:utf-8 -*- from socket import * serverName='192.168.1.107' severPort=12000 clientSocket=socket(AF_INET,SOCK_STREAM) clientSocket.connect((serverName,severPort)) message=input('input lowercase sentence:') clientSocket.send(message.encode()) modifiedSentence=clientSocket.recv(1024) print(modifiedSentence.decode()) clientSocket.close()
我们看到客户端创建的是SOCK_STREAM 类型的 socket ,并且在向服务端发送请求之前,先与服务端建立相关链接
clientSocket.connect((serverName,severPort))
这在UDP 中是不需要的
服务端代码
#!/usr/bin/env python3 # -*-coding:utf-8 -*- from socket import * severPort=12000 serverSocket=socket(AF_INET,SOCK_STREAM) serverSocket.bind(('',severPort)) serverSocket.listen(1) print('the server is ready to receive') while True: connectionSocket,addr=serverSocket.accept() sentence=connectionSocket.recv(1024).decode() print('receive from',addr,'message:',sentence) capitalizedSentence=sentence.upper() connectionSocket.send(capitalizedSentence.encode()) connectionSocket.close()
TCP 服务端 也是需要先accept ,然后才能接收客户端发来的数据
connectionSocket,addr=serverSocket.accept()
从上面两个例子我们简单看出 TCP 是面向连接的,而UDP 是无连接的,关于可靠性呢,tcp 主要依靠校验和、序列号、确认应答、超时重传、连接管理、流量控制、拥塞控制来实现可靠传输。