zoukankan      html  css  js  c++  java
  • 【Python】socket编程-2

    #练习3:TCP协议+while循环
    服务端:
    import socket   #socket模块
    import sys
    reload(sys)
    sys.setdefaultencoding("utf-8")
    HOST='127.0.0.1'
    PORT=8085
    s= socket.socket(socket.AF_INET,socket.SOCK_STREAM)   #定义socket类型,网络通信,TCP
    s.bind((HOST,PORT))   #套接字绑定的IP与端口
    s.listen(1)         #开始TCP监听,listen中的参数表示可以多少客户端来进行连接
    while 1:
        print u"开始连接"
        conn,addr=s.accept()   #接受TCP连接,并返回新的套接字与IP地址
        print'Connected by',addr    #输出客户端的IP地址
        while 1:
            data=conn.recv(1024)    #把接收的数据实例化
            print data
            conn.sendall(u'从服务得到结果:'.encode("gbk")+data.upper())
    conn.close()     #关闭连接
    
    
    客户端:
    import sys
    import socket
    reload(sys)
    sys.setdefaultencoding("utf-8")
    HOST='127.0.0.1'
    PORT=8085
    s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)      #定义socket类型,网络通信,TCP
    s.connect((HOST,PORT))       #要连接的IP与端口
    while 1:
        cmd=raw_input(u"向服务器发送命令:".encode("gbk"))       #与人交互,输入命令
        s.sendall(cmd)      #把命令发送给对端
        data=s.recv(1024)     #把接收的数据定义为变量
        print data         #输出变量
    s.close()   #关闭连接
    
    
    #练习4:TCP协议+while循环+异常捕获
    服务端:
    import socket   #socket模块
    import commands   #执行系统命令模块
    import sys
    reload(sys)
    sys.setdefaultencoding("utf-8")
    HOST='127.0.0.1'
    PORT=8086
    s= socket.socket(socket.AF_INET,socket.SOCK_STREAM)   
    #定义socket类型,网络通信,TCP
    s.bind((HOST,PORT))   #套接字绑定的IP与端口
    s.listen(5)         
    #开始TCP监听,listen中的参数表示可以多少客户端来进行连接
    while 1:
        print u"开始接收数据"
        conn,addr=s.accept()   #接受TCP连接,并返回新的套接字与IP地址
        print'Connected by',addr    #输出客户端的IP地址
        while 1:
            try:
                data=conn.recv(1024)    #把接收的数据实例化
                print data
                conn.sendall(u'服务返回结果'.encode("gbk")+data.upper())
            except Exception:
                conn.close()     #关闭连接
                break
    
    客户端:
    import socket
    import sys
    reload(sys)
    sys.setdefaultencoding("utf-8")
    HOST='127.0.0.1'
    PORT=8086
    s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)      
    #定义socket类型,网络通信,TCP
    s.connect((HOST,PORT))       #要连接的IP与端口
    times=3
    while times>0:
        cmd=raw_input(u"向服务器发送命令:".encode("gbk"))       #与人交互,输入命令
        s.sendall(cmd)      #把命令发送给对端
        data=s.recv(1024)     #把接收的数据定义为变量
        print data         #输出变量
        times-=1
    s.close()   #关闭连接
    
    
    #练习5:代码优化,发送多条
    服务端:
    import time
    if __name__ == '__main__':  
        import socket  
        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  
        sock.bind(('localhost', 8009))  
        sock.listen(5)  
        while True:
            print u"服务开始监听状态"
            time.sleep(0.1)
            connection,address = sock.accept()
            while 1:  
                try:  
                    connection.settimeout(5)  
                    buf = connection.recv(1024) 
                    print "got message from client:",buf 
                    if buf == '1': 
                        print "1" 
                        connection.send(u'您做的操作是:选择1'.encode("gbk"))
                    elif buf == '2':  
                        connection.send(u'您做的操作是:选择2'.encode("gbk"))
                    elif buf == "close":
                        connection.send(u'您做的操作是:选择close'.encode("gbk"))
                        connection.close()
                        break
                except socket.timeout:  
                    print u'连接超时'
                    connection.close()
                    break
                except Exception,e:
                    print e 
                    connection.close()
                    break
    
    客户端:
    if __name__ == '__main__':
        import socket
        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        sock.connect(('localhost', 8009))
        import time
        time.sleep(2)
        sock.send('2')
        print sock.recv(1024)
        sock.send('1')
        print sock.recv(1024)
        sock.send('close')
        print sock.recv(1024)
        print "Done!"
        sock.close()
    
    
    #练习6:传输+command命令
    服务端:
    import os
    if __name__ == '__main__':
        import socket
        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        sock.bind(('localhost', 8001))
        sock.listen(5)
        while True:
            connection,address = sock.accept()
            try:
                connection.settimeout(5)
                command = connection.recv(1024)
                print command
                result=os.popen(command)
                print result
                print result.name
                connection.send(result.name)
                connection.send(result.read())
            except socket.timeout:
                print 'time out'
            connection.close()
    
    客户端:
    if __name__ == '__main__':
        import socket
        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        sock.connect(('localhost', 8001))
        import time
        time.sleep(2)
        sock.send('ipconfig')
        print "command name:",sock.recv(10)
        print "command result:",sock.recv(1024)
        sock.close()
    
    #练习7:socket传输文件
    服务端:
    import socket,os,time,struct,threading,SocketServer
    host = '127.0.0.1'
    port = 12307
    sk = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  # 定义socket类型
    sk.bind((host, port))  # 绑定需要监听的Ip和端口号,tuple格式
    sk.listen(1)
    
    def conn_thread(connection, address):
        while True:
            try:
                connection.settimeout(600)
                fileinfo_size=struct.calcsize("128sl")
                buf=connection.recv(fileinfo_size)
                if buf:
                    filename,filesize=struct.unpack("20sl",buf)
                    filename_f=filename.strip("0")
                    filenewname=os.path.join("e:\test4\", os.path.basename
    
    (filename_f))
                    print u"文件名称:%s,文件大小:%s" %(filenewname,filesize)
                    recvd_size=0
                    file=open(filenewname,"wb")
                    print u"开始传输文件内容"
                    while not recvd_size==filesize:
                        if filesize-recvd_size>1024:
                            rdata=connection.recv(1024)
                            recvd_size+=len(rdata)
                        else:
                            rdata=connection.recv(filesize-recvd_size)
                            recvd_size=filesize
                        file.write(rdata)
                    file.close()
                    print 'receive done'
                    # connection.close()
            except socket.timeout:
                connection.close()
    
    while True:
        print u"开始进入监听状态"
        connection,address=sk.accept()
        thread = threading.Thread(target=conn_thread,args=(connection,address))
        thread.start()
    sk.close()
    
    客户端:
    import socket,os,struct
    sk=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sk.connect(("127.0.0.1",12307))
    while True:
        filepath=raw_input("Please Enter chars:
    ")
        if os.path.isfile(filepath):
            fhead=struct.pack("20sl",filepath,os.stat(filepath).st_size)
            sk.send(fhead)
            print u"文件路径:",filepath
            f=open(filepath,"rb")
            while True:
                filedata=f.read(1024)
                if not filedata:
                    break
                sk.send(filedata)
            f.close()
            print "传输成功"
            #sk.close()
    
    
    #练习8:实现多连接
    import socket
    HOST = '127.0.0.1'  # 本地localhost
    PORT = 50008
    s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    s.bind((HOST, PORT))
    s.listen(5)
    while True:
           print u"开始进入监听状态"
           conn,addr = s.accept()#接收连接
           print "开始接收连接从: ",addr
           while True:
               try:
                   data = conn.recv(1024)
                   if not data:
                       break
                   print "收到",data
                   msg = u"这是一个多进程服务测试"
                   conn.sendall(msg.encode("gbk"))
               except socket.error:
                   break
           conn.close()
  • 相关阅读:
    每天一个linux命令(8):scp使用
    C++11 列表初始化
    国外程序员整理的C++资源大全
    fiddler4 使用教程
    C++11 右值引用和转移语义
    数据库炸了——是谁动了我的wait_timeout
    Go组件学习——gorm四步带你搞定DB增删改查
    Go组件学习——cron定时器
    Go语言学习——channel的死锁其实没那么复杂
    Go语言学习——彻底弄懂return和defer的微妙关系
  • 原文地址:https://www.cnblogs.com/jingsheng99/p/9005617.html
Copyright © 2011-2022 走看看