本系列教程供个人学习笔记使用,如果您要浏览可能需要其它编程语言基础(如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. 爬虫之urllib包以及request模块和parse模块

    urllib简介 简介 Python3中将python2.7的urllib和urllib2两个包合并成了一个urllib库 Python3中,urllib库包含有四个模块: urllib.reques ...

  2. 我不想用for循环

    为什么要挑战自己在代码里不写for loop?因为这样可以迫使你去使用比较高级.地道的语法或库.文中以python为例子,讲了不少大家其实在别人的代码里都见过.但自己很少用的语法. 这是一个挑战.我要 ...

  3. first-child与:first-of-type的区别

    css选择器中:first-child与:first-of-type的区别 :first-child选择器是css2中定义的选择器,从字面意思上来看也很好理解,就是第一个子元素.比如有段代码: p:f ...

  4. Websocket - Websocket原理(握手、解密、加密)、基于Python实现简单示例

    一.Websocket原理(握手.解密.加密) WebSocket协议是基于TCP的一种新的协议.WebSocket最初在HTML5规范中被引用为TCP连接,作为基于TCP的套接字API的占位符.它实 ...

  5. 聊聊高并发(三十四)Java内存模型那些事(二)理解CPU快速缓存的工作原理

    在上一篇聊聊高并发(三十三)从一致性(Consistency)的角度理解Java内存模型 我们说了Java内存模型是一个语言级别的内存模型抽象.它屏蔽了底层硬件实现内存一致性需求的差异,提供了对上层的 ...

  6. return的结果

    return只会返回第一个,接下去的不会再返回 所以return放在for里面用的话,即使循环好几次,但是除了循环的第一个,后面循环出来的结果都作废

  7. Spring boot 打包瘦身方法

    背景 随着spring boot 的流行.越来越多的来发着选择使用spring boot 来发 web 应用. 不同于传统的 web 应用 需要 war 包来发布应用. spring boot 应用可 ...

  8. 查看Oracle相关日志 ADRCI

    ADRCI 进去以后 show  home  

  9. GIL用C语言解决

    执行一个单线程死循环程序,单核cpu占用直接100% while True: pass 执行一个双线程的死循环程序,cpu同样占用100% import threading #子线程死循环 def t ...

  10. 如何下载java的jdk

    1.https://www.oracle.com/index.html 2.https://www.oracle.com/downloads/index.html 3.https://www.orac ...