【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()
原文地址:https://www.cnblogs.com/jingsheng99/p/9005617.html