网络编程之socket
套接字(socket)是一个抽象层,应用程序可以通过它发送或接收数据,可对其进行像对文件一样的打开、读写和关闭等操作。套接字允许应用程序将I/O插入到网络中,并与网络中的其他应用程序进行通信。网络套接字是IP地址与端口的组合。
2、Socket 发展史
套接字起源于 20 世纪 70 年代加利福尼亚大学伯克利分校版本的 Unix,有时人们也把套接字称为“伯克利套接字”或“BSD 套接字”。一开始,套接字被设计用在同一台主机上多个应用程序之间的通讯。这也被称进程间通讯,或 IPC。套接字有两种(或者称为有两个种族),分别是基于文件型的和基于网络型的。
1、基于文件型套接字家族的名字:AF_UNIXunix一切皆文件,基于文件的套接字调用的就是底层的文件系统来取数据,两个套接字进程运行在同一机器,可以通过访问同一个文件系统间接完成通信
2、基于网络型套接字家族的名字:AF_INET(还有AF_INET6被用于ipv6,还有一些其他的地址家族,不过,他们要么是只用于某个平台,要么就是已经被废弃,或者是很少被使用,或者是根本没有实现,所有地址家族中,AF_INET是使用最广泛的一个,python支持很多种地址家族,但是由于我们只关心网络编程,所以大部分时候我么只使用AF_INET)
3、socket参数详解
socket.socket(family=AF_INET,type=SOCK_STREAM)
family地址系列应为AF_INET(默认值),AF_INET6,AF_UNIX,AF_CAN或AF_RDS,(AF_UNIX 域实际上是使用本地 socket 文件来通信)
type套接字类型应为SOCK_STREAM(默认值),SOCK_DGRAM,SOCK_RAW或其他SOCK_常量之一。SOCK_STREAM 是基于TCP的,有保障的(即能保证数据正确传送到对方)面向连接的SOCKET,多用于资料传送。 SOCK_DGRAM 是基于UDP的,无保障的面向消息的socket,多用于在网络上发广播信息。
import socket
udp_sk = socket.socket(type = socket.SOCK_DGRAM)
udp_sk.bind("127.0.0.1",9999)
while True:
msg,addr = udp_sk.recvfrom(1024)
print(msg.decode("utf-8"))
info = input(">>>").encode("utf-8")
udp_sk.sendto(info,addr)
udp_sk.close()
"""客户端"""
import socket
udp_sk = socket.socket(type = socket.SOCK_DGRAM)
ip_port = ("127.0.0.1",9999)
while True:
msg = input(">>>>>")
udp_sk.sendto(msg.encode("utf-8"),ip_port)
ret,addr = udp_sk.recvfrom(1024)
print("服务器>>>",ret.decode("utf-8"))
udp_sk.close()