资讯专栏INFORMATION COLUMN

python-socket网络编程

zero / 2848人阅读

摘要:网络编程学习本文主要介绍网络通信,以及的通信例子网络通信是嵌套字的意思,可以理解为与们间的在线会话。关于通信可以看这里简单理解多线程下开启一个对于服务端,需要做件事情开启设置配置绑定端口帧监听,收发包多线程关于报错模块提供个函数。

  

http://homeway.me/


python网络编程学习 本文主要介绍socket网络通信,以及python的socket通信例子


0x01.socket网络通信

socket是嵌套字的意思,可以理解为server与client们间的在线会话。



关于socket通信可以看这里:

http://queengina.com/2014/10/09/简单理解Socket/




0x02.多线程socket


python下开启一个socket

对于server服务端,python socket需要做4件事情

1.开启socket

2.设置配置socket

3.绑定端口

4.帧监听,收发包


多线程socket
  

=> server.py

#!/usr/bin/python
# -*- coding:utf-8 -*-
import socket 
import threading 
import time
import sys

clients = [] 
class RecvMsg(threading.Thread): 
    def __init__(self, sock): 
        threading.Thread.__init__(self) 
        self.sock = sock 
    def run(self): 
        global clients 
        while True: 
            msg = self.sock.recv(512) 
            print "recv=>",msg 
            for client in clients: 
                if client != self.sock:
                    message = {}
                    message["id"] = self.sock
                    message["time"] = time.time()
                    message["type"] = "server send"
                    print "send=>", message
                    client.send( str(message) )
                    pass
                pass

def main( port ): 
    sock = socket.socket() 
    sock.bind(( socket.gethostname(), int(port) )) 
    sock.listen(5) 
    while True: 
        client, address = sock.accept() 
        print "a client connected" 
        if client not in clients: 
            clients.append(client) 
            recvMsg = RecvMsg(client)
            recvMsg.start() 
    sock.close() 

if __name__ == "__main__": 
    port = sys.argv[1]
    main( port ) 
  

python server.py 56565




  

=> client.py

#!/usr/bin/python
# -*- coding:utf-8 -*-
import socket  
import threading 
import os,time 
import sys

class RecvMsg(threading.Thread): 
    def __init__(self, sock): 
        threading.Thread.__init__(self) 
        self.sock = sock 

    def run(self): 
        while True: 
            recvMsg = self.sock.recv(512) 
            print "recv=>",recvMsg 

def sendMsg(sock): 
    msg = time.time()
    message = {} 
    message["id"] = os.getpid() 
    message["msg"] = msg 
    print "send=>", message 
    sock.send(str(message)) 

def main( port ): 
    sock = socket.socket() 
    sock.connect(( socket.gethostname(), int(port) )) 
    recvMsg = RecvMsg(sock) 
    recvMsg.start() 
    while True:
        time.sleep(1.5) 
        sendMsg(sock) 

if __name__ == "__main__":
    port = sys.argv[1] 
    main( port ) 
  

python client.py 56565


关于报错

socket模块提供4个error函数。

1.关于一般I/O和通信有关的问题 socket.error

2.与查询地址有关 socket.gaierror

3.与其他地址错误有关 socket.herror

4.与上个socket调用timeout有关 socket.timeout

举个例子:(保存为error.py)
#!/usr/bin/python
# -*- coding:utf-8 -*-
from socket import *
import time,sys

HOST = socket.gethostname()
PORT = sys.argv[0] 
BUFSIZ = 1024
ADDR = ( HOST, int(PORT) )

SerSock = socket(AF_INET, SOCK_STREAM)

try:
    SerSock.bind(ADDR)
except socket.error, e:
    print "socket.error=>",e
except socket.gaierror, e:
    print "socket.gaierror=>",e
except socket.herror, e:
    print "socket.herror=>",e

SerSock.listen(5)

while True:
    print "waiting for message..."
    CliSock, addr = tcpSerSock.accept()
    print "...connect from :", addr
    while True:
        data = CliSock.recv(BUFSIZ)
        if not data:
            break
        CliSock.send("[%s] %s" % (time.ctime(), data))
    CliSock.close()
SerSock.close()
  

python error.py 54545







本文出自 夏日小草,转载请注明出处: http://homeway.me/2014/10/21/python-socket-1/


-by小草

2014-10-21 22:34:54

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/37443.html

相关文章

  • App网络管理

    摘要:安卓开发一般都需要进行日志管理,常用操作老司机已为你封装完毕,你可以用这份工具进行管理,具体可以查看源码,现在为你开车,传送门。当前没有网络连接时返回获取当前网络的具体类型上下文当前网络的具体类型。   安卓开发一般都需要进行日志管理,常用操作老司机已为你封装完毕,你可以用这份工具进行管理,具体可以查看源码,现在为你开车,Demo传送门。 站点 系统日志输出工具类 → AppKeyBo...

    only_do 评论0 收藏0
  • 编程模型(范式)小结

    摘要:参考链接面向对象编程模型现在的很多编程语言基本都具有面向对象的思想,比如等等,而面向对象的主要思想对象,类,继承,封装,多态比较容易理解,这里就不多多描述了。 前言 在我们的日常日发和学习生活中会常常遇到一些名词,比如 命令式编程模型,声明式编程模型,xxx语言是面向对象的等等,这个编程模型到处可见,但是始终搞不清是什么?什么语言又是什么编程模型,当你新接触一门语言的时候,有些问题是需...

    miya 评论0 收藏0
  • Kubernetes CNI网络最强对比:Flannel、Calico、Canal和Weave

    摘要:第层网络的一个值得注意的示例是以太网,其中表示为子层。与其他方案相比,相对容易安装和配置。与不同,不使用网络。网络策略是其最受追捧的功能之一。 本文将在介绍技术原理和相应术语的基础上,再集中探索与详细对比目前最流行的CNI插件:Flannel、Calico、Weave和Canal,对比介绍它们的原理、使用方法、适用场景和优缺点等。 showImg(https://segmentfaul...

    scq000 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<