UDP,TCP的套接字编程的Python实现

UDP,TCP的套接字编程的Python实现

套接字:链接应用层和运输层,应用层的网络应用程序使用IP地址+端口号来标识本身,而后经过套接字调用运输层为其服务,网络应用程序只能指定本身要使用的网络类型,并设置一些普通参数,例如缓存大小等,除此以外的全部都要运输层本身完成。python

需求:

为了学习套接字如何操做运输层的UDP和TCP协议,此处提出一个需求:客户端接收用户输入的信息,并发送到服务器上,并接收由服务器把全部字母大写以后的数据,再显示出来。
整个过程须要如下步骤:
1.客户端提示用户信息输入并将数据发送给服务器
2.服务器接收信息,把字幕转换为大写
3.服务器将修改好的数据再次发送给客户端
4.客户端接收到服务器发送来的数据,并将其显示出来编程

UDP套接字编程

必需要先运行服务器端程序,保证服务器是处于运行状态的,客户端才能跟服务器进行通讯。api

UDP不须要先通过三次握手确保创建了链接,因此要在每一个要传输的报文上携带目的地址缓存

客户端代码:服务器

# -*- coding:utf-8 -*-
from socket import *

#设置服务器主机名或者IP地址
serverName = '127.0.0.1'
#设置主机的接收进程,即端口号
serverPort = 12000
#建立客户端套接字,AF_INET指示底层用IPv4, SOCK_DGRAM指定是UDP套接字不是TCP套接字
clientSocket = socket(AF_INET,SOCK_DGRAM)
#客户端提示用户输入信息
message = raw_input("Input lowercase sentence:")
#发送报文到目的地
#sendto()方法为报文附上目的地址,而且向进程的套接字clientSocket发送结果分组
clientSocket.sendto(message, (serverName, serverPort))
#当有数据到达客户端的套接字时,使用recvfrom()方法接收,指定缓存长度为2048
modifiedMessage, serverAddress = clientSocket.recvfrom(2048)
#打印刚刚接收到的信息
print modifiedMessage, serverAddress
#关闭套接字
clientSocket.close()

服务器端代码:网络

# -*- coding:utf-8 -*-
from socket import *

#定义一个端口号
serverPort = 12000
#实例化一个服务器端的套接字,AF_INET指定使用IPv4,SOCK_DGRAM指定使用UDP
serverSocket = socket(AF_INET, SOCK_DGRAM)
#为服务器端套接字绑定一个端口
serverSocket.bind(('', serverPort))
print "The server is ready to receive"
#处于循环监听状态
while True:
    #当有数据到达本地的12000端口的套接字处时,使用recvfrom()接收
    message, clientAddress = serverSocket.recvfrom(2048)
    #对接收到的数据进行处理
    modifiedMessage = message.upper()
    #使用sendto()发送数据到客户端
    serverSocket.sendto(modifiedMessage, clientAddress)

TCP套接字编程

一样,先运行服务器端的程序并发

TCP须要先通过三次握手在客户端和服务器之间链接链接,而后再传输数据,因此,在创建链接时须要指定目的地址,而在传输数据时就不须要再附带目的地址数据了。
须要注意的是:服务器监听全部客户端发来的链接请求,若是发现有请求,就为其创建一个新的链接来传输数据。socket

客户端程序:tcp

# -*- coding:utf-8 -*-

from socket import *

#服务器端的IP地址或名称和端口号
serverName = '127.0.0.1'
serverPort = 12000
#实例化套接字,SOCK_STREAM指定使用的是TCP协议
clientSocket = socket(AF_INET, SOCK_STREAM)
#客户端和服务器端创建链接
clientSocket.connect((serverName, serverPort))
#提示用户输入信息
sentence = raw_input("Input lowercase sentence:")
#客户端发送数据到服务器,此处不一样于UDP
#此处没有为数据指定地址,是由于已经和服务器创建和链接,能够直接通讯了
clientSocket.send(sentence)
#接收返回的数据
modifiedSentence = clientSocket.recv(1024)
#打印显示服务器端发回来的数据
print 'From Server:', modifiedSentence
#关闭客户端套接字链接
clientSocket.close()

服务器端程序:学习

# -*- coding:utf-8 -*-

from socket import *
#定义端口号变量
serverPort = 12000
#实例化服务端套接字,SOCK_STREAM指定使用TCP协议
serverSocket = socket(AF_INET, SOCK_STREAM)
#为套接字绑定端口号
serverSocket.bind(('', serverPort))
#监听来自客户端的请求,其中参数定义了最大链接数
serverSocket.listen(1)
print 'The server is ready to receive'
#循环监听
while 1:
    #服务器监听到来自客户端的请求,使用accept()为其建立一个新的专用的链接。
    #此处不一样与UDP,TCP在通过公用的三次握手以后,为其创建一个新链接供其传输数据
    connectionSocket, addr = serverSocket.accept()
    #接收客户端发送来的数据
    sentence = connectionSocket.recv(1024)
    #操做接收到的数据
    capitalizedSentence = sentence.upper()
    #发送数据到客户端
    connectionSocket.send(capitalizedSentence)
    #断开链接
    connectionSocket.close()
相关文章
相关标签/搜索