socket(套接字)就是建立连接,发送,接收。大部分网络协议都是建立在socket之上的,例如:http,ftp,smtp等等
    socket用于描述IP地址和端口,是一个通信链的句柄。应用程序通常通过‘套接字’向网络发出请求或者应答网络请求,说白了就是一种通信机制。它类似于银行,电信啊这些部分的电话客服部门。你打电话的时候,那边会分配一个人回答你的问题,客服部门就相当于socket的服务器端了,这边呢就相当于客户端了,在和你通话结束前,如果有人在想找和你通话的那个说话,是不可能的,因为你在和他通信,当然客服部门的电话交换机也不会重新分配。
    socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,都可以用“打开open----->读写write/read----->关闭close”模式来操作。Socket就是该模式的一个实现,socket即是一种特殊的文件,一些socket函数就是对其进行的操作(读写/IO,打开,关闭)。
流程拓扑图:
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
SocketServer:同时只能接受1个连接,就算listhen改为5还是只能接受1个连接,另一个客户端如果发送数据只能处于等待状态;只有这个客户端断开连接它才能发送数据给服务端
Socket服务器端编程主要包括下面几步:
1.      打开socket
2.      绑定到一个地址和端口
3.      侦听进来的连接
4.      接收数据     
5.      读写收据
import socket
HOST = ''                    #为空代表本机
PORT = 50007
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)        #打开socket
s.bind((HOST,PORT))         #2    绑定地址和端口,注意里面接一个元组的参数
s.listen(1)                          #3    1代表同时只能有1个连接
while  True:
conn,addr = s.accept()      #3    s.accept()返回两个变量,conn返回哪个客户端连接过来,addr返回客户端地址
print 'Connected by',addr
while 1:
           data = conn.recv(1024)     #4          1024代表1k,是接收的客户端的数据
           if not data:                        #代表客户端已经断开了
           break
           conn.sendall(data.upper())             #5          把收到的数据改成大写又发回去
conn.close()
以上代码在Linux和mac下面没有问题,但是在Linux里就需要加个异常处理,
捕捉socketError异常。
-----------------------------------------------------------------------------------------------------------------
Socket客户端编程主要包括下面几步:
1.打开socket
2.连接到服务器端的地址和端口
3.读写收据
import socket
HOST = '127.0.0.1'                  
PORT = 50007
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)       
s.connect((HOST,PORT))                 #2
 
while  True:
       msg = input(“>>:”).strip()
       if  len(msg) == 0:continue
s.sendall(msg)
data = s.recv(1024)                         #等待服务器的返回,并存储在变量data里
print  ‘Received’,data
s.close()
 
 
 
 
SocketServer实现多并发(能支持100个左右,再大了可能就扛不住了):
有三种方式:分叉,线程,异步IO,下例使用的是线程方式
服务器端:
import SocketServer
class MyTCPHandler(SocketServer,BaseRequistHandler):
  while True:
    def handle(self):                #这个handle函数就是用于处理跟客户端所有的通信
      self.data = self.request.recv(1024).strip()
      print ("{} wrote:".format(self.client_address[0]))
      print (self.data)   
      self.request.sendall(self.data.upper())
 
 
if __name__ == "__main__":
    HOST,PORT = "localhost",9999  
    server = SocketServer.ThreadingTCPServer((HOST,PORT),MyTCPHandler)
    server.server_forever()
 
客户端:
客户端改下端口就行了,对应服务端的9999
 
 
 
 
 
 
 
 
 
 
SocketServer实现文件传送:目前我们做的是就是客户端发送什么我就给它改成大写返回去,没什么用,这节就是讲让server干点事情
 
1.客户端发过来的命令我让它执行,模仿puppet,saltstack。。。。。。(但还有很多问题)
服务器端:
import SocketServer
import  os
class MyTCPHandler(SocketServer,BaseRequistHandler):
def handle(self):            #这个handle函数就是用于处理跟客户端所有的通信
while True:
      data = self.request.recv(1024).strip()
           cmd_res = os.popen(data).read()
           if len(cmd_res)==0:
                     cmd_res = “cmd has no feedback”
      self.request.sendall(data.upper())
 
if __name__ == "__main__":
    HOST,PORT = "localhost",9999  
    server = SocketServer.ThreadingTCPServer((HOST,PORT),MyTCPHandler)
    server.server_forever()
 
 
客户端:
import socket
HOST = '127.0.0.1'                  
PORT = 9999
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)       
s.connect((HOST,PORT))                 #2
 
while  True:
       msg = input(“>>:”).strip()
       if  len(msg) == 0:continue
s.sendall(msg)
data = s.recv(8196)                         #等待服务器的返回,并存储在变量data里
print  ‘Received’,data
s.close()
 
 
 
 
 
 
SocketServer实现ftp雏形:
 
服务器端:客户端往服务器上传文件目录recv
import SocketServer
import  os
class MyTCPHandler(SocketServer,BaseRequistHandler):
def handle(self):                 #这个handle函数就是用于处理跟客户端所有的通信
         while True:
           data = self.request.recv(1024).strip()
                   data=data.split(“|”)
                   if  hasattr(self,data[0]):
                            func=getattr(self,data[0])
                            func(data[1:])
def  file_transfer(self,msg):
           if msg[0] == “get”:
                   print (“-----going to send file:%s to client ” % msg[1])
                   filename = msg[1]
if os.path.isfile(filename):                                                                #判断客户端发来的请求是否是文件并且存在
         filesize = os.path.getsize(filename)                                    #1.判断客户端发来的文件的大小
         ack_msg = “file_transfer|get|ready” % file_size            #服务器给客户端的应答(如果文件存在的情况)
         self.request.send(ack_msg)                                                    #执行发送ack_msg给客户端
         client_ack = self.request.recv(1024)                                   
print ‘-----à client ack:’,client_ack
if client_ack.startswith(“file_transfer|get|recv|ready”):
         f = file(filename,”rb”)
         for line in f:
                   self.request.send(line)
         else:
                   print ‘--------file %s send done-------’ % filename
                   f.close()
else:
         ack_msg = “file_transfer|get|file doesn’t exists”           #服务器给客户端的应答(如果文件不存在的情况)
         self.request.send(ack_msg)    
 
 
 
 
if __name__ == "__main__":
    HOST,PORT = "localhost",9999  
    server = SocketServer.ThreadingTCPServer((HOST,PORT),MyTCPHandler)
    server.server_forever()
 
 
 
客户端:从服务器端下载文件目录recv
import socket
class FTP(object):
   def __init__(self,host,port):
              self.host = host
              self.port = port
   def put(self,msg):        #定义上传方法,命令为put  local_file  
   def get(self,msg):        #定义下载方法,命令为get  remote_file
              print  ‘---->get:’,msg
              if len(msg) > 0:
                     remote_filename=msg[0]
                     cmd_msg=”file_transfer|get|%s” % remote_filename
                     self.sock.send(cmd_msg)
                     feedback = self.sock.recv(1024)
                     print (‘----->feedback:’,feedback)
                     if feedback.startswith(“file_transfer|get|read”):
                            file_size = int(feedback.split(“|”)[-1])
                            ack_msg = “file_transfer|get|recv|ready”
                            self.sock.send(ack_msg)
                            f = file(“recv/%s” % remote_filename,’wb’)
                            recv_size = 0
                            while not file_size == recv_size:
                                   if file_size  -  recv_size > 1024:
                                          data = self.sock.recv(1024)
                                          f.write(data)
                                          recv_size += len(data)
                                   else:
                                          data = self.sock.recv(file_size – recv_size)
                                          recv_size+= file_size  - recv_size
f.write(data)              
else:
       f.close()
       print “-----recv file ”
                            print (feedback)
   def list_file(self):         #定义查看方法
 
   def interactive(self):   #定义交互方法
              while True:
                     user_input = input(“ftp_client::”).strip()
                     if len(user_input) == 0:continue
                     cmd = user_input.split()
                     if  hasattr(self,cmd[0]):                        #这里用到了反射
                            func = getattr(self,cmd[0])
                            func(cmd[1:])
                     else:
                            print  “Wrong  cmd  usage!”
      
   def connect(self):        #定义连接方法
              self.sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)         
self.sock.connect((self.host,self.port))
self.interactive()
if  __name__ == ‘__main__’:
   ftp = FTP(192.168.1.130,9999)
 
 
 
 
HOST = '192.168.1.130'                 
PORT = 9999
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)       
s.connect((HOST,PORT))                 #2
 
while  True:
       msg = input(“>>:”).strip()
       if  len(msg) == 0:continue
s.sendall(msg)
data = s.recv(8196)                         #等待服务器的返回,并存储在变量data里
print  ‘Received’,data
s.close()
 
 

十九、Python之socket编程的更多相关文章

  1. 十九. Python基础(19)--异常

    十九. Python基础(19)--异常 1 ● 捕获异常 if VS异常处理: if是预防异常出现, 异常处理是处理异常出现 异常处理一般格式: try:     <............. ...

  2. 转:Python 的 Socket 编程教程

    这是用来快速学习 Python Socket 套接字编程的指南和教程.Python 的 Socket 编程跟 C 语言很像. Python 官方关于 Socket 的函数请看 http://docs. ...

  3. Python 3 socket 编程

    Python 3 socket编程 一 客户端/服务器架构 互联网中处处是C/S架构 1.C/S结构,即Client/Server(客户端/服务器)结构 2.在互联网中处处可见c/s架构 比如说浏览器 ...

  4. 最基础的Python的socket编程入门教程

    最基础的Python的socket编程入门教程 本文介绍使用Python进行Socket网络编程,假设读者已经具备了基本的网络编程知识和Python的基本语法知识,本文中的代码如果没有说明则都是运行在 ...

  5. python之socket编程(一)

    socket之前我们先来熟悉回忆几个知识点. OSI七层模型 OSI(Open System Interconnection)参考模型是国际标准化组织(ISO)制定的一个用于计算机或通信系统间互联的标 ...

  6. Python:socket编程教程

    ocket是基于C/S架构的,也就是说进行socket网络编程,通常需要编写两个py文件,一个服务端,一个客户端. 首先,导入Python中的socket模块: import socket Pytho ...

  7. python学习------socket编程

    一 客户端/服务器架构 1.硬件C/S架构(打印机) 2.软件C/S架构 互联网中处处是C/S架构 如黄色网站是服务端,你的浏览器是客户端(B/S架构也是C/S架构的一种) 腾讯作为服务端为你提供视频 ...

  8. Python基础-socket编程

    一.网络编程 自从互联网诞生以来,现在基本上所有的程序都是网络程序,很少有单机版的程序了. 计算机网络就是把各个计算机连接到一起,让网络中的计算机可以互相通信.网络编程就是如何在程序中实现两台计算机的 ...

  9. Python基础socket编程

    Python 提供了两个基本的 socket 模块. 第一个是 Socket,它提供了标准的 BSD Sockets API. 第二个是 SocketServer, 它提供了服务器中心类,可以简化网络 ...

  10. Python菜鸟之路:Python基础-Socket编程-2

    在上节socket编程中,我们介绍了一些TCP/IP方面的必备知识,以及如何通过Python实现一个简单的socket服务端和客户端,并用它来解决“粘包”的问题.本章介绍网络编程中的几个概念:多线程. ...

随机推荐

  1. ABP 异常

    abp自己封装了一个异常的基类: 此异常用于直接显示给用户,可用于返回一些提示,如:密码错误,用户名不能为空等. 参数 Severity :异常的严重程度 是个Enum类型 基本使用: 系统常见异常: ...

  2. android 完全退出实现

    实现方法是在application中定义一个集合存储所有的Activity对象,在Activity创建时添加进集合中,在程序退出时,finish掉所有的Activity即可. 步骤如下: 1.自定义A ...

  3. 拼数(C++)

    问题: 设有n个正整数,将他们排成一排,组成一个最大的多位整数. INPUT: 第一行,正整数的个数n 第二行,n个正整数 OUTPUT: 一个正整数,表示最大的整数. 输入样例: 3 13 312 ...

  4. 使用 go modules 包管理工具(一)

    概述 我想实现一个开箱即用的 API 框架的轮子,这个轮子是基于 Gin 基础上开发的. 为什么是开箱即用,它会集成哪些功能? 以上功能点,都是常用的,后期可能还会增加. 废话不多说,咱们开始吧. 创 ...

  5. MYSQL思维导图(转载)

    图片来源:https://www.cnblogs.com/mutudou/p/11858477.html

  6. Hbase flusher源码解析(flush全代码流程解析)

    版权声明:本文为博主原创文章,遵循版权协议,转载请附上原文出处链接和本声明. 在介绍HBASE flush源码之前,我们先在逻辑上大体梳理一下,便于后续看代码.flush的整体流程分三个阶段 1.第一 ...

  7. [转帖]腾讯云TStack获下一代云计算技术创新奖 与鲲鹏等产品实现兼容性测试

    http://www.techweb.com.cn/cloud/2019-12-16/2769286.shtml [TechWeb]12 月 16 日消息,在中国电子技术标准化研究院主办的“第九届中国 ...

  8. 前端学习:JS学习总结(图解)

    前端学习:JS学习总结(图解) JS的代码笔记 JS比HTML和CSS的知识点要多的多,下面分几段来介绍其内容... 为了能让大家更好的检索,前面的图解是整个JS的概括,后面的才是知识点... 旁边就 ...

  9. Python程序调试工具Py-Spy

    序言 如果你是从Java语言开发转Python开发,可能在庆幸自己的开发效率提高了很多,但是也有痛苦的时候,比如你会怀念jstack,jmap, 等各种工具在生产环境做perfomance tunin ...

  10. 使用Ueditor上传图片到图片服务器(一)

    网站的文章,通过运营平台来发布文章(图文消息),上传图片等.百度Ueditor比较成熟就采用了该技术,另外上传的图片是网站系统以及运营平台系统共享的,所以考虑搭建独立的图片服务器,以后也可以提供给公司 ...