一、套接字
套接字(socket)是同一台主机内应用层和运输层的接口。
进程可类比为一个房子,套接字为该进程的门,当一个进程想向另一台主机发送报文时,该进程把报文推出门(套接字),通过运输层的运输到另一台主机的目的进程,一旦报文到达目的主机,它通过接收进程的门(套接字)传递,接收进程开始处理报文。
可以看到,应用程序开发者在套接字应用层一侧可以控制所有,但是几乎无法控制运输层。
二、UDP编程
1、UDPServer
python">from socket import *
serverPort = 12000 #服务端的端口号
serverSocket = socket(AF_INET,SOCK_DGRAM) #创建一个套接字
serverSocket.bind(('',serverPort)) #绑定地址(host,port)到套接字
print("The server is ready to receive") #提示服务器准备就绪
while True: #死循环,True为布尔值,值为1
message,clientAddress = serverSocket.recvfrom(2048) #接收UDP数据
modifiedMessage = message.decode().upper() #解码,转换 upper()方法将字符串小写转换为大写
serverSocket.sendto(modifiedMessage.encode(), clientAddress) #编码发送到客户端
2、UDPClient
python">from socket import *
serverName = '127.0.0.1' #服务端的IP地址
serverPort = 12000 #服务端的端口号
clientSocket = socket(AF_INET,SOCK_DGRAM) #创建一个套接字
message = input('Input lowercase sentence:') #从键盘获取报文
clientSocket.sendto(message.encode(),(serverName,serverPort)) #字符串编码发送UDP数据到服务端
modifiedMessage,serverAddresss = clientSocket.recvfrom(2048) #接收UDP数据,返回值:(data,address)
print(modifiedMessage.decode()) #将数据解码并打印
clientSocket.close() #关闭套接字
三、TCP编程
1、TCPServer
python">from socket import *
serverPort = 12000 #服务端的端口号
serverSocket = socket(AF_INET,SOCK_STREAM) #创建一个套接字
serverSocket.bind(('',serverPort)) #绑定地址(host,port)到套接字
serverSocket.listen(1) #请求连接的最大数
print("The server is ready to receive") #提示服务器准备就绪
while True:
connectSocket,addr = serverSocket.accept() #创建连接套接字
Message = connectSocket.recv(1024).decode() #解码
capitalizedMessage = Message.upper() #转化
connectSocket.send(capitalizedMessage.encode()) #编码发送
connectSocket.close() #关闭连接套接字
2、TCPClient
python">from socket import *
serverName = '127.0.0.1' #服务端的IP地址
serverPort = 12000 #服务端的端口号
clientSocket = socket(AF_INET,SOCK_STREAM) #创建一个套接字
clientSocket.connect((serverName,serverPort)) #建立TCP连接,进行三次握手
message = input('Input Message:') #从键盘获取报文
clientSocket.send(message.encode()) #字符串转化为UTF-8编码,并发送TCP数据到服务端,不需要附加目的地址和端口
modifiedMessage = clientSocket.recv(1024) #接收TCP数据,返回值:(data)
print('From Server:',modifiedMessage.decode()) #解码输出
clientSocket.close() #关闭连接套接字