zoukankan      html  css  js  c++  java
  • python learning Network Programming.py

    Socket

    # 用一个 Socke t表示“打开了一个网络连接”
    # 打开一个 Socket 需要知道目标计算机的IP地址和端口号,再指定协议类型即可。
    
    # TCP
    # 主动发起连接的是客户端,被动相应的是服务器
    
    # 1. 创建一个基于 TCP 连接的socket
    
    import socket
    
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    
    # AF_INET 指 IPv4 协议。SOCK_STREAM 指面向流的 TCP 协议。
    # 初始化了一个 socket 实例,还没有建立连接
    
    # 2. 连接到服务器
    # connect 接受的参数是一个 tuple:(ip, port)。输入域名可以通过DNS自动转换为IP地址。
    
    s.connect(('www.sina.com.cn',80))
    
    # 3. 发送数据 send
    # 下列数据的意思是:请求返回首页的内容
    # TCP连接创建的是双向通道,双方都可以同时给对方发数据。但是谁先发谁后发,怎么协调,要根据具体的协议来决定。例如,HTTP协议规定客户端必须先发请求给服务器,服务器收到后才发数据给客户端。
    
    s.send(b'GET / HTTP/1.1
    Host: www.sina.com.cn
    Connection: close
    
    ')
    
    # 4. 接受服务器发来的数据
    # 发送完 HTTP 格式请求后,接下来就可以接收新浪服务器返回的数据了:
    
    buffer = []
    while True:
        d = s.recv(1024) # 1KB
        if d:
            buffer.append(d)
        else: # 数据读取完毕或者连接中断,返回 empty string
            break
    
    data = b''.join(buffer) # 这句语句的意思就是使用空字节把 buffer 这个字节列表连接在一起,成为一个新的字节串
    
    # b''是一个空字节,join是连接列表的函数,buffer是一个不断接受到的串的列表
    # 例如把[b'ab',b'cd',b'ef']变成 b'abcdef'
    
    # 5. 接受完数据,关闭 socket
    
    s.close()
    
    # 接收到的数据包括HTTP头和网页本身
    # 我们只需要把HTTP头和网页分离一下,把HTTP头打印出来,网页内容保存到文件:
    
    header, html = data.split(b'
    
    ',1)
    print(header.decode('utf-8'))
    
    with open('sina.html','wb') as file:
        file.write(html)
    

    服务器

    # 1. 服务器进程绑定一个端口,监听来自客户端的连接
    # 四元组来唯一确定一个 socket
    # 因为服务器要同时相应多个客户端的请求,所以,每次连接都需要一个新的进程或者线程来处理。
    
    # 我们来编写一个简单的服务器程序,它接收客户端连接,把客户端发过来的字符串加上Hello再发回去。
    
    import socket
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    
    # 监听端口
    # 绑到本地地址,端口号9999
    # 127.0.0.1是一个特殊的IP地址,表示本机地址,如果绑定到这个地址,客户端必须同时在本机运行才能连接,也就是说,外部的计算机无法连接进来。
    s.bind(('127.0.0.1', 9999))
    
    # 调用listen()方法开始监听端口,传入的参数指定等待连接的最大数量:
    s.listen(5)
    print('Waiting for connection...')
    
    # 服务器程序通过一个永久循环来接受来自客户端的连接
    # accept()会等待并返回一个指示客户端连接的socket 和客户端 ip 地址:
    import threading
    import time
    def tcplink(sock, addr):
        print('Accept new connection from %s...' % addr)
        sock.send(b'Welcome!')
        while True:
            data = sock.recv(1024)
            time.sleep(1)
            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 closed.' % addr)
    
    while True:
        # 接受一个新连接:
        sock, addr = s.accept()
        # 创建新线程来处理TCP连接:
        t = threading.Thread(target=tcplink, args=(sock, addr))
        t.start()
    

    客户端

    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 [b'Chang', b'KangKang', b'Wangbin']:
        # 发送数据:
        s.send(data)
        print(s.recv(1024).decode('utf-8'))
    s.send(b'exit')
    s.close()
    

    UDP server

    import socket
    
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    s.bind(('127.0.0.1',9999))
    print('Bind UDP on 9999....')
    while True:
        # UDP: 不需要调用listen()方法,而是直接接收来自任何客户端的数据:
        data, addr = s.recvfrom(1024) # recvfrom()方法返回数据和客户端的地址与端口
        print('Received from %s:%s' % addr) # 把数据用UDP发给客户端
        s.sendto(b'Hello, %s!'% data, addr)
    
    

    UDP client

    import socket
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    for data in [b'zhao', b'Chang']:
        s.sendto(data, ('127.0.0.1',9999))
        print(s.recv(1024).decode('utf-8'))
    s.close()
    
    
  • 相关阅读:
    postman发送请求携带Cookie
    maven打包相关配置
    springboot使用redis的keyspace notifications 实现定时通知
    JSON使用
    jdk1.8的一些特性
    Mysql--基础(一)
    04 difflib和filecmp
    08 存储引擎
    03 dnspython模块的应用
    02 IPy模块的应用
  • 原文地址:https://www.cnblogs.com/ZCplayground/p/9042731.html
Copyright © 2011-2022 走看看