使用epoll實現一個udp server && client

udp server

#!/usr/bin/env python
#-*- coding:utf-8 -*-

import socket
import select
import Queue

#建立socket對象
serversocket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
#設置IP地址複用
#serversocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
#ip地址和端口號
server_address = ("127.0.0.1", 50000)
#綁定IP地址
serversocket.bind(server_address)
print  "服務器啓動成功,監聽IP:" , server_address
#服務端設置非阻塞
#serversocket.setblocking(False)
#超時時間
timeout = 10

#建立epoll事件對象,後續要監控的事件添加到其中
epoll = select.epoll()
#註冊服務器監聽fd到等待讀事件集合
print "serversocket.fileno():%s" % serversocket.fileno()
epoll.register(serversocket.fileno(), select.EPOLLIN)

#文件句柄到所對應對象的字典,格式爲{句柄:對象}
fd_to_socket = {serversocket.fileno():serversocket,}

print "select.EPOLLIN:%s" % select.EPOLLIN
print "select.EPOLLOUT:%s" % select.EPOLLOUT
print "select.EPOLLHUP:%s" % select.EPOLLHUP

while True:
  #輪詢註冊的事件集合,返回值爲[(文件句柄,對應的事件),(...),....]
  events = epoll.poll(timeout)
  if not events:
     print "epoll超時無活動鏈接,從新輪詢......"
     continue
  print "有" , len(events), "個新事件,開始處理......"

  for fd, event in events:
     socket = fd_to_socket[fd]
     print "fd:%s, socket:%s, event:%s" % (fd, socket, event)

     #可讀事件
     if event & select.EPOLLIN:
        #接收數據
        #data = socket.recv(1024)
        data, addr = socket.recvfrom(1024)
        if data:
           print "收到數據:" , data
           #修改讀取到消息的鏈接到等待寫事件集合(即對應客戶端收到消息後,再將其fd修改並加入寫事件集合)
           #epoll.modify(fd, select.EPOLLOUT)
           socket.sendto(data, addr)
        else:
           print 'client close'
           #在epoll中註銷客戶端的文件句柄
           epoll.unregister(fd)
           #關閉客戶端的文件句柄
           fd_to_socket[fd].close()
           #在字典中刪除與已關閉客戶端相關的信息
           del fd_to_socket[fd]
           #epoll.modify(fd, select.EPOLLHUP)
     #關閉事件
     elif event & select.EPOLLHUP:
        print 'client close'
        #在epoll中註銷客戶端的文件句柄
        epoll.unregister(fd)
        #關閉客戶端的文件句柄
        fd_to_socket[fd].close()
        #在字典中刪除與已關閉客戶端相關的信息
        del fd_to_socket[fd]

#在epoll中註銷服務端文件句柄
epoll.unregister(serversocket.fileno())
#關閉epoll
epoll.close()
#關閉服務器socket
serversocket.close()

udp client

#!/usr/bin/env python
#-*- coding:utf-8 -*-

import socket

#建立客戶端socket對象
clientsocket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
#服務端IP地址和端口號元組
server_address = ('127.0.0.1',50000)
#客戶端鏈接指定的IP地址和端口號
#clientsocket.connect(server_address)

while True:
    #輸入數據
    data = raw_input('please input:')
    #客戶端發送數據
    print "send to ..."
    clientsocket.sendto(data, ('127.0.0.1',50000))
    #客戶端接收數據
    print "receive from ..."
    server_data = clientsocket.recv(1024)
    print '客戶端收到的數據:%s'  % server_data
相關文章
相關標籤/搜索