Python基础笔记系列十三:socket网络编程
本系列教程供个人学习笔记使用,如果您要浏览可能需要其它编程语言基础(如C语言),why?因为我写得烂啊,只有我自己看得懂!!
使用python编写一个简易的服务端程序和客户端程序,启动服务端和客户端(监听的ip和端口一致),服务端对客户端进行指定Ip和端口的监听,实现接收客户端发送的数据以及对客户端发送数据。
- 使用原生socket
主要运用到python的socket模块,直接使用自己的代码进行socket对象的创建、ip和端口的绑定、接收和发送数据等操作。
服务端:server1.py#incoding:utf-8 #下面这个例子是直接用socket来编程
#server1 :
from socket import *
myhost='127.0.0.1'
myport=8080
sockobj = socket(AF_INET,SOCK_STREAM) #socket(ip协议,tcp协议)
sockobj.bind((myhost,myport)) #绑定ip和端口
sockobj.listen(128) #同时允许128个连接
while True: #注意True首字母大写,当然也可以写while 1:
connection,address = sockobj.accept() #accept()返回两个值,一个连接对象,一个地址
print 'connect by',address #打印连接这个服务的地址
while True:
data = connection.recv(1024) #把接收的数据实例化
print '客户端发送过来的数据:'+data#打印一下数据
connection.send('yours data:' + data) #回显数据,返回给客户端
connection.close() #关闭连接客户端:client1.py
#incoding:utf-8
#server1的客户端程序
#借鉴:https://blog.csdn.net/rebelqsp/article/details/22109925
from socket import *
HOST='127.0.0.1'
PORT=8080
s=socket(AF_INET,SOCK_STREAM) #定义socket类型,网络通信,TCP
s.connect((HOST,PORT)) #要连接的IP与端口
while 1:
cmd=raw_input("Please input cmd:") #与人交互,输入命令
s.send(cmd) #把命令发送给服务端端
# print help(s)
data=s.recv(1024) #把接收的数据定义为变量
print data #输出变量
s.close() #关闭连接写好服务端和客户端程序,现在进行测试。
首先启动服务端进行ip端口监听,如果端口被占用,尝试更换端口,范围是0到65535或者停用端口占用,看这里传送门:http://www.cnblogs.com/hyyq/p/6747356.html
服务端启动成功后,启动客户端程序(这里需要输入内容,所以需要安装REPL插件哦,如果没有,看这里传送门:http://www.cnblogs.com/hyyq/p/8909129.html)
这时候在客户端输入数据,并会输出服务端返回的数据,如:Please input cmd:123456
yours data:123456
Please input cmd:abc
yours data:abc
Please input cmd:服务端控制台就会输出:
connect by ('127.0.0.1', 9848)
客户端发送过来的数据:123456
客户端发送过来的数据:abc - 使用socketserver
python也有封装好的可以用,比如:socketserver,可以快速进行一个简单的socket通信。需要导入SocketServer模块的TCPServer,BaseRequestHandler类,然后我们自己的类从BaseRequestHandler继承,并重写handle方法,然后可以很简单的就可以接收发送数据。
服务端:server2.py#incoding:utf-8
from SocketServer import TCPServer,BaseRequestHandler
import traceback
#python也有封装好的可以用,比如:socketserver
#从BaseRequestHandler继承,并重写handle方法,然后可以很简单的就可以接收发送数据
class MyBaseRequestHandler(BaseRequestHandler):
'''
从BaseRequestHandler继承,并重写handle方法
'''
def handle(self):
#循环监听(读取)来自客户端的数据
while True:
#当客户端主动断开连接时,self.read(1024)会抛出异常
try:
#一次读取1024字节,并取出两端的空白字符(包括空格,Tab,\r,\n)
data = self.request.recv(1024).strip() #self.client_address是客户端的连接(host,post)的元组
print "receive from (%r):%r"%(self.client_address,data) #转换成大写后回写给客户端
self.request.sendall(data.upper()+"\n")
except:
traceback.print_exc()
break if __name__ == '__main__':
#telnet 127.0.0.1 8081
host = "127.0.0.1" #主机名,可以是ip,像localhost的主机名或""
port = 8081 #端口
addr = (host,port) #构造TCPServer对象
server = TCPServer(addr, MyBaseRequestHandler)
#启动服务监听
server.serve_forever()客户端:client2.py
#incoding:utf-8
#server2的客户端程序
from socket import *
HOST='127.0.0.1'
PORT=8081
s=socket(AF_INET,SOCK_STREAM) #定义socket类型,网络通信,TCP
s.connect((HOST,PORT)) #要连接的IP与端口
while 1:
cmd=raw_input("Please input cmd:") #与人交互,输入命令
s.sendall(cmd) #把命令发送给服务端端
data=s.recv(1024) #把接收的数据定义为变量
print data #输出变量
s.close() #关闭连接依次各自启动服务端、客户端后,客户端输入:
Please input cmd:123
123 Please input cmd:456
456 Please input cmd:abc
ABC Please input cmd:服务端输出:
receive from (('127.0.0.1', 10458)):'123'
receive from (('127.0.0.1', 10458)):'456'
receive from (('127.0.0.1', 10458)):'abc' - 多线程TCPServer
上面的两种方式都只支持一个客户端和一个服务端进行通信,如果需要多个客户端和一个服务端通信就需要用到ThreadingTCPServer,StreamRequestHandler,我们自己的类MyStreamRequestHandler从StreamRequestHandler继承,并重写handle方法,然后可以很简单的就可以接收发送数据。
服务端:server3.py#incoding:utf-8
from SocketServer import ThreadingTCPServer,StreamRequestHandler
import traceback
#python还可以多个客户端的多线程TCPServer,
#从StreamRequestHandler继承,并重写handle方法,然后可以很简单的就可以接收发送数据
class MyStreamRequestHandler(StreamRequestHandler):
def handle(self):
#循环监听(读取)来自客户端的数据
while True:
print 'begin...'
try:
# print help(self.rfile)
data = self.rfile.readline().strip() #self.client_address是客户端的连接(host,post)的元组
print "receive from (%r):%r"%(self.client_address,data) #转换成大写后回写给客户端
self.wfile.write(data.upper()+"\n")
except:
traceback.print_exc()
break if __name__ == '__main__':
#telnet 127.0.0.1 8080
host = "127.0.0.1" #主机名,可以是ip,像localhost的主机名或""
port = 8082 #端口
addr = (host,port) #ThreadingTCPServer从ThreadingMixIn和TCPServer继承
#类结构:class ThreadingTCPServer(ThreadingMixIn,TCPServer):pass
server = ThreadingTCPServer(addr, MyStreamRequestHandler)
#启动服务监听
server.serve_forever()第一个客户端:client3_1.py
#incoding:utf-8
#server3的客户端程序1
#借鉴:https://blog.csdn.net/rebelqsp/article/details/22109925
from socket import *
HOST='127.0.0.1'
PORT=8082
s=socket(AF_INET,SOCK_STREAM) #定义socket类型,网络通信,TCP
s.connect((HOST,PORT)) #要连接的IP与端口
while 1:
cmd=raw_input("Please input cmd:") #与人交互,输入命令
#注意:发送的字符串内容要加一个回车符即\r\n
#因为服务端server3是根据行来读取的
s.sendall("%s\r\n"%cmd) #把命令发送给服务端端
# print help(s)
data=s.recv(1024) #把接收的数据定义为变量
print data #输出变量
s.close() #关闭连接第二个客户端:client3_2.py
#incoding:utf-8
#server3的客户端程序2
from socket import *
HOST='127.0.0.1'
PORT=8082
s=socket(AF_INET,SOCK_STREAM) #定义socket类型,网络通信,TCP
s.connect((HOST,PORT)) #要连接的IP与端口
while 1:
cmd=raw_input("Please input cmd:") #与人交互,输入命令
#注意:发送的字符串内容要加一个回车符即\r\n
#因为服务端server3是根据行来读取的
s.sendall("%s\r\n"%cmd) #把命令发送给服务端端
data=s.recv(1024) #把接收的数据定义为变量
print data #输出变量
s.close() #关闭连接依次启动服务端和两个客户端,这个时候不论是在客户端1还是客户端2输入,服务端都可以接收并反馈消息。
服务端控制台打印(客户端控制台不展示了):begin...
receive from (('127.0.0.1', 10989)):'def'
begin...
begin...
receive from (('127.0.0.1', 11015)):'poi'
begin...
receive from (('127.0.0.1', 10989)):'abc'
begin...
Python基础笔记系列十三:socket网络编程的更多相关文章
- Python基础笔记系列十一:标准输入输出、文件读写和指针等操作
本系列教程供个人学习笔记使用,如果您要浏览可能需要其它编程语言基础(如C语言),why?因为我写得烂啊,只有我自己看得懂!! 标准输入输出一.输入 在sublime中这个时候需要安装SublimeRE ...
- Python基础笔记系列一:基本工具与表达式
本系列教程供个人学习笔记使用,如果您要浏览可能需要其它编程语言基础(如C语言),why?因为我写得烂啊,只有我自己看得懂!! 工具基础(Windows系统下)传送门:Python基础笔记系列四:工具的 ...
- python第八周:socket网络编程
1.socket网络编程 1.1概念: 网络套接字是跨计算机网络的连接的端点.今天,计算机之间的大多数通信都基于互联网协议;因此大多数网络套接字都是Internet套接字.更准确地说,套接字是一个句柄 ...
- python学习笔记(十 三)、网络编程
最近心情有点儿浮躁,难以静下心来 Python提供了强大的网络编程支持,很多库实现了常见的网络协议以及基于这些协议的抽象层,让你能够专注于程序的逻辑,而无需关心通过线路来传输比特的问题. 1 几个网络 ...
- Python学习笔记整理总结【网络编程】【线程/进程/协程/IO多路模型/select/poll/epoll/selector】
一.socket(单链接) 1.socket:应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口.在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socke ...
- Python 全栈开发十 socket网络编程
一.客户端(client)服务端(sever)架构 在计算机中有很多常见的C/S架构,例如我们的浏览器是客户端.而百度网站和其他的网站就是服务端:视频软件是客户端,提供视频的腾讯.优酷.爱奇艺就是服务 ...
- Python学习笔记(二)网络编程的简单示例
Python中的网络编程比C语言中要简洁很多,毕竟封装了大量的细节. 所以这里不再介绍网络编程的基本知识.而且我认为,从Python学习网络编程不是一个明智的选择. 简单的TCP连接 服务器代码如 ...
- python学习之路-9 socket网络编程
socket基础 socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求. so ...
- Python基础笔记系列十四:python无缝调用c程序
本系列教程供个人学习笔记使用,如果您要浏览可能需要其它编程语言基础(如C语言),why?因为我写得烂啊,只有我自己看得懂!! python语言可以对c程序代码进行调用,以弥补python语言低性能的缺 ...
随机推荐
- Python作用域-->闭包函数-->装饰器
1.作用域: 在python中,作用域分为两种:全局作用域和局部作用域. 全局作用域是定义在文件级别的变量,函数名.而局部作用域,则是定义函数内部. 关于作用域,我要理解两点:a.在全局不能访问到局部 ...
- php 计算gps坐标 距离
在计算机或GPS上经纬度经常用度.分.秒和度.度.分.分.秒.秒的混合方式进行表示,度.分.秒间的进 制是60进制,度.度.分.分. 秒.秒的进制是100进制,换算时一定要注意.可以近似地认为每个纬度 ...
- ssm之mapper异常 Result Maps collection already contains value for com.ssj.mapper.UserMapper 和 Type interface com.ssj.mapper.UserMapper is already known to the MapperRegistry.
异常一:Result Maps collection already contains value for com.ssj.mapper.XXXMapper 原因分析:XXXmapper.xml文件中 ...
- Spark ML Pipeline简介
Spark ML Pipeline基于DataFrame构建了一套High-level API,我们可以使用MLPipeline构建机器学习应用,它能够将一个机器学习应用的多个处理过程组织起来,通过在 ...
- SDUT3165:Round Robina(循环链表)
题目:http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=3165 题意分析: 比赛时这题没有A真伤心 ...
- TensorFlow学习笔记(五)图像数据处理
目录: 一.TFRecord输入数据格式 1.1 TFrecord格式介绍 1.2 TFRecord样例程序 二.图像数据处理 2.1TensorFlow图像处理函数 2.2图像预处理完整样例 三.多 ...
- 元类 metaclass
metaclass 类由Type创建 对象由创建 MetaClass作用 用来指定当前类由谁来创建(默认type创建). MetaClass 会被继承,如果父类指定了元类,那么子类也是由这个元类创建 ...
- SSH查看Linux系统是32位还是64位?
Linux下如何明确地查看操作系统的位数 如何知晓操作系统是32位还是64位?这里介绍一种简单的方式: [root@localhost mysql-5.1.57]# getconf LONG_BI ...
- Bootstrap 中的插件的学习
一个静态的模态窗口实例,如下面的实例所示: <!DOCTYPE html> <html> <head> <title>Bootstrap 实例 - 模态 ...
- node的3大作用域
除了持久性存储外,想要内存也可以存入数据,来做计算什么数据都存入访问一便数据库,效率就太低了 java有3大作用域request 指在一次请求的全过程中有效,即从http请求到服务器处理结束,返回响应 ...