UDP协议:

#coding=utf-8
from threading import Thread
from socket import *
#收数据
def receiveData(udpSocket,destIp,destPort):
        while True:
                content,destInfo = udpSocket.recvfrom(1024)
                print("\r【Receive from %s : %s】%s\nInput:"%(destInfo[0],destInfo[1],content.decode("gb2312")),end="")

#发数据
def sendData(udpSocket,destIp,destPort):
        while True:
                sendInfo = input("Input:")
                udpSocket.sendto(sendInfo.encode('gb2312'),(destIp,destPort))

#udpSocket = None 
#destIp = ""
#destPort = 0
#def main():
#       global udpSocket,destIp,destPort
#       destIp = input("对方的IP:")
#       destPort = int(input("对方的端口:"))
#       #创建Socket对象
#       udpSocket = socket(AF_INET,SOCK_DGRAM)
#       udpSocket.bind(("",4567))
#       tr = Thread(target=receiveData)
#       ts = Thread(target=sendData)
#
#       tr.start()
#       ts.start()
#
#       tr.join()
#       ts.join()

def main():
        destIp = input("对方的IP:")
        destPort = int(input("对方的端口:"))
        #创建Socket对象
        udpSocket = socket(AF_INET,SOCK_DGRAM)
        udpSocket.bind(("",4567))
        tr = Thread(target=receiveData,args=(udpSocket,destIp,destPort))
        ts = Thread(target=sendData,args=(udpSocket,destIp,destPort))

        tr.start()
        ts.start()

        tr.join()
        ts.join()
if __name__ == '__main__':
        main()


TCP协议:

服务端:

#coding=utf-8
from socket import * 

serverSocket = socket(AF_INET,SOCK_STREAM)
#绑定端口
serverSocket.bind(("",8899))

#最大监听5个客户端
serverSocket.listen(5)

while True:
	#接收到的客户端
	clientSocket,clientInfo = serverSocket.accept()
	while True:
		#客户端的数据
		recvData = clientSocket.recv(1024).decode("gb2312")
		if recvData != "end":
			print('客户端:%s;数据是:%s'%(str(clientInfo),recvData))
		else:
			print('客户端:%s;会话结束.'%(str(clientInfo)))
			break
	clientSocket.close()

serverSocket.close()

客户端:

#coding=utf-8
from socket import * 

clientSocket = socket(AF_INET,SOCK_STREAM)

#连接服务端
serverInfo = ("192.168.1.107",8899)
clientSocket.connect(serverInfo)

#发送数据到服务端
clientSocket.send('hello'.encode('gb2312'))

#接收到服务端的数据
recvData = clientSocket.recv(1024)

print('接收到服务端:%s;数据是:%s'%(str(serverInfo),recvData.decode("gb2312")))

clientSocket.close()

IO多路复用之epoll:epoll(事件通知机制比select(轮询机制)性能要好

server端:

import socket
import select

#创建套接字
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

#设置可以重复使用绑定的信息
s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)

#绑定本机信息
s.bind(("",7788))

#变为被动
s.listen(10)

#创建epoll对象
epoll = select.epoll()

#将创建的套接字添加到epoll的事件监听中
#EPOLLIN 可读,EPOLLOUT可写,EPOLLET通知一次,EPOLLLT通知多次
epoll.register(s.fileno(),select.EPOLLIN|select.EPOLLET)

connections = {}
addresses = {}

#循环等待客户端发送数据
while True:
        #获取所有可以收发的套接字--未指定超时时间则为阻塞等待
        epoll_list = epoll.poll()
        #对事件进行判断
        for fd,events in epoll_list:
                #如果是socket创建的套接字被激活
                if fd == s.fileno():
                        conn,addr = s.accept()
                        print('有新的客户端来到%s'%str(addr))

                        #将conn和addr信息分别保存起来
                        connections[conn.fileno()] = conn 
                        addresses[conn.fileno()] = addr

                        #向epoll中注册连接socket的刻度事件
                        epoll.register(conn.fileno(),select.EPOLLIN|select.EPOLLET)

                elif events == select.EPOLLIN:#接收数据的事件
                        #从激活fd上接收
                        recvData = connections[fd].recv(1024)
                        if len(recvData)>0:
                                print('recv:%s'%recvData)
                        else:
                                #从epoll中移除该连接
                                epoll.unrgister(fd)

                                #server侧主动关闭连接fd
                                connections[fd].close()
                                print("%s---offline--"%str(addresses[fd]))
客户端:

#coding=utf-8  
from socket import *   
  
clientSocket = socket(AF_INET,SOCK_STREAM)  
  
#连接服务端  
serverInfo = ("127.0.0.1",7788)  
clientSocket.connect(serverInfo)  
  
#发送数据到服务端  
clientSocket.send('hello'.encode('gb2312'))  
  
#接收到服务端的数据  
recvData = clientSocket.recv(1024)  
  
print('接收到服务端:%s;数据是:%s'%(str(serverInfo),recvData.decode("gb2312")))  
  
clientSocket.close() 
运行服务端:

[chaoge@localhost mypython]$ python3 epoll01.py
有新的客户端来到('127.0.0.1', 41358)
recv:b'hello'
有新的客户端来到('127.0.0.1', 41360)
recv:b'hello'
有新的客户端来到('127.0.0.1', 41362)
recv:b'hello'


运行客户端:

[chaoge@localhost ~]$ python3 mypython/socket02.py 
接收到服务端:('127.0.0.1', 7788);数据是:

posted on 2018-01-20 03:35  fonyer  阅读(189)  评论(0编辑  收藏  举报