Server--通过fork()
#!/usr/bin/python3
#coding:utf-8
from socket import *
import os,sys
from signal import *
from time import sleep
HOST = ''
PORT = 8888
#创建socket,端口复用,绑定,监听
sockfd = socket()
sockfd.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
sockfd.bind((HOST,PORT))
sockfd.listen(5)
#处理客户端连接
def conn_handler(connfd):
while True:
data = connfd.recv(1024)
if not data:
break
print("{}:{}".format(connfd.getpeername(), data.decode()))
connfd.close()
sys.exit(0)
#循环处理客户端请求
while True:
#异常处理
try:
connfd, address = sockfd.accept()
print('new connections:',address)
#ctrl-c 则退出
except KeyboardInterrupt:
print('Ctrl_C, Quit!')
sys.exit(1)
except Exception as e:
print(e)
continue
#处理僵尸进程
signal(SIGCHLD, SIG_IGN)
pid = os.fork()
if pid < 0:
print('子进程创建失败')
connfd.close()
continue
elif pid == 0:
#因为子进程是复制父进程代码段,而子进程不操作sockfd,所以close()
sockfd.close()
conn_handler(connfd)
else:
#父进程不处理connfd,所以关闭
connfd.close()
continue
sleep(1)
Client
#!/usr/bin/python3
#coding:utf-8
from socket import *
#address为发送端创建的同一个文件
HOST = '127.0.0.1'
PORT = 8888
ADDR = (HOST,PORT)
clientfd = socket(AF_INET,SOCK_STREAM)
#连接到该套接字
clientfd.connect(ADDR)
while True:
msg = input('>>>')
if not msg:
break
clientfd.send(msg.encode())
clientfd.close()