套接字编程
说到套接字编程, 那么什么是套接字呢?
是这样定义的:
源IP地址和目的IP地址以及源端口号和目的端口号的组合称为套接字.其用于标识客户端请求的服务器和服务.
我们可以将每个进程好比是一座房子,该进程的套接字则好比是一扇门.应用程序位于房子中,运输层位于房子外边.应用程序开发者在套接字的应用层一侧可以控制所有东西, 可是, 他几乎无法控制输出层一侧.
一: UDP套接字编程
UDP套接字的两个通信进程是如何交互的呢?首先, 在使用UDP时, 必须先将目的地址附在该分组上.附在分组上的目的地址是由目的主机的IP地址和目的地的套接字的端口号组成的.同理,发送方的源地址也是有源地址的IP地址和端口号组成.然而, 将源地址附在分组上通常并不是有UDP应用程序代码所为,而是由底层操作系统自动完成的.
我们用下面的简单的客户-服务器应用程序来演示对于UDP套接字编程
1> 客户从键盘读入两个整数并想服务器发送
2> 服务器接收两个整数并将和发送给客户
3> 客户接收得到的和并将该和显示出来
UDPClient.py
from socket import * serverName = "192.168.41.124" serverPort = 12000 clientSocket = socket(AF_INET, SOCK_DGRAM) num1 = raw_input("input num1:") num2 = raw_input("input num2:") clientSocket.sendto(num1, (serverName, serverPort)) clientSocket.sendto(num2, (serverName, serverPort)) Sum, serverAddress = clientSocket.recvfrom(2048) print Sum clientSocket.close()
UDPServer.py
from socket import * serverPort = 12000 serverSocket = socket(AF_INET, SOCK_DGRAM) serverSocket.bind(("", serverPort)) print "The server is ready to receive" while True: num1, clientAddress = serverSocket.recvfrom(2048) num2, clientAddress = serverSocket.recvfrom(2048) Sum = int(num1) + int(num2) serverSocket.sendto(str(Sum), clientAddress)
对于这两个程序,可以在一台主机上运行UDPServer.py,另一台主机上运行UDPClient.py, 保证在UDPClient.py中输入适当的服务器主机名或者是IP地址.接下来首先执行UDPServer.py,然后在客户主机上执行client程序,那么我们输入两个整数,就可以得到经由服务器计算出的两个数的和了.这两个程序完全可以在一台机器上完成.本机既可以当客户端,同时可以当做服务器端.
二: TCP套接字编程
与UDP不同,TCP是一个面向连接的协议.这意味着客户和服务器能够开始互相发送数据之前, 他们先要握手和创建一个TCP连接.TCP连接的一端与客户套接字 相联系,另一端与服务器套接字相联系.当一侧要向另一侧发送数据时, 他只需经过其套接字将数据丢给TCP连接.这与UDP连接不同.
TCPClient.py
from socket import * serverName = "192.168.41.124" serverPort = 12000 clientSocket = socket(AF_INET, SOCK_STREAM) clientSocket.connect((serverName, serverPort)) sentence = raw_input("Input lowercase sentence:") clientSocket.send(sentence) modifiedSentence = clientSocket.recv(2048) print "From server:", modifiedSentence clientSocket.close()
TCPServer.py
from socket import * serverPort = 12000 serverSocket = socket(AF_INET, SOCK_STREAM) serverSocket.bind(("", serverPort)) serverSocket.listen(1) print "The server is ready to receive:" while 1: connectionSocket, addr = serverSocket.accept() sentence = connectionSocket.recv(2048) capitalizedSentence = sentence.upper() connectionSocket.send(capitalizedSentence) connectionSocket.close()
当客户生成TCP套接字时, 他指定了服务器中的欢迎套接字的地址(服务器的IP地址和套接字的端口号), 生成套接字后, 该客户发起了一个三次握手并创建与服务器的一个TCP连接.该程序需运行在两个不同的主机上.
本文摘自: <<计算机网络-自顶向下方法>>-James F.Kurose Keith W.Ross 著, 如有侵权请告知, 将立即删除.