使用UDP时,必须把目的地址附在分组上。在分组传过发送方的套接字后,因特网使用该目的地址通过因特网为该分组选路到接收进程的套接字。分组到达接收套接字时,接收进程将通过该套接字取回分组。
发送进程为分组附上的目的地址是由目的主机的IP地址和目的地套接字的端口号组成的。
clientsocket = socket(socket.AF_INET, socket.SOCK_DGRAM)
创建客户套接字,第一个参数指定地址簇,AF_INET说明底层网络使用IPv4。第二个参数指示该套接字是一个SOCK_DGRAM类型的,说明是UDP套接字。
raw_input()
是Python
的内置功能,执行这条命令的时候,用户使用键盘输入一行被放入一个变量中。
clientsocket.sendto(message,(serverName, serverPort))
sendto
为报文附上目的地址(serverName, serverPort)
并且向进程的套接字clientsocket
发送结果分组
modifiedMessage, serverAddress = clientsocket.recvfrom(2048)
serverAddress
包括服务器的IP地址和端口号,2048是缓存长度
serverSocket.bind(('',serverPort))
将端口号和服务器的套接字绑定在一起,显式的分配端口号
TCP是一个面向连接的协议,在发送数据之前,TCP连接的一端与客户套接字相联系,另一端与服务器套接字相联系。一侧向另一侧发送数据时,只需经过其套接字将数据丢给TCP连接,而UDP必须附上目的地地址。
serverSocket
:用于三次连接,所有要与服务器通信的客户的起始接触点connectionSocket
:用于对客户进行连接,用于特定客户,与每个客户通信而生成客户进程可以向其套接字发送任意字节,TCP保证服务器进程能够按照发送的顺序接收。
clientSocket = socket(AF_INET, SOCK_STREAM)
第一个参数仍然表示使用IPv4,第二个参数指示该套接字时SOCK_STREAM
类型,表明是一个TCP套接字。
clientSocket.connect((serverName, serverPort))
发起客户和服务器之间的TCP连接。这行代码执行完后,执行三次握手,并在客户和服务器之间建立起一条TCP连接。
clientSocket.send(sentence)
并未显式的创建一个分组并未该分组附上目的地址,这是区别与UDP的地方,只是将字节放入TCP连接中。
serverSocket.listen(1)
等待客户,聆听来自客户的TCP连接请求。
connectionSocket, addr = serverSocket.accept()
创建了一个称为connectionSocket
的新套接字,由特定客户使用,客户和服务器完成了握手,并在客户的clientSocket
和服务器的serverSocket
之间创建了一个TCP连接,serverSocket
需要一直保持打开,connectionSocket
在使用完后可关闭。