计算机网络(自顶向下方法)学习记录---2.7 TCP&UDP套接字编程


前言

了解了CDN的运作流程后,这里学到了一点关于TCP与UDP的编程,实现简单的服务器与主机的通信,更加深入的理解了应用层网络程序是如何运作的,该篇是关于客户端-服务器模式使用python来进行编程的,python版本号为3.8。


提示:以下是本篇文章正文内容

一、套接字接口

首先我们了解到,一切数据报文都是通过一个套接字接口来进行读取和写入的,可以将套接字接口视为“门”,而 所需要发出的报文段视为你要寄的快递,当我们写好接受快递的地址和信息后,递交给门外的快递员,而邮递员通过一系列的路程(类比于链路or路由器),快递员将快递带到接收方的小区,接收方的家门口,快递员此时敲门,接收人打开门,拿到快递(也拿到了发送方(你)的地址和各类信息),而接收方的“门”也是一个套接字接口,套接字有相应的端口号,端口号的作用也是找到具体的有这个服务的门(类比于接收方的家门,而小区里的其他人不接收快递),此时应该对数据是如何传输和套接字接口的作用有了大致的了解。

二、UDP套接字编程

1.特点

首先我们知道,UDP是不面向连接的(这里与TCP进行一个对比,在第三章可以看到),所以没有提前沟通握手,不建立一个稳定的传输通道,在使用UDP传输的过程中,必须要将服务器的主机名(或者是ip地址)、端口号附在想要传输的数据上,因特网将通过发送方的套接字接口,发送该数据组,当数据组到达接收方套接字接口,接收进程通过套接字接口回收数据分组,并对数据进行一系列处理,再通过接收方的套接字接口发送(注意:这里发送的时候也要附上发送方的IP地址和端口号),发送方的端口号有一个好处是,不用自己设置,这个交给操作系统去做。

2.UDP发送方(客户)编程

下面是UDP发送方(客户)—接收方(服务器)编译代码:

from socket import *
serverName = "hostname"	    #这里是接收方(服务器)的主机名,也可以写IP地址
serverPost = 48000          #这里是端口号,与接收方(服务器)需编程定义一致
clientSocket = socket(AF_INET, SOCK_DGRAM)      #这里是定义一个发送方(客户)的套接字接口AF_INET是按照IPV4发送,SOCK_DGRAM这是定义以UDP发送
message = input('输入你想发送的小写字母:')       #这里是定义记录用户输入的字母赋值给message
clientSocket.sendto(message.encode(), (serverName, serverPost))#这里使用发送方(客户)的套接字接口进行发送,必须将message的内容encode,转换为字节类型发送,并附加上接收方(服务器的主机名与IP地址)
modifiedMessage, serveName = clientSocket.recvfrom(2048)      #这里将通过客户的套接字接口接收从服务器中修改后的信息。
print(modifiedMessage.decode())     #解码后打印
clientSocket.close()    #关闭端口

3.UDP接收方(服务器)编程

代码如下:

from socket import *
serverPort = 48000    #接收方端口号设置与发送方端口号一致
serverSocket = socket(AF_INET, SOCK_DGRAM)
serverSocket.bind(('', serverPort))    #将端口与接收方(服务器)的套接字接口绑定
print("This server is already")
while True:  #将服务器进程一直保持运行
    message, clientAddress = serverSocket.recvfrom(2048) #通过服务器套接字接口接收到发送方发送的数据
    modifiedMessage = message.decode().upper() #将这些字母大写
    serverSocket.sendto(modifiedMessage.encode(), clientAddress) #将修改过后的字母发送给客户端。

这里需注意一点,对于端口号的设置要避免现阶段已经占用了的服务的端口。

三、TCP套接字编程

1.特点

TCP是面向连接的,与UDP非常有着非常大不同的一点就是,在发送方发送数据组的时候,现与接收方(服务器)进行建立TCP通道(三次握手),建立通道之后,不用再发送数据组的同时附上服务器的主机名与端口号,再发送的过程中也可以接受服务器发送回的数据,而且TCP是提供可靠数据传输的UDP不保证。

与UDP编程不同的是,TCP中服务器有两个套接字接口(形象化),一个是欢迎套接字与连接套接字,这里将欢迎套接字结合UDP服务器编程的套接字来看会好理解一点,而连接套接字是,TCP服务器欢迎套接字接收到发送方的连接信号的同时,创建一个新的套接字这个称之为连接套接字,而之后所有的数据传输都是由连接套接字进行的,形象化的看为欢迎套接字是前台,你想要解决一个问题,打电话到前台,它提供了一个转接电话号码,转接一个新的对接的工作人员,进行对接你所需要解决的问题。

2.TCP发送方(客户)编程

代码如下:

from socket import *
serverName = "hostname"
serverPort = 48000
clientSocket = socket(AF_INET, SOCK_STREAM)    #前四行与UDP客户编程是一样的,只是这里的SOCK_STREAM是TCP连接
clientSocket.connect((serverName, serverPort)) #对服务器进行一个TCP连接
message = input('Please input lowercase sentence:')
clientSocket.send(message.encode())            #注意这里不用再进行附加服务器的地址与端口号,直接发送即可
modifiedMessage = clientSocket.recv(2048)
print("The modified message is:", modifiedMessage.decode())
clientSocket.close()

3.TCP接收方(服务器)编程

代码如下:

from socket import *
ServerPort = 48000
ServerSocket = socket(AF_INET, SOCK_STREAM)
ServerSocket.bind(('', ServerPort))#前几行与UDP服务器编程一致,除了SOCK_STREAM是TCP连接的
ServerSocket.listen(1)#欢迎至少一个用户进行TCP连接
print("The Server Is Already")
while True:
    connectionSocket, addr = ServerSocket.accept()#使用连接套接字响应用户连接
    message = connectionSocket.recv(2048)#用连接套接字接口接收发送方的数据
    modifiedMessage = message.decode().upper()
    connectionSocket.send(modifiedMessage.encode())
     connectionSocket.close()#关闭这一个连接套接字

四.实现结果

1.UDP运行结果

在这里插入图片描述

2.TCP运行结果

在这里插入图片描述

3.注意事项

这里我在做这个小实验的时候,理论上需要一台电脑作为服务器段运行UDP/TCP接收方(服务器)的代码,而另外一台电脑作为UDP/TCP发送方(客户)运行代码,但实际上也可以使用一台电脑,运行一个虚拟机,在两边分别运行不同的代码,或者更为简单的是(我现在使用的方法),使用pycharm分别并行运行两个代码,都是可以的(但是主机名必须写自己电脑的主机名),如何查看自己电脑的主机名,是先win+R,输入cmd,再输入hostname,你的主机名就出来啦,放到代码上的hostname处就可以。


总结

这是这个书的第二章应用层的最后一节,通过两个小的实验,来结束本章的学习,更加理解了TCP和UDP具体的运作流程,当然也可以在服务器上编译更多的数据处理内容,可以达到更多的作用,本次实验是将小写字母发送给服务器,服务器返回大写字母的实验,适合初学者,当然C、JAVA都可以编译。

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

计网菜包

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值