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