欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

网络编程之socket

程序员文章站 2022-05-06 16:52:12
...

套接字(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()