套接字编程

  说到套接字编程, 那么什么是套接字呢?

  是这样定义的: 

  源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 著, 如有侵权请告知, 将立即删除.

posted @ 2016-03-14 21:46  spxcds  阅读(345)  评论(0编辑  收藏  举报