python学习之【16】网络编程
- 客户端/服务器架构
- 套接字:通信终点
- 套接字地址
- 面向连接与无连接套接字
- Python中的网络编程
- SOCKET模块
- 套接字对象方法
- TCP/IP客户端和服务器
- UDP/IP客户端和服务器
- SocketServer模块
- Twisted框架介绍
- 相关模块
- s.bind( ) 绑定地址(主机名,端口号对)到套接字
- s.listen( ) 开始TCP监听
- s.accept( ) 被动接受TCP客户端连接,(阻塞式)等待连接的到来。
客户端套接字函数
- s.connect( ) 主动初始化TCP服务器连接。
- s.connect_ex( ) connect( )扩展版本,出错时返回错误码,而不是抛出异常。
公共用途的套接字函数
- s,recv( ) 接受TCP数据。
- s.send( ) 发送TCP数据。
- s.sendall( ) 完整发送TCP数据。
- s.recvfrom( ) 接受UDP数据。
- s.sendto( ) 发送UDP数据。
- s.getpeername( ) 连接到当前套接字的远程的地址(TCP连接)
- s.getsockname( ) 当前套接字的地址。
- s.getsockopt( ) 返回当前套接字的参数。
- s.setsockopt( ) 设置指定套接字的参数。
- s.close( ) 关闭套接字。
面向模块的套接字函数
- s.setblocking( ) 设置套接字的阻塞与非阻塞模式。
- s.settimeout( ) 设置阻塞套接字操作的超时时间。
- s.gettimeout( ) 得到阻塞套接字操作的超时时间。
面向文件套接字函数
- s.fileno( ) 套接字文件描述符。
- s.makefile( ) 创建一个与该套接字关联的文件对象。
8.TCP/IP客户端和服务器
from socket import *
from time import ctime
HOST = ''
PORT = 21567
BUFSIZE = 1024
ADDR = (HOST,PORT) tcpSerSock = socket(AF_INET,SOCK_STREAM)
tcpSerSock.bind( ADDR)
tcpSerSock.listen(5) while True:
print 'waiting for connection......'
tcpCliSock,addr = tcpSerSock.accept( )
print '......connected from:',addr while True:
data = tcpCliSock.recv(BUFSIZ)
if not data:
break
tcpCliSock.send('[%s]%s' %(ctime(),data))
tcpCliSock.close( )
tcpSerSock.close()
from socket import * HOST = 'localhost'
PORT = 21567
BUFSIZ = 1024
ADDR = (HOST,PORT) tcpCliSock = socket(AF_INET,SOCK_STREAM)
tcpCliSock.connect(ADDR) while True:
data = raw_input('>')
if not data:
break
tcpCliSock.send(data)
data = tcpCliSock.recv(BUFSIZ)
if not data:
break
print data tcpCliSock.close()
from socket import *
from time import ctime HOST = ''
PORT = 21567
BUFSIZ = 1024
ADDR = (HOST,PORT) udpSerSock = socket(AF_INET,SOCK_DGRAM)
udpSerSock.bind(ADDR) while True:
print 'waiting for message......'
data,addr = udpSerSock.recvfrom(BUFSIZ)
udpSerSock.sendto('[%s] %s' % (ctime,data) ,addr)
print '......received from and returned to:',addr udpSerSock.close()
from socket import * HOST = 'localhost'
PORT = ""
BUFSIZ = 1024
ADDR = (HOST,PORT) udpCliSock = socket(AF_INET,SOCK_DGRAM) while Trus:
data = raw_input('>')
if not data:
break
udpCliSock.sendto(data,ADDR)
data,ADDR = udpCliSock.recvfrom(BUFSIZ)
if not data:
break
print data udpCliSock.close()
类 | 描述 |
BaseServer | 包含服务器核心功能与混合(mix-in)类挂钩;这个类只用于派生,所以不会生成这个类的实例;可以考虑使用TCPServer和UDPServer |
TCPServer/UDPServer | 基本的网络同步TCP/UDP服务器 |
UnixStreamServer/UnixDatagramServer | 基本的基于文件同步TCP/UDP服务器 |
ForkingMixIn/ThreadingMixIn | 实现了核心的进程化或线程化的功能;作为混合类,与服务器类一并使用以提供一些异步特性;这个类不会直接实例化。 |
ThreadingTCPServer/ThreadingUDPServer | ThreadingMixIn和TCPServer/UDPServer的组合 |
BaseRequestHandler | 包含处理服务器请求的核心功能,这个类只用于派生,所以不会生成这个类的实例可以考虑使用StreamRequestHandler 或 DatagramRequestHandler |
StreamRequestHandler/DatagramRequestHandler | 用于TCP/UDP服务器处理工具 |
创建一个SocketServerTCP服务器
from SocketServer import (TCPServer as TCP,StreamRequsetHandler as SRH)
from time import ctime HOST = ''
PORT = 21567
ADDR = (HOST,PORT) class MyRequestHandler(SRH):
def handle(self):
print '......connected from:',self.client_address
self.wfile.write('[%s]%s' % (ctime(),self.rfile.readline())) tcpServ = TCP(ADDR,MyRequestHandler)
print 'waiting for connection...'
tcpServ.serve_forever( )
from socket import * HOST = 'localhost'
PORT = 21567
BUFSIZ = 1024
ADDR = (HOST,PORT) while True:
tcpCliSock = socket(AF_INET,SOCK_STREAM)
tcpCliSock.connect(ADDR)
data = raw_input('>')
if not data:
break
tcpCliSock.send('%s\r\n' %data)
data = tcpCliSock.recv(BUFSIZ)
if not data:
break
print data.strip()
tcpCliSock.close()
from socket import *
from time import ctime HOST = ''
PORT = 21567
BUFSIZ = 1024
ADDR = (HOST,PORT) tcpSerSock = socket(AF_INET,SOCK_STREAM)
tcpSerSock.bind(ADDR)
tcpSerSock.listen(5) while True:
print 'waitiing for connection...'
tcpCliSock,addr = tcpSerSock.accept()
print '...connected from:',addr while True:
data = tcpCliSock.recv(BUFSIZ)
if not data:
break
tcpCliSock.send('[%s] %s' % (ctime(),data)) tcpSerSock.close()
from socket import *
import time,os HOST = ''
PORT = 21567
BUFSIZ = 1024
ADDR = (HOST,PORT) tcpSerSock = socket(AF_INET,SOCK_STREAM)
tcpSerSock.bind(ADDR)
tcpSerSock.listen(5) while True:
print 'waitiing for connection...'
tcpCliSock,addr = tcpSerSock.accept()
print '...connected from:',addr while True:
data = tcpCliSock.recv(BUFSIZ)
data = data.strip()
if not data:
break
if data == "date":
tcpCliSock.send('%s' % (time.ctime(time.time())))
elif data == "os":
tcpCliSock.send('%s' % (os.name))
elif data == "ls":
tcpCliSock.send('%s' % (os.listdir(os.curdir)))
else:
tcpCliSock.send('[%s] %s' % (time.ctime(),data)) tcpSerSock.close()
from socket import *
from time import ctime HOST = "localhost" PORT = getservbyname("daytime","udp") BUFSIZ = 1024 ADDR = (HOST,PORT) udpSerSock = socket(AF_INET,SOCK_DGRAM) udpSerSock.bind(ADDR) while True:
print "waiting for message..."
data,addr = udpSerSock.recvfrom(BUFSIZ)
udpSerSock.sendto("[%s]%s" % (ctime(), data),addr)
print "...received from and returned to:",addr udpSerSock.close
from socket import *
from time import ctime HOST = "localhost"
PORT = getservbyname("daytime","udp") BUFSIZ = 1024 ADDR = (HOST,PORT) udpCliSock = socket(AF_INET,SOCK_DGRAM) while True:
data = raw_input(">")
if not data:
break
udpCliSock.sendto(data,ADDR)
data,ADDR = udpCliSock.recvfrom(BUFSIZ)
if not data:
break
print data tcpCliSock.close()
from socket import * HOST = "localhost"
PORT = 23346
BUFSIZ = 1024
ADDR = (HOST,PORT) tcpCliSock = socket(AF_INET,SOCK_STREAM)
tcpCliSock.connect(ADDR) while True:
data = raw_input("client>")
if not data:
continue
tcpCliSock.send(data)
while True:
data = tcpCliSock.recv(BUFSIZ)
if not data:
continue
else:
print "server>",data
break tcpCliSock.close()
from socket import * HOST = "localhost"
PORT = 23346
BUFSIZ = 1024
ADDR = (HOST,PORT) tcpServSock = socket(AF_INET,SOCK_STREAM)
tcpServSock.bind(ADDR)
tcpServSock.listen(5) while True:
print "waiting for connection..."
tcpCliSock,addr = tcpServSock.accept()
print "connected from:",addr while True:
data = tcpCliSock.recv(BUFSIZ)
if not data:
continue
print "client>",data
data = raw_input("server>")
tcpCliSock.send(data) tcpServSock.close()
#!/usr/bin/env python
#-*- coding:utf-8 -*-
import socket,traceback,os
from threading import * host = 'localhost'
port = 51423 #监听所有的接口 #接受消息的线程
def handlerecv(clientsock):
print "New child",currentThread().getName()
print "Got connection from",clientsock.getpeername()
while True:
data = clientsock.recv(4096)
if not len(data):
break
print data
clientsock.close() #发送消息的线程
def handlesend(clientsock):
while True:
data = raw_input(">")
data = data + "\n"; #加上换行,好看一点。
clientsock.sendall(data)
#关闭连接
clientsock.close() #建立套接字
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
s.bind((host,port))
s.listen(1) while True:
try:
clientsock,clientaddr = s.accept()
except KeyboardInterrupt:
raise
except:
traceback.print_exc()
continue t = Thread(target = handlerecv,args=[clientsock])
t.setDaemon(1)
t.start() r = Thread(target = handlesend,args=[clientsock])
r.setDaemon(1)
r.start()
#!/usr/bin/env python
#-*-coding:utf-8-*- from socket import *
import sys
from threading import * if(len(sys.argv) < 3):
HOST = 'localhost'
PORT = 51423
else:
HOST = sys.argv[1]
PORT = int(sys.argv[2]) BUFSIZ = 1024
ADDR = (HOST,PORT) def handlesend(tcpCliSock):
while True:
sdata = raw_input('> ')
if not sdata:
break
tcpCliSock.send(sdata) tcpCliSock.close() tcpCliSock = socket(AF_INET,SOCK_STREAM)
tcpCliSock.connect(ADDR) #建立发送消息的线程
s = Thread(target = handlesend,args=[tcpCliSock])
s.setDaemon(1)
s.start() while True:
rdata = tcpCliSock.recv(BUFSIZ)
if not rdata:
break
print rdata
tcpCliSock.close()
#!/usr/bin/env python
# _*_ coding: utf8 _*_ from socket import *
from time import ctime
import threading
from string import split HOST = ''
PORT = 21567
BUFSIZE = 1024
ADDR = (HOST, PORT) def Deal(sck, username, room):
while True:
data = sck.recv(BUFSIZE)
for i in clients[room].iterkeys():
if i <> username:
if data <> "quit":
clients[room][i].send("[%s] %s: %s" %(ctime(), username, data))
else:
clients[room][i].send("用户%s在%s退出房间%s" %(username, ctime(), room ))
if data == "quit":
del clients[room][username]
sck.send(data)
sck.close()
break chatSerSock = socket(AF_INET, SOCK_STREAM)
chatSerSock.bind(ADDR)
chatSerSock.listen(5) clients = {"":{},} while True:
print 'waiting for connection...'
chatCliSock, addr = chatSerSock.accept()
print "...connected romt: ", addr
data = chatCliSock.recv(BUFSIZE)
username, room = split(data)
print username
if not clients.has_key(room):
clients[room] = {}
if clients[room].has_key(username):
chatCliSock.send("reuse")
chatCliSock.close()
else:
chatCliSock.send("success")
clients[room][username] = chatCliSock
t = threading.Thread(target=Deal, args=(chatCliSock, username, room))
t.start() chatSerSock.close()
客户端 cc.py
#!/usr/bin/env python
# _*_ coding: utf8 _*_ from socket import *
from time import ctime
import threading
import random
from sys import argv, exit, stdout
from getopt import gnu_getopt, GetoptError help_info = ["cs.py [ -h | --help | -u | --username] username",
"\t-h or --help\t显示帮助信息",
"\t-u or --username\指定用户名",
"\t-r or --room\t指定房间"]
def help():
for i in help_info:
print i def Send(sck, test):
while True:
data = raw_input('>')
sck.send(data)
if data == "quit":
break
def Recieve(sck, test):
while True:
data = sck.recv(BUFSIZ)
if data == "quit":
sck.close()
break
str = "\n" + data + "\n>"
stdout.write(str) HOST = 'localhost'
PORT= 21567
BUFSIZ = 1024
ADDR = (HOST, PORT)
threads = [] if __name__ == "__main__":
# 解析命令行参数
try:
opts, args = gnu_getopt(argv[1:], "hu:r:", ["help", "username=", "room="])
except GetoptError, err:
print str(err)
help()
exit(2)
username = ""
room = ""
for o, a in opts:
if o in ("-h", "--help"):
help()
exit(0)
elif o in ("-u", "--username"):
username = a
elif o in ("-r", "--room"):
room = a
else:
print "未知选项"
help()
exit(2)
if not username or not room:
help()
exit(2)
chatCliSock = socket(AF_INET, SOCK_STREAM)
chatCliSock.connect(ADDR)
chatCliSock.send("%s %s" %(username, room))
data = chatCliSock.recv(BUFSIZ)
if data == "reuse":
print "用户%s已登录房间%s" %(username, room)
raw_input()
exit(1)
elif data == "success":
print "用户%s成功登录房间%s" %(username, room)
t = threading.Thread(target=Send, args = (chatCliSock, None))
threads.append(t)
t = threading.Thread(target=Recieve, args = (chatCliSock, None))
threads.append(t)
for i in range(len(threads)):
threads[i].start()
threads[0].join()
python学习之【16】网络编程的更多相关文章
- python学习之路网络编程篇(第四篇)
python学习之路网络编程篇(第四篇) 内容待补充
- python学习笔记11 ----网络编程
网络编程 网络编程需要知道的概念 网络体系结构就是使用这些用不同媒介连接起来的不同设备和网络系统在不同的应用环境下实现互操作性,并满足各种业务需求的一种粘合剂.网络体系结构解决互质性问题彩是分层方法. ...
- python学习之路网络编程篇(第二篇)
新课程知识的引入:python作用域 #python中无块级别作用域 if 1 == 1 : name = 'alex' print(name) for i in range(10): name = ...
- python学习笔记10 ----网络编程
网络编程 网络编程需要知道的概念 网络体系结构就是使用这些用不同媒介连接起来的不同设备和网络系统在不同的应用环境下实现互操作性,并满足各种业务需求的一种粘合剂.网络体系结构解决互质性问题彩是分层方法. ...
- Python学习之==>Socket网络编程
一.计算机网络 多台独立的计算机通过网络通信设备连接起来的网络.实现资源共享和数据传递.在同一台电脑上可以将D盘上的一个文件传到C盘,但如果想从一台电脑传一个文件到另外一台电脑上就要通过计算机网络 二 ...
- python学习之路网络编程篇(第五篇)
paramiko简介 paramiko 是基于Python实现的SSH2远程安装连接,支持认证及秘钥方式.可以实现远程命令执行.文件传输.中间SSH代理等功能. paramiko安装 #!/bin/b ...
- python学习之路网络编程篇(第一篇)socket初识
什么是socket 网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为socket.socket通常也称为“套接字”,是一个通信链的句柄,可以用来实现不同虚拟机或不同计算机之间的 ...
- python学习之路网络编程篇(第五篇)-续篇
Python堡垒机实现之基础知识 一般的堡垒机必须要具备以下5个基本功能: 1.权限控制 2.执行命令 3.上传下载文件 4.远程登录 5.记录操作 权限控制 说明:根据不同的登录用户分配不同的可管理 ...
- python学习之路网络编程篇(第四篇)- 续
Memcache简介 Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动网站的速 ...
- python学习之路网络编程篇(第三篇)
python线程 Threading用于提供线程相关的操作,线程是应用程序中工作的最小单元. #!/usr/bin/env python # -*- coding:utf-8 -*- import t ...
随机推荐
- HQL的执行过程
解释器.编译器.优化器完成HQL查询语句从词法分析.语法分析.编译.优化以及查询计划(Plan)的生成.生成的查询计划存储在HDFS中,并在随后有mapreduce调用执行. 举个例子: 第一步:输入 ...
- echo\awk\sed\tee\curl的使用-shell
echo的使用:http://man.linuxde.net/echo awk的使用:http://man.linuxde.net/awk sed的使用:http://man.linuxde.net/ ...
- Linux的网卡相关
检测linux下网卡是否正常 1.dmesg | grep eth 如果出现以下 eth0: link up 说明是网卡正常的 eth0: registered as PCnet/PCI II 79 ...
- PHP之命名空间
前面的话 从广义上来说,命名空间是一种封装事物的方法.在很多地方都可以见到这种抽象概念.例如,在操作系统中目录用来将相关文件分组,对于目录中的文件来说,它就扮演了命名空间的角色.这个原理应用到程序设计 ...
- 【ecshop】如何解决DEPRECATED: PREG_REPLACE()报错
部署的ecshop 在高版本的PHP环境里边 ,访问 单个店铺时候会报错, 访问文件路径: http://www.test.com/supplier.php?suppId=5 类似这样的报错: D ...
- 我觉得epoll和select最大的区别
最近在用epoll,网速资料很多,大家都说epoll和select的区别比较大,而且select要不停遍历所有的fd,效率要低,而且fd有限制. 但是我认为二者最大的区别在于 先看代码 while ( ...
- Egret3D初步学习笔记三 (角色使用)
一 Unity中编辑角色 仍然使用unity4.7.1_Egret3D_Dll.unitypackage. 里面含有一个角色. 二 查看人物的动画 选中lingtong 属性面板里有个Animator ...
- 【BZOJ4545】DQS的trie 后缀自动机+LCT
[BZOJ4545]DQS的trie Description DQS的自家阳台上种着一棵颗粒饱满.颜色纯正的trie. DQS的trie非常的奇特,它初始有n0个节点,n0-1条边,每条边上有一个字符 ...
- java的synchronized有没有同步的类锁?
转自:http://langgufu.iteye.com/blog/2152608 http://www.cnblogs.com/beiyetengqing/p/6213437.html 没有... ...
- jpa关联映射(一)
开发中常用到数据表的关联(其实很难遇到..),spring-data-jpa(其实是hibernate)提供了一整套十分方便的注解来供我们使用表关联功能. OneToOne OneToMany Man ...