socket简介
socket诞生解决了网络上一个重要的问题,就是完美的保障了通信的准确性,目前网络上各种各样的服务大多都是基于Socket来完成通信的,可见socket在通信中举足轻重。
什么是socket
我们目前的生活中互联网每一秒都传送着大量的信息,怎么才能准确通信呢?
我们先从标识一个进程开始吧,在一台电脑设备上当我们每打开一个应用的时候系统就会产生一个运行着的进程并且给这个进程了一个唯一标识,但是这个标识只是电脑上区分不同应用的标识,在协议中在网络层可以通过“ip地址”唯一的标识网络中的主机设备,在传输层中可以通过“协议和端口号”唯一标识网络中的进程,这样一来为了更好准确的标记与进程进行交互这时神奇的socket诞生了,那它到底神奇在哪里呢?
大多就是利用“ip地址,协议,端口”准确而一部到位的通信,简单点说就是进程之间数据完美共享。
socket的udp协议应用
首先我们先通过图来说明一下流程:
这样一来我们先用代码来解决用UDP客户端给服务端发消息代码如下:
客户端:
#服务器的地址和端口
#ip_port=(("10.1.12.51",8000))
while True:
content = input("请输入你的消息:")
if content=="stop":
break
#以utf-8编码对content进行编码,获取二进制bytes类型对象,encode进行编码
# content=content.encode("utf-8")
#向服务器发一条消息,client.sendto 发送udp数据,将数据发送到套接字,address形式是(IP地址,pot)元组
client.sendto(content.encode("utf-8"),("10.1.12.51",8000))
#3.接收服务器消息
#接收的是从服务器返回的消息
msg,addr=client.recvfrom(1024)
# msg=msg.decode("utf-8")
#4.打印消息
print("客户端{}发的消息是:{}".format(addr,msg.decode("utf-8")))
#5.关闭套接字
client.close()
服务端:
#encoding:utf-8
import socket
#1.创建一个服务器socket对象
udp_sk=socket.socket(type=socket.SOCK_DGRAM)
udp_sk.bind(("10.1.12.51",8000))
while True:
msg,addr=udp_sk.recvfrom(1024)
print(msg.decode("utf-8"))
info=input(">>>server:").encode("UTF-8")
if info=="stop":
break
udp_sk.sendto(info,addr)
print("客户端{}发的消息是:{}".format(addr, msg))
udp_sk.close()
总结:udp是无链接的,启动服务之后可以直接接受消息,不需要提前建立链接,这里使用套接字,Type中写套接字的类型(流式套接字主要用于TCP协议,数据报套接字主要用于UDP协议 ),使用套接字的流程有点像文件的使用流程,首先创建套接字,然后套接字收/发数据,最后关闭套接字。
socket的TCP协议应用
首先我们先通过图来说明一下流程:
这样一来我们先用代码来解决用TCP客户端给服务端发消息代码如下:
客户端:
#encoding:utf-8
import socket
#创建客户端的套接字
while True:
tcp_client=socket.socket(type=socket.SOCK_STREAM)
#绑定服务器端口
ip_port=("10.1.12.51",8000)
tcp_client.connect(ip_port)
#给服务器发消息
msg=input("给服务器发消息:")
msg=msg.encode("utf-8")
tcp_client.send(msg)
#接受服务器的消息
recv_msg=tcp_client.recv(1024)
recv_msg=recv_msg.decode("utf-8")
print("服务器的消息是:{}".format(recv_msg))
#关闭套接字
tcp_client.close()
服务端:
#encoding:utf-8
import socket
#1.创建一个服务器socket对象
udp_sk=socket.socket(type=socket.SOCK_DGRAM)
udp_sk.bind(("127.0.0.1",8000))
while True:
msg,addr=udp_sk.recvfrom(1024)
print(msg.decode("utf-8"))
info=input(">>>server:").encode("UTF-8")
if info=="stop":
break
udp_sk.sendto(info,addr)
print("客户端{}发的消息是:{}".format(addr, msg))
udp_sk.close()
总结:Socket是基于tcp协议的,tcp是基于链接的,因此在通讯开始之前,一定要先建立相关的链接,才能发送数据。必须先启动服务端,然后再启动客户端去链接服务端。
socket的中的TCP协议与UDP协议的不同点
1.面向连接(确认有创建三方连接,连接已创建才能传输)
2.有序数据传输
3.重发丢失的数据包
4.舍弃重复的数据包
5.无差错的数据传输
6.阻塞/流量控制
来源:CSDN
作者:asnowdream
链接:https://blog.csdn.net/asnowdream/article/details/103847637