伺服器端:
#-*- coding:utf8 -*-
import socket
import select
import os
address = "0.0.0.0"
port = 10001
sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
def main():
global address,port,sock
epoll = select.epoll()
#擷取建立好的sock的檔案描述符
fd = sock.fileno()
sock.bind((address,port))
sock_dict = {}
sock_dict[fd] = sock
#對該sock進行注冊
epoll.register(fd,select.EPOLLIN)
sock.listen(5)
while True:
events = epoll.poll(1)
for fileno,event in events:
#擷取到的檔案描述符和sock的相同就說明是一個新的連接配接
if fileno == fd:
(client,address) = sock.accept()
print address
client.setblocking(0)
#将新的連接配接進行注冊,用來接收消息
epoll.register(client.fileno(),select.EPOLLIN)
sock_dict[client.fileno()] = client
elif event & select.EPOLLIN:
print "fileno:",fileno
data = sock_dict[fileno].recv(128)
if data == '你好':
print "Data:",data.decode('UTF-8')
sock_dict[fileno].send("你好")
elif len(data) == 0:
print "線路%d已下線"%fileno
epoll.unregister(fileno)
else:
print "Data:",data
if __name__ == '__main__':
main()
用戶端:
#coding: UTF-8
import socket
import select
address = "127.0.0.1"
port = 10001
sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
def main():
global address,port,sock
sock.connect((address,port))
epoll = select.epoll()
fd = sock.fileno()
#這裡的epoll注冊隻是用來異步接收服務端發過來的消息
epoll.register(fd,select.EPOLLIN)
while True:
events = epoll.poll(1)
for fileno,event in events:
if fileno == fd:
if event & select.EPOLLIN:
data = sock.recv(128)
print data
data = raw_input(">")
if data == 'q':
break
elif data == '':
print "不能發送空消息"
continue
sock.send(data)
sock.close()
main()