简单的TCP和UDP套接字编程 - dblank

简单的TCP和UDP套接字编程

简单的TCP和UDP套接字编程

最近在学习《计算机网络-自顶向下方法》,里面介绍到套接字编程,试着按照书上的例子实现了实现了下:

UDPclient.py

from socket import *
serverName = 'littleblank.net'
serverPort = 12000 
clientSocket = socket(AF_INET, SOCK_DGRAM)
while(True):
    message = raw_input('Input lowercase sentence:')
    clientSocket.sendto(message, (serverName, serverPort))
    modifiedMessage, serverAddress = clientSocket.recvfrom(2048)
    print(modifiedMessage,serverAddress)
clientSocket.close()

使用python实现,现在来分析下这个客户端代码

serverName = 'littleblank.net'
serverPort = 12000

第一行将变量置为我的服务器主机名,也可以直接使用IP地址,使用主机名会自动执行DNS lookup获得IP地址。第二行将整数变量设置为server置为12000。

clientSocket = socket(AF_INET, SOCK_DGRAM)

该行创建了客户的套接字,为clientSocket。第一个参数指示了地址簇;特别是,AF_INET指示了底层网络使用了IPv4,第二个参数SOCK_DGRAM指示该套接字是__UDP类型___的。

message = raw_input('Input lowercase sentence:')

用户输入一行字符并存入message中,现在我们有了套接字和报文。

clientSocket.sendto(message, (serverName, serverPort))

使用sentto()为报文附上目的地址(servetName, serverPort),并向进程的套接字
clientSocket发送结果分组。这个报文会经过UDP从客户到服务器,发送玩后,客户会等待接受来自服务器的数据。

modifiedMessage, serverAddress = clientSocket.recvfrom(2048)

对于这行代码,当分组到达该客户套接字时,该分组的数据会被放置到modifiedMessage中。
变量serverAddress包含了服务器的IP地址和服务器的端口号。

    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):
        message, clientAddress = serverSocket.recvfrom(2048) 
        modifiedMessage = message.upper()
        serverSocket.sendto(modifiedMessage, clientAddress)
        print (clientAddress)

其实大部分和client程序还是一样的,有一个不一样的地方

serverSocket.bind(('', serverPort))

这行代码是将端口号与这个这套接字绑定在一起,也就是然后任何人将分组发送到这个端口都会被指向这个套接字程序。

Input lowercase sentence:hello
('HELLO', ('123.206.26.18', 12000))

发送一个'hello',服务器返回一个'HELLO'。

TCPclinet.py

from socket import *
serverName = 'littleblank.net'
serverPort = 12000
clientSocket = socket(AF_INET, SOCK_STREAM)
clientSocket.connect((serverName, serverPort))
while(True):
    sentence = raw_input('Input lowercase sentence:')
    clientSocket.send(sentence)
    modifiedSentence = clientSocket.recv(1024)
    print('From Server:', modifiedSentence)
clientSocket.close()

使用python实现的TCPcient

serverSocket = socket(AF_INET, SOCK_STREAM)

和UDPclient不一样的式参数为SOCK_STREAM,代表这个为TCP连接。

clientSocket.connect((serverName, serverPort))

这个和UDPclient不一样的地方,因为TCP是面向连接的,连接前需要进行三次握手,执行这段代码后,会在客户和服务器间建立一个TCP连接。其中connect()的参数为服务器端的地址。

TCPserver.py

from socket import *
serverPort  = 12000
serverSocket = socket(AF_INET, SOCK_DGRAM)
serverSocket.bind(('', serverPort))
print("The server is ready to receive")
while(True):
    message, clientAddress = serverSocket.recvfrom(2048) 
    modifiedMessage = message.upper()
    serverSocket.sendto(modifiedMessage, clientAddress)
    print (clientAddress)

介绍几个地方

    serverSocket.listen(1)

限制请求连接最大数(至少为1)


connectionSocket, addr = serverSocket.accept()

当客户来敲门的时候,程序为serverSocket调用accept(), 这在服务器创建了一个__connectionSocket__的新套接字,而且由这个特定的用户使用。客户和服务器完成握手,在clientSOcket和serverSocket之间建立了一个TCP连接。因为TCP是可靠数据运输,所以一侧的数据可以有序确保到达另一侧。

Input lowercase sentence:hello
('From Server:', 'HELLO')

TCP和UDP的区别

  • UDP无需建立连接,TCP在开始数据传输之前要经过三次握手。UDP却不需要任何准备即可开始数据传输。因此UDP不会引入建立连接的时延。
  • UDP无连接状态,TCP需要在端系统中维护连接状态。此连接状态包括接受和发送缓存、拥塞控制参数以及序号与确认号的参数。
  • UDP分组首部开销小。每个TCP报文段都有20个字节的首部开销,而UDP只有8字节的开销。
  • TCP连接只能点对点,而UDP没有这个限制。

相关文章

发表新评论