为了把全世界的所有不同类型的计算机都连起来,就必须规定一套全球通用协议,为了实现互联网这个目标。
相对于TCP,UDP是面向无条件连接的协议,速度更快,但是不可靠。
所谓Socket就是套接字,套接字就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。
一个套接字就是网络上进程通信的一端,提供了应用层进程利用网络协议交换数据的机制。从所处的地位来讲,套接字上联应用进程,下联网络协议栈,是应用程序通过网络协议进行通信的接口,是应用程序与网络协议根进行交互的接口
s=socket.socket(AddressFamily,type)
例如,为了创建TCP/IP套接字,可以使用如下方法调用socket.socket()
tcpSock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
为了创建UDP/IP套接字,可以使用如下方法调用socket.socket()
udpSock=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
#创建一个TCP服务器
ss = socket() #创建服务器套接字
ss.bind() #把地址绑定到套接字上
ss.listen() #监听连接
inf_loop: #服务器无线循环
cone,addr = ss.accept() #接收客户端连接
comm_loop: #通信循环
cone.recv()/cs.send() #对话(接受与发送)
cone.close() #关闭客户端套接字
ss.close() #关闭服务器套接字(可选)
eg:
# -*- coding:utf-8 -*-
import socket #导入socket模块
host = '127.0.0.1' #主机IP
port = 8080 #端口号
web = socket.socket() #创建 socket 对象
web.bind((host,port)) #绑定端口
web.listen(5) #设置最多连接数
print ('服务器等待客户端连接...')
#开启死循环
while True:
conn,addr = web.accept() #建立客户端连接
data = conn.recv(1024).decode() #获取客户端请求数据
print(data) #打印接受数据
conn.sendall(b'HTTP/1.1 200 OK\r\n\r\nHello World') #向客户端发送数据
conn.close() #关闭链接
>>>
服务器等待客户端连接...
import socket # 导入socket模块
s= socket.socket() # 创建TCP/IP套接字
host = '127.0.0.1' # 获取主机地址
port = 8080 # 设置端口号
s.connect((host,port)) # 主动初始化TCP服务器连接
send_data = input("请输入要发送的数据:") # 提示用户输入数据
s.send(send_data.encode()) # 发送TCP数据
# 接收对方发送过来的数据,最大接收1024个字节
recvData = s.recv(1024).decode()
print('接收到的数据为:',recvData)
# 关闭套接字
s.close()
>>>
客户端控制台:
请输入要发送的数据:123
接收到的数据为: HTTP/1.1 200 OK
Hello World
服务端控制台:
服务器等待客户端连接...
123
服务器
import socket # 导入socket模块
host = socket.gethostname() # 获取主机地址
port = 12345 # 设置端口号
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) #创建TCP/IP套接字
s.bind((host,port)) # 绑定地址(host,port)到套接字
s.listen(1) # 设置最多连接数量
sock,addr = s.accept() # 被动接受TCP客户端连接
print('连接已经建立')
info = sock.recv(1024).decode() # 接收客户端数据
while info != 'byebye': # 判断是否退出
if info :
print('接收到的内容:'+info)
send_data = input('输入发送内容:') # 发送消息
sock.send(send_data.encode()) # 发送TCP数据
if send_data =='byebye': # 如果发送exit,则退出
break
info = sock.recv(1024).decode() # 接收客户端数据
sock.close() # 关闭客户端套接字
s.close() # 关闭服务器端套接字
客户端
import socket # 导入socket模块
s= socket.socket() # 创建TCP/IP套接字
host = socket.gethostname() # 获取主机地址
port = 12345 # 设置端口号
s.connect((host,port)) # 主动初始化TCP服务器连接
print('已连接')
info = ''
while info != 'byebye': # 判断是否退出
send_data=input('输入发送内容:') # 输入内容
s.send(send_data.encode()) # 发送TCP数据
if send_data =='byebye': # 判断是否退出
break
info = s.recv(1024).decode() # 接收服务器端数据
print('接收到的内容:'+info)
s.close() # 关闭套接字
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) #创建UDP套接字
s.bind(('127.0.0.1', 8888)) # 绑定地址(host,port)到套接字
print('绑定UDP到8888端口')
# 接收数据:
data, addr = s.recvfrom(1024)
data = float(data)*1.8 + 32 # 转化公式
send_data = '转换后的温度(单位:华氏温度):'+str(data)
print('Received from %s:%s.' % addr)
s.sendto(send_data.encode(), addr) # 发送给客户端
s.close() # 关闭服务器端套接字
import socket # 导入socket模块
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) #创建UDP套接字
data = input('请输入要转换的温度(单位:设置度):') #输入要转化的温度
s.sendto(data.encode(), ('127.0.0.1', 8888)) # 发送数据
print(s.recv(1024).decode()) # 打印接收数据:
s.close() # 关闭套接字