码迷,mamicode.com
首页 > 编程语言 > 详细

Python-socket总结

时间:2015-12-17 16:23:47      阅读:297      评论:0      收藏:0      [点我收藏+]

标签:scoket

socket是什么

什么是socket所谓socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄。

应用程序通常通过"套接字"向网络发出请求或者应答网络请求。说白了就是一种通信机制。

列入你和移动客服咨询问题时,会有一个客服为你解决问题一样,就是你和客服间的相互通信

在socket里就是“发送”和“接收”这两个动作就是socket通信方式

socket.gethostname()     # 获取主机名

from socket import *     # 避免 socket.socket()

s=socket()

s.bind()         # 绑定地址到套接字

s.listen()       # 开始TCP监听

s.accept()       # 被动接受TCP客户端连接,等待连接的到来

s.connect()       # 主动初始化TCP服务器连接

s.connect_ex()   # connect()函数的扩展版本,出错时返回出错码,而不是跑出异常

s.recv()         # 接收TCP数据

s.send()         # 发送TCP数据

s.sendall()       # 完整发送TCP数据

s.recvfrom()     # 接收UDP数据

s.sendto()       # 发送UDP数据

s.getpeername()   # 连接到当前套接字的远端的地址(TCP连接)

s.getsockname()   # 当前套接字的地址

s.getsockopt() # 返回指定套接字的参数

s.setsockopt()   # 设置指定套接字的参数

s.close()         # 关闭套接字

s.setblocking()   # 设置套接字的阻塞与非阻塞模式

s.settimeout()   # 设置阻塞套接字操作的超时时间

s.gettimeout()   # 得到阻塞套接字操作的超时时间

s.filen0()       # 套接字的文件描述符

s.makefile()     # 创建一个与该套接字关联的文件对象

socket.AF_UNIX # 只能够用于单一的Unix系统进程间通信

socket.AF_INET # 服务器之间网络通信

socket.AF_INET6 # IPv6

socket.SOCK_STREAM   # 流式socket , for TCP

socket.SOCK_DGRAM   # 数据报式socket , for UDP

socket.SOCK_RAW       # 原始套接字,普通的套接字无法处理ICMP、IGMP等网络报文,而SOCK_RAW可以;其次,SOCK_RAW也可以处理特殊的IPv4报文;此外,利用原始套接字,可以通过IP_HDRINCL套接字选项由用户构造IP头。

socket.SOCK_RDM   # 是一种可靠的UDP形式,即保证交付数据报但不保证顺序。SOCK_RAM用来提供对原始协议的低级访问,在需要执行某些特殊操作时使用,如发送ICMP报文。SOCK_RAM通常仅限于高级用户或管理员运行的程序使用。

socket.SOCK_SEQPACKET # 可靠的连续数据包服务

基础讲解

    # 创建socket对象

    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    # 监听端口

    sock.bind((‘127.0.0.1‘,8001))

    # 开始监听,

    sock.listen(5)


    while True:

        # 阻塞,deng 。。。。

        # 直到有请求连接

        print ‘....‘

        connection, address = sock.accept()

        # connection,代表客户端socket对象,

        # address,客户端IP地址

        #handle_request(connection)

        buf = connection.recv(1024)

        print buf

        connection.send("HTTP/1.1 200 OK\r\n\r\n")

        connection.send("Hello, World")

        connection.close()

#服务端

import socket 

HOST=‘‘  #空代表0.0.0.0

PORT= 50007  #监听端口

s= socket.socket(socket.AF_INET,socket.SOCK_STREAM) 

s.bind((HOST,PORT)) 

s.listen(1)  

while True:

conn,addr= s.accept()    

print‘Connected by‘, addr  

while  True:

data = conn.recv(1024) #接收1024字节数据

if not data: break     #如果收不到客户端数据了(代表客户端断开了),就断开

conn.sendall(data.upper())    #将收到的数据全变成大写再发给客户端  

conn.close() #关闭此客户端的连接实例

#客户端

import socket  

HOST=‘‘ 

PORT= 6666  #监听端口

s= socket.socket(socket.AF_INET,socket.SOCK_STREAM) 

s.bind((HOST,PORT)) 

s.listen(1)  

while True:

conn,addr= s.accept()    

print‘Connected by‘, addr  

while  True:

data = conn.recv(1024) #接收1024字节数据

if not data: break     #如果收不到客户端数据了(代表客户端断开了),就断开

conn.sendall(data.upper())    #将收到的数据全变成大写再发给客户端  

conn.close() #关闭此客户端的连接实例

#以上例子是单线程的只能一对一的服务,即服务端只能处理一个链接,想要处理多线程怎么办,不用急多线程的Python已给我们写好直接调用就好


socket服务端

#用于处理多线程的模块

    import SocketServer

    import os

    class MyTCP(SocketServer.BaseRequestHandler):

        def handle(self):

            while True:

                self.data=self.request.recv(1024).strip() #接受数据

                if self.data == ‘quit‘ or not self.data:break #如果没有数据或为quit 退出

                cmd_data=os.popen(self.data).read() #将命令结果存为字符串

                if cmd_data == ‘‘:cmd_data= self.data + ‘: Command not found‘ #如果命令结果为空或命令返回为空

                self.request.sendall(cmd_data) #发送所有的数据

    if __name__ == ‘__main__‘:

        HOST,PORT = ‘127.0.0.1‘,6666 #绑定端口和ip

        server = SocketServer.ThreadingTCPServer((HOST,PORT),MyTCP) #将写的类加入多线程处理

        server.serve_forever() #循环启动

socket客户端

    import socket

    HOST=‘127.0.0.1‘

    PORT=6666

    s=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #服务期间的TCP通信

    s.connect((HOST,PORT)) #绑定端口和ip

    while True:

        while True: #如果命令为空继续输入

            cmd=raw_input(‘CMD:‘).strip()

            if cmd != ‘‘:break

        s.sendall(cmd) #发送所有数据

        data=s.recv(1024).split(‘\n‘) #以换行符分割接收的数据

        print ‘cmd:‘

        for line in data:print line #循环打印数据

    s.close() #关闭套接字


本文出自 “小波的博客” 博客,请务必保留此出处http://lxb994.blog.51cto.com/9805112/1725651

Python-socket总结

标签:scoket

原文地址:http://lxb994.blog.51cto.com/9805112/1725651

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!