本系列教程供个人学习笔记使用,如果您要浏览可能需要其它编程语言基础(如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网络编程的更多相关文章

  1. Python基础笔记系列十一:标准输入输出、文件读写和指针等操作

    本系列教程供个人学习笔记使用,如果您要浏览可能需要其它编程语言基础(如C语言),why?因为我写得烂啊,只有我自己看得懂!! 标准输入输出一.输入 在sublime中这个时候需要安装SublimeRE ...

  2. Python基础笔记系列一:基本工具与表达式

    本系列教程供个人学习笔记使用,如果您要浏览可能需要其它编程语言基础(如C语言),why?因为我写得烂啊,只有我自己看得懂!! 工具基础(Windows系统下)传送门:Python基础笔记系列四:工具的 ...

  3. python第八周:socket网络编程

    1.socket网络编程 1.1概念: 网络套接字是跨计算机网络的连接的端点.今天,计算机之间的大多数通信都基于互联网协议;因此大多数网络套接字都是Internet套接字.更准确地说,套接字是一个句柄 ...

  4. python学习笔记(十 三)、网络编程

    最近心情有点儿浮躁,难以静下心来 Python提供了强大的网络编程支持,很多库实现了常见的网络协议以及基于这些协议的抽象层,让你能够专注于程序的逻辑,而无需关心通过线路来传输比特的问题. 1 几个网络 ...

  5. Python学习笔记整理总结【网络编程】【线程/进程/协程/IO多路模型/select/poll/epoll/selector】

    一.socket(单链接) 1.socket:应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口.在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socke ...

  6. Python 全栈开发十 socket网络编程

    一.客户端(client)服务端(sever)架构 在计算机中有很多常见的C/S架构,例如我们的浏览器是客户端.而百度网站和其他的网站就是服务端:视频软件是客户端,提供视频的腾讯.优酷.爱奇艺就是服务 ...

  7. Python学习笔记(二)网络编程的简单示例

    Python中的网络编程比C语言中要简洁很多,毕竟封装了大量的细节. 所以这里不再介绍网络编程的基本知识.而且我认为,从Python学习网络编程不是一个明智的选择.   简单的TCP连接 服务器代码如 ...

  8. python学习之路-9 socket网络编程

    socket基础 socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求. so ...

  9. Python基础笔记系列十四:python无缝调用c程序

    本系列教程供个人学习笔记使用,如果您要浏览可能需要其它编程语言基础(如C语言),why?因为我写得烂啊,只有我自己看得懂!! python语言可以对c程序代码进行调用,以弥补python语言低性能的缺 ...

随机推荐

  1. redisTemplate写哈希表遇到的坑

    本文系原创,如有转载,请注明出处 在使用spring的redisTemplate进行redis哈希表的相关操作时,遇到了下面比较奇怪的情况: 1.删掉哈希表所属的key之后,重新get这个key的值, ...

  2. Unity系统自带函数生命周期以及相互关系

    官方参考手册:http://docs.unity3d.com/Manual/ExecutionOrder.html unity脚本从唤醒到销毁都有着一套比较完善的生命周期,添加任何脚本都要遵守生命周期 ...

  3. linux定时任务常用命令大全

    脚本中时间戳 TIMESTAMP=`date +%Y%m%d%H%M%S`

  4. SonarQube+jenkins+maven平台搭建

    SonarQube代码质量管理 1.配置jdk和maven jenkins - 系统管理 - 全局工具配置 jdk安装: # which java# /usr/local/java/jdk1.8.0. ...

  5. Python高级教程-多重继承

    多重继承 继承是面向对象编程的一个重要的方式,因为通过继承,子类可以扩展父类的功能. Animal类的层次设计,假设要实现以下4中动物: Dog - 狗狗: Bat - 蝙蝠: Parrot - 鹦鹉 ...

  6. (2.5)Mysql之SQL基础——数据类型

    (2.5)Mysql之SQL基础——数据类型 关键词:mysql数据类型 目录: 一.整数型 二.小数型(以下均不能使用无符号) 三.日期时间型 四.字符串型 一.整数型 额外参数示例: int [( ...

  7. PAT 1051 Pop Sequence[栈][难]

    1051 Pop Sequence (25 分) Given a stack which can keep M numbers at most. Push N numbers in the order ...

  8. 成员函数查找[条款24]---《C++必知必会》

    调用一个成员函数,涉及三个步骤:第一步,编译器查找函数的名字:第二部,从可用候选者中选择最佳匹配函数:第三步,检查是否具有访问该函数的权限. #include<iostream> usin ...

  9. 腾讯 微信春招nlp实习生一面二面(猝)

    一面: 1.算法题: 1 28数组中出现次数超过一半的数字 2 手写快排:八大排序算法总结(2) 2.项目介绍: 大多都是项目中涉及到的技术. TFIDF 的原理 word2vec的原理 3.算法原理 ...

  10. BZOJ 1316: 树上的询问

    挺裸的点分治 刚开始想用map水过去,然后做p次点分治,然后T到自闭 最后发现可以sort一遍,然后去重,记录每个数出现的次数,这样就可以双指针,不会漏掉了 #include <bits/std ...