python的一个hello/hi的简单的网络聊天程序
python网络聊天程序的代码:
服务端:
# -*- coding:utf-8 -*- import socket # 给定IP地址与端口号,其中'127.0.0.1'代表本机地址 host = '127.0.0.1' port = 2000 # 创建 socket 对象 server = socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 绑定端口 server.bind((host,port)) # 开始监听TCP传入连接,可挂起5个链接 server.listen(5) print("等待客户端链接") # 接受TCP连接,返回的sock是新的套接字对象,可以用来接收和发送数据。addr是连接客户端的地址 sock,addr=server.accept() while True: data = sock.recv(1024) # 接受TCP套接字的数据。数据以字符串形式返回,且指定最大长度为1024 if not data: print("断开链接") sock.close() # 关闭收到的套接字 break print("客户端: "+ data.decode("utf-8")) msg = input("服务端: ") sock.send(msg.encode("utf-8")) server.close() # 关闭建立的套接字
客户端:
# -*- coding:utf-8 -*- import socket # 给定IP地址与端口号,其中'127.0.0.1'代表本机地址 host = '127.0.0.1' port = 2000 # 创建 socket 对象 client = socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 主动初始化TCP服务器连接 client.connect((host,port)) while True: msg = input('输入:') if msg == 'exit': break client.send(msg.encode("utf-8")) data = client.recv(1024) data = data.decode("utf-8") print("服务端: "+ data) client.close() # 关闭套接字
运行结果截图如下:
服务端:
客户端:
如图所示,该程序需要先运行server.py,再运行client.py,否则会报错。可以传入英文或中文,一次性只能传输1024个字符,而且只有在收到了对方的回复后才能继续传输下一段,功能比较简陋。而如果客户端发送了“exit”,则客户端会直接关闭套接字,于是服务端会收到空的内容,然后输出“断开链接”,然后也关闭套接字。
在liunx中,通过strace命令跟踪程序调用,发现python的API基本是对Linux的API进行封装
Python | Linux |
socket(AF_INET,SOCK_STREAM) |
int socket(int domain, int type, int protocol); |
bind((host,port)) |
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen); |
accept() |
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen); |
listen([blacklog]) |
int listen(int sockfd, int backlog); |
recv(BUFERSIZE) |
ssize_t recv(int sockfd, void *buf, size_t len, int flags); |
close() |
int close(int socketfd) |
send(string[,flag]) |
ssize_t send(int sockfd, const void *buf, size_t len, int flags); |