【美高梅集团4688】python学习笔记之socket(第七天)

 

handle_request() #拍卖单个请求

#!/usr/bin/python
# -*- coding: utf-8 -*-

import socket,os,sys,subprocess,time



def main():
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.bind(ip_port)
    sock.listen(5)    

    print('server is running...')
    while True:
        connection, address = sock.accept()
        while True: 
            buf = connection.recv(1024)
            if not buf:
                break
            print("recv cmd:",str(buf,'utf-8'))
            cmd = str(buf,'utf-8').strip()
            cmd_call = subprocess.Popen(cmd,shell=True,stdout=subprocess.PIPE)
            cmd_result = cmd_call.stdout.read()

            if len(cmd_result) == 0:
                cmd_result = b"cmd execution has no output..."
            ack_msg = "CMD_RESULT_SIZE|%s" % len(cmd_result)
            print(ack_msg)
            connection.send(bytes(ack_msg,'utf8'))
            ack_re = connection.recv(50) 
            print(ack_re)
            connection.send(cmd_result)

        connection.close()

if __name__ == '__main__':
   port = int(sys.argv[1])
   ip_port = ('127.0.0.1',port)
   main()

get_request()  #

再三再四关系图:

Must return a Boolean value; if the value is True, the request will be processed, and if it’s False, the request will be denied. This function can be overridden to implement access controls for a server. The default implementation always returns True.

verify_request(request, client_address) #看清一个伸手是不是合法

  s.bind(address)
将套接字绑定到地点。address地址的格式取决于地址族。在AF_INET下,以元组(host,port)的花样表示地址。

  同上,只不过会有再次回到值,连接成功时再次回到 0
,连接败北时候回来编码,举例:10061

参数二:类型

 

  将string中的数据发送到连接的套接字。重临值是要发送的字节数量,该数量只怕低于string的字节大小。即:大概未将钦赐内容总体殡葬。

#!/usr/bin/python
# -*- coding: utf-8 -*-

import socket,os,sys

def enc(strr):
    aa = strr.encode('utf-8')
    return aa

if __name__ == '__main__':
   port = int(sys.argv[1])
   ip_port = ('127.0.0.1',port)
   sock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
   sock.bind(ip_port)
   while True:
       print('server is running...')
       dat, address = sock.recvfrom(1024)
       data = dat.decode('utf-8')

       send_str = ''
       print(data,address)
       if data == 'exit':
           break
       if data == 'exit':
           break
       elif len(data) == '0':
           send_str = enc('0 ni mei...')
       elif data.find('nihao') >= 0 :
           send_str = enc('hello,baby,nihao')
       elif data.find('sb') >= 0 :
           send_str = enc('sb,to you')
       else:
           send_str = enc('input exit to exit')

       sock.sendto(send_str,address)
   sock.close()

serve_forever(poll_interval=0.5)
 #每0.伍秒检查下是不是发了shutdown时域信号,做一些清理专门的学问

 

 

 

Timeout duration, measured in seconds, or None if no timeout is desired. If handle_request() receives no incoming requests within the timeout period, the handle_timeout() method is called.

三、socket之类ssh推行命令:

socketserver

address_family #地址蔟

  连接受address处的套接字。一般,address的格式为元组(hostname,port),纵然连接出错,重返socket.error错误。

  1.
创办三个请求管理的类,并且这么些类要承接 BaseRequestHandlerclass
,并且还要重写父类里handle()方法;

udp-client

     
backlog等于伍,表示内核已经接到了连年请求,但服务器还从未调用accept进行拍卖的连接个数最大为伍
      这么些值不可能最棒大,因为要在基本中保险连接队列

2、socket之udp:

sk.settimeout(timeout)

sk.accept()

Actually processes the request by instantiating RequestHandlerClass and calling its handle() method.

sk.sendto(string[,flag],address)

The user-provided request handler class; an instance of this class is created for each request.

1、socket之tcp:

sk.getsockname()

  0  (暗中认可)与特定的地方家族有关的情商,如若是 0
,则系统就能够总局址格式和套接体系,自动选用二个相宜的商量

Handle requests until an explicit(明确的)
shutdown() request. Poll(检查) for shutdown every poll_interval seconds. Ignores the timeout attribute. It also calls service_actions(), which may be used by a subclass or mixin to provide actions specific to a given service. For example, the ForkingMixIn class uses service_actions() to clean up zombie child processes.

 

  socket.AF_UNIX 只好够用于单1的Unix系统经过间通讯

 

 

finish_request()  

  socket.AF_INET IPv4(默认)
  socket.AF_INET6 IPv6

socketserver一共有这么几体系型:

     一、具体职能介绍 :sk =
socket.socket(socket.AF_INET,socket.SOCK_STREAM,0)

  1. First, you must create a request handler class by subclassing
    the BaseRequestHandlerclass
    and overriding
    its handle() method;
    this method will process incoming requests.   
  2. Second, you must instantiate one of the server classes, passing it
    the server’s address and the request handler class.
  3. Then call
    the handle_request() orserve_forever() method
    of the server object to process one or many requests.
  4. Finally,
    call server_close() to
    close the socket.

socketclient

socketserver例子:

socket_server:

  重返连接套接字的长途地址。再次来到值常常是元组(ipaddr,port)。

sk.connect_ex(address)

#!/usr/bin/python
# -*- coding: utf-8 -*-

import socketserver,os,sys


class MyTCPHandler(socketserver.BaseRequestHandler):
    def handle(self):
        print("new conn:",self.client_address)
        while True:
            data = self.request.recv(1024).strip()
            if not data:
                break  
            print([self.client_address],data)
            self.request.sendall(data.upper())   


if __name__ == '__main__':
   port = int(sys.argv[1])
   ip_port = ('127.0.0.1',port)


   server = socketserver.ThreadingTCPServer(ip_port, MyTCPHandler)   #多线程实现并发
   #server  = socketserver.ForkingTCPServer(ip_port, MyTCPHandler)   #多进程实现并发
   #server = socketserver.TCPServer(ip_port, MyTCPHandler)           #单进程的阻塞模式

   server.serve_forever()

  接受连接并赶回(conn,address),在那之中conn是新的套接字对象,能够用来收纳和发送数据。address是三番五次客户端的地方。

 

sk.fileno()

The family of protocols to which the server’s socket belongs. Common examples are socket.AF_INET and socket.AF_UNIX.

美高梅集团4688 1

美高梅集团4688 2美高梅集团4688 3

+————+

+————+
      |
      v
+———–+        +——————+
| TCPServer |——->| UnixStreamServer |
+———–+        +——————+
      |
      v
+———–+        +——————–+
| UDPServer |——->| UnixDatagramServer |

  设置套接字操作的超时代,timeout是3个浮点数,单位是秒。值为None表示尚无超时代。一般,超时代应该在刚创制套接字时设置,因为它们或许用于连接的操作(如
client 连接最多等待5s )

sk.send(string[,flag])

 

 

class socketserver.BaseServer(server_address, RequestHandlerClass)
This is the superclass of all Server objects in the module. It defines the interface, given below, but does not implement most of the methods, which is done in subclasses. The two parameters are stored in the respective server_address and RequestHandlerClass attributes.

  1. class socketserver.TCPServer(server_address, RequestHandlerClass,
    bind_and_activate=True)

  2. class socketserver.UDPServer(server_address, RequestHandlerClass,
    bind_and_activate=True)

  3. class socketserver.UnixStreamServer(server_address,
    RequestHandlerClass, bind_and_activate=True)

  4. class socketserver.UnixDatagramServer(server_address,
    RequestHandlerClass,bind_and_activate=True)

sk.setblocking(bool)

 

  关闭套接字

handle_error(request, client_address) #管理错误
This function is called if the handle() method of a RequestHandlerClass instance raises an exception. The default action is to print the traceback to standard output and continue handling further requests.

Whether the server will allow the reuse of an address. This defaults to False, and can be set in subclasses to change the policy.

  4. 关闭连接server_close()

sk.bind(address)

譬喻表达:

  socket.SOCK_RAW
原始套接字,普通的套接字十分小概管理ICMP、I螺旋霉素P等网络报文,而SOCK_RAW可以;其次,SOCK_RAW也能够拍卖特别的IPv4报文;其余,利用原始套接字,能够经过IP_HDHavalINCL套接字选项由用户构造IP头。
  socket.SOCK_PAJERODM
是壹种保险的UDP情势,即确定保障交到数据报但不保证顺序。SOCK_RAM用来提供对原始协议的低等访问,在急需进行某个特殊操作时利用,如发送ICMP报文。SOCK_RAM平时只限于高等用户或管理人运维的顺序选用。
  socket.SOCK_SEQPACKET 可信赖的连日数据包服务

timeout #超时

 

socket_client:

 

Changed in version 3.3: Added service_actions call to the serve_forever method.

#!/usr/bin/python
# -*- coding: utf-8 -*-

import socket,os,sys
port = int(sys.argv[1])
ip_port = ('127.0.0.1',port)

sk = socket.socket()
sk.connect(ip_port)

while True:
    inp = input('cmd : ').strip()
    if len(inp) == 0:
        continue
    if inp == 'q':
        break
    sk.send(bytes(inp,'utf8'))

    data = sk.recv(1024)
    print("server reply:",str(data,'utf8'))
sk.close()

  与recv()类似,但再次回到值是(data,address)。个中data是含有接收数据的字符串,address是发送数据的套接字地址。

美高梅集团4688 4美高梅集团4688 5

           
 二、银角大王博客:

 

class socketserver.BaseServer(server_address, RequestHandlerClass)
首要有以下方法: 

  发轫监听传入连接。backlog钦赐在拒绝连接从前,能够挂起的最阿比让接数量。

handle_timeout() #
This function is called when the timeout attribute has been set to a value other than None and the timeout period has passed with no requests being received. The default action for forking servers is to collect the status of any child processes that have exited, while in threading servers this method does nothing.

  接受套接字的数量。数据以字符串格局再次回到,bufsize钦赐最多能够接过的多少。flag提供有关新闻的别样音讯,经常能够忽略。

request_queue_size  #

socket和file的区别:

美高梅集团4688 6美高梅集团4688 7

shutdown() #停掉
Tell the serve_forever() loop to stop and wait until it does.

#!/usr/bin/python
# -*- coding: utf-8 -*-

import socket,os,sys

def handle_request(client,address):

    buf = client.recv(1024)
    print(buf,address)
    client.sendall(("your input is %s" % buf).encode('utf-8'))

def main():
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.bind(ip_port)
    sock.listen(5)

    while True:
        print('server is running...')
        connection, address = sock.accept()
        handle_request(connection,address)
        connection.close()

if __name__ == '__main__':
   port = int(sys.argv[1])
   ip_port = ('127.0.0.1',port)
   main()

连年客户端代码跟原来同样

 

阻塞server

 

 

sk.connect(address)

 

阻塞client

          socket模块是指向 服务器端 和 客户端Socket
实行【打开】【读写】【关闭】

美高梅集团4688 8美高梅集团4688 9

service_actions() #python3.3里加入,

sk.close()

server_bind() #当中调用
Called by the server’s constructor to bind the socket to the desired address. May be overridden.

 

 

sk.recv(bufsize[,flag])

Process a single request. This function calls the following methods in order: get_request(), verify_request(), and process_request(). If the user-provided handle() method of the handler class raises an exception, the server’s handle_error() method will be called. If no request is received within timeout seconds, handle_timeout() will be called and handle_request() will return.

sk.sendall(string[,flag])

  3.
server.handle_requese()#只管理三个伸手,server.server_forever()管理四个二个伸手,永恒施行

RequestHandlerClass #伸手管理类

参数一:地址簇

美高梅集团4688 ,The size of the request queue. If it takes a long time to process a single request, any requests that arrive while the server is busy are placed into a queue, up to request_queue_size requests. Once the queue is full, further requests from clients will get a “Connection denied” error. The default value is usually 5, but this can be overridden by subclasses.

 

| BaseServer | 

 

 使用多进程或八线程完成产出

sk.getpeername()

  将string中的数据发送到连接的套接字,但在回来此前会尝试发送全部数据。成功重回None,战败则抛出10分。

Must accept a request from the socket, and return a 2-tuple containing the new socket object to be used to communicate with the client, and the client’s address.

美高梅集团4688 10美高梅集团4688 11

参数三:协议

          file模块是针对某些钦点文件举行【张开】【读写】【关闭】

#!/usr/bin/python
# -*- coding: utf-8 -*-

import socket,os,sys

port = int(sys.argv[1])
ip_port = ('127.0.0.1',port)
sk = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
while True:

    inp = input('请输入:').strip()
    if inp == 'exit':
        break
    inpp = inp.encode('utf-8') 
    sk.sendto(inpp,ip_port)
    data,address = sk.recvfrom(1024)
    print(data.decode('utf-8'),address)

sk.close()

fileno()  #回去文件讲述符

           
 一、金角高手博客:

美高梅集团4688 12美高梅集团4688 13

#!/usr/bin/python
# -*- coding: utf-8 -*-

import socket,os,sys
port = int(sys.argv[1])
ip_port = ('127.0.0.1',port)

sk = socket.socket()
sk.connect(ip_port)

while True:
    inp = input('cmd : ').strip()
    if len(inp) == 0:
        continue
    if inp == 'q':
        break
    sk.send(bytes(inp,'utf8'))

    server_ack_msg = sk.recv(100)
    cmd_res_msg = server_ack_msg.decode().split("|")
    print(cmd_res_msg)
    if cmd_res_msg[0] == "CMD_RESULT_SIZE":
        cmd_res_size = int(cmd_res_msg[1])
    ack_re = sk.send(b'CMD_RESULT')
    res = ''
    recv_size = 0
    while recv_size < cmd_res_size:
        server_reply = sk.recv(500)
        recv_size += len(server_reply)
        res += str(server_reply,'utf8')
    else:
        print(res)
        print('==========recv done=========')

sk.close()

sk.listen(backlog)

New in version 3.3.

The server classes support the following class variables:

There are various server methods that can be overridden by subclasses of base server classes like TCPServer; these methods aren’t useful to external users of the server object.

Calls finish_request() to create an instance of the RequestHandlerClass. If desired, this function can create a new process or thread to handle the request; the ForkingMixIn and ThreadingMixIn classes do this.

 

      内部通过递归调用send,将有所剧情发送出去。

  2. 您必须实例化 TCPServer,并且传递server
IP和你下面创立的呼吁处理类,给这几个TCPServer;

     参谋文书档案:

This is called in the serve_forever() loop. This method can be overridden by subclasses or mixin classes to perform actions specific to a given service, such as cleanup actions.

二、socketserver

socket_type  #研究项目
The type of socket used by the server; socket.SOCK_STREAM and socket.SOCK_DGRAM are two common values.

server_activate()
Called by the server’s constructor to activate the server. The default behavior for a TCP server just invokes listen() on the server’s socket. May be overridden.

  是或不是封堵(默许True),假如设置False,那么accept和recv时一旦无数据,则报错。

美高梅集团4688 14美高梅集团4688 15

 

allow_reuse_address  #获准重用地址,普通的socket重用地点

socket #
The socket object on which the server will listen for incoming requests.

#!/usr/bin/python
# -*- coding: utf-8 -*-

import socket,os,sys
port = int(sys.argv[1])
ip_port = ('127.0.0.1',port)


while True:
    sk = socket.socket()
    sk.connect(ip_port)
    inp = input('please input the info : ').strip()
    sk.sendall(('%s' % inp ).encode('utf-8'))
    #sk.sendall('nihao'.encode('utf-8'))
    if inp == 'exit':
        break
    server_reply = sk.recv(1024)
    print(server_reply)

    sk.close()

美高梅集团4688 16美高梅集团4688 17

 

  socket.SOCK_STREAM  流式socket , for TCP (默认)
  socket.SOCK_DGRAM   数据报式socket , for UDP

如何创制2个socketserver :

 

server_close()#关闭
Clean up the server. May be overridden.

socket源点于Unix,而Unix/Linux基本军事学之1便是“一切皆文件”,对于文本用【张开】【读写】【关闭】形式来操作。socket正是该形式的2个贯彻,socket正是①种非常的文本,一些socket函数正是对其展开的操作(读/写IO、张开、关闭)

  将数据发送到套接字,address是样式为(ipaddr,port)的元组,钦点远程地址。重返值是出殡和埋葬的字节数。该函数根本用以UDP协议。

 

  再次回到套接字本人的地点。平常是一个元组(ipaddr,port)

socket并不可能多出新,只可以援救叁个用户,socketserver
简化了编辑网络服务程序的职分,socketserver是socket的在封装。socketserver在python第22中学为SocketServer,在python三种撤消了首字母大写,改名字为socketserver。socketserver中含有了两体系,1种为服务类(server
class),一种为呼吁管理类(request handle
class)。前者提供了繁多主意:像绑定,监听,运维……
(相当于确立连接的历程)
后者则在意于如何管理用户所发送的多少(约等于事情逻辑)。一般景色下,全数的劳务,都以先创立连接,也正是建构三个服务类的实例,然后开首次拍卖卖用户请求,也便是树立2个伸手处理类的实例。

process_request(request, client_address) #单个请求

  套接字的文书讲述符

 

  接收TCP 客户的连天(阻塞式)等待连接的来到

实践命令server

+———–+        +——————–+

Return an integer file descriptor for the socket on which the server is listening. This function is most commonly passed to selectors, to allow monitoring multiple servers in the same process.

       
 socket平常也叫做”套接字”,用于描述IP地址和端口,是一个通信链的句柄,应用程序经常通过”套接字”向网络发出请求恐怕应答互连网请求。

一、socket模块:

sk.recvfrom(bufsize[.flag])

udp-server

server_address#IP地址
The address on which the server is listening. The format of addresses varies depending on the protocol family; see the documentation for the socket module for details. For Internet protocols, this is a tuple containing a string giving the address, and an integer port number: (‘127.0.0.1’, 80), for example.

实施命令client

相关文章