一个hello/hi的简单的网络聊天程序和python Socket API与Linux Socket API之间的关系
Posted zzh大帅
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一个hello/hi的简单的网络聊天程序和python Socket API与Linux Socket API之间的关系相关的知识,希望对你有一定的参考价值。
1.Socket概述
套接字(socket)是一个抽象层,应用程序可以通过它发送或接收数据,可对其进行像对文件一样的打开、读写和关闭等操作。套接字允许应用程序将I/O插入到网络中,并与网络中的其他应用程序进行通信。网络套接字是IP地址与端口的组合。
套接字可以看成是两个网络应用程序进行通信时,各自通信连接中的一个端点。通信时,其中的一个网络应用程序将要传输的一段信息写入它所在主机的Socket中,该Socket通过网络接口卡的传输介质将这段信息发送给另一台主机的Socket中,使这段信息能传送到其他程序中。因此,两个应用程序之间的数据传输要通过套接字来完成。工作流程如下图所示:
Socket():创建套接字。
直接上代码:
客户端:
1 import socket 2 import sys 3 4 # 创建一个socket 5 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 6 # 建立连接 7 s.connect((\'127.0.0.1\', 3000)) 8 while True: 9 # 发送数据: 10 try: 11 data = input("客户端:") 12 s.send(data.encode()) 13 buf = s.recv(1024).decode() 14 if buf != \'exit\': 15 print("服务端: " + buf) 16 except: 17 print("Dialogue Over") 18 s.close() 19 sys.exit(0)
服务端:
1 import socket 2 3 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 4 s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 5 s.bind((\'127.0.0.1\', 3000)) # 监听端口 6 s.listen(1) # 调用listen()方法开始监听端口,传入的参数指定等待连接的最大数量 7 sock, addr = s.accept() 8 buf = sock.recv(1024).decode() 9 while True: 10 if buf != \'exit\': 11 print("客户端: " + buf) 12 data = input("服务端: ") 13 sock.send(data.encode()) 14 if data == \'exit\': 15 break 16 buf = sock.recv(1024).decode()
这两个程序有这么几行,对应上面的工作流程说明:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM):
创建socket实现IPV4的通信(socket.AF_INET)并使用流式socket for TCP(socket.SOCK_STREAM)
s.bind((\'127.0.0.1\', 3000)):
将地址(主机名(127.0.0.1)、端口号(3000)对)绑定到套接字上
s.connect((\'127.0.0.1\', 3000))
连接到指定的服务端的socket上
s.listen(1):
调用listen()方法开始监听端口,传入的参数指定等待连接的最大数量,此处为1
sock, addr = s.accept() :
接受TCP连接并返回(conn,address),其中conn是新的套接字对象,可以用来接收和发送数据。address是连接客户端的地址。
sock.send(data.encode()):
发送TCP数据,将参数中的数据发送到连接的套接字。
buf = sock.recv(1024).decode():
接受TCP套接字的数据。数据以字符串形式返回,指定要接收的最大数据量为1024。
s.close():
关闭套接字。
程序运行结果如下:
客户端:
服务端:
注意要先启动Server再启动Client,否则会报错
3.python函数和Linux Socket API的对应关系
对应关系如下表:
python函数 | Linux Socket API |
socket.socket | int socket(int domain, int type, int protocol); |
bind | int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen); |
connect | int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen); |
listen | int listen(int sockfd, int backlog); |
accept | int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen); |
send | ssize_t send(int sockfd, const void *buf, size_t len, int flags); |
recv | ssize_t recv(int sockfd, void *buf, size_t len, int flags); |
close | int close(int socketfd) |
可以通过strace python3 server.py命令跟踪这个程序所使用的系统调用
在输出的结果中有这么一段:
这个程序使用的系统调用对应上面的表格中的Linux Socket API
以上是关于一个hello/hi的简单的网络聊天程序和python Socket API与Linux Socket API之间的关系的主要内容,如果未能解决你的问题,请参考以下文章
以您熟悉的编程语言为例完成一个hello/hi的简单的网络聊天程序