zoukankan      html  css  js  c++  java
  • Python之TCP编程

    参考原文

      廖雪峰Python教程

     客户端

     我们知道每一条TCP的连接有2个端点,这两个端点叫做套接字socket。如果我们要进行基于TCP的通信必须先创建套接字。在Python中可以这样创建套接字socket,并向服务端发送请求:

    #导入socket库
    import socket
    import io
    
    #创建一个socket:
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    #建立链接
    s.connect(('www.sina.com.cn', 80))
    #客户端发送请求:
    s.send(b'GET / HTTP/1.1
    Host: www.sina.com.cn
    Connection: close
    
    ') #注意空格,回车换行
    
    #接收从服务器返回的数据:
    buffer = []
    while True:
        d = s.recv(1024) #每次最多接收1K字节
        if d:
            buffer.append(d)
        else:
            break
    data = b''.join(buffer)  #连接字符串
    #关闭链接
    s.close()
    #将HTTP报文头和正文分离:
    header, html = data.split(b'
    
    ',1) #后面的参数是分割次数
    #看下响应报文头:
    print(header.decode('utf-8'))
    #把接收到的正文写入文件:
    with open('sina.html','wb') as f :
        f.write(html)
    View Code

     服务端

    #导入socket库
    import socket
    import threading
    import time
    def tcplink(sock, addr):#新线程执行的函数
        print('Accept new connection from %s:%s...' % addr)
        sock.send(('Welcome!').encode('utf-8')) #发送数据给客户端
        while True:
            data = sock.recv(1024) #接收来自客户端的数据,最大(1k),阻塞式等待
            time.sleep(1) # stop: 1s 避免过度占用CPU
            #如果客户端没有发送数据或发送’exit‘:关闭连接
            if not data or data.decode('utf-8') =='exit': 
                break 
            #发送编码后的数据:
            sock.send(('Hello, %s' % data.decode('utf-8')).encode('utf-8'))
        sock.close()
        print('Connection from %s:%s closed' % addr)
    
    #创建一个基于IPv4和TCP协议的socket
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    #绑定监听端口:(服务的端口号<1024时,需要管理员权限)
    s.bind(('127.0.0.1', 9999)) #我们写的不是标准服务(标准服务HTTP,STMP)
    #开始监听:
    s.listen(5)  #param : 等待连接的最大数量
    print('waiting for connecting')
    #永久循环来接收来自客户端的连接:
    while True:
        #接收一个新的连接:
        sock, addr = s.accept() #accept会等待并发返回一个客户端的连接
        #创建新线程(多线程)来处理这个连接:单线程在处理过程中,无法接收其他客户端的连接
        t = threading.Thread(target=tcplink, args=(sock,addr))
        t.start()  #启动线程
    View Code

      测试客户端代码:

    import socket
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect(('127.0.0.1', 9999))
    #接收欢迎数据:
    print(s.recv(1024).decode('utf-8'))
    #客户端发送数据:
    for data in [('Michael').encode('utf-8'), ('Tracy').encode('utf-8'), b'Search']:
        s.send(data)
        #打印从服务端返回的数据:
        print(s.recv(1024).decode('utf-8'))
    s.send(b'exit')
    s.close()
    View Code

      运行效果:

    Tips:用TCP协议进行Socket编程在Python中十分简单,对于客户端,要主动连接服务器的IP和指定端口,对于服务器,要首先监听指定端口,然后,对每一个新的连接,创建一个线程或进程来处理。通常,服务器程序会无限运行下去。 同一个端口,被一个Socket绑定了以后,就不能被别的Socket绑定了。
  • 相关阅读:
    网络检查思路和步骤
    查看网络状态
    【Linux常见命令】lsof命令
    【Linux常见命令】ip命令
    【Linux常见命令】ifconfig命令:配置与查看网络信息
    【Linux常见命令】netstat命令
    Java-MD5
    Java发送邮件
    Maven基础02
    Maven基础01
  • 原文地址:https://www.cnblogs.com/yunche/p/9028027.html
Copyright © 2011-2022 走看看