zoukankan      html  css  js  c++  java
  • 基于TCP的套接字编程

    基于TCP协议的套接字编程(简单)

    • TCP又被称为流式协议,UDP被称为数据报协议(SOCK_DGRAM)
    • 以打电话为例

    服务端

    import socket
    
    # 1.买一个手机		代表符合TCP/UDP协议	 代表使用TCP协议
    phone = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    
    # 2.绑定手机号, 也就是ip地址以及端口号,MAC地址会由ip地址解析
    phone.bind(('127.0.0.1', 8080))	# 127.0.0.1就是本机ip地址
    
    # 3.开机,半连接池,里面的参数是限制同时接受多少个半连接数
    phone.listen(5)
    
    # 4.等待电话打过来
    print('wait...')
    # 三次握手建立的双向连接,客户端的ip,端口号
    conn, client_addr = phone.accept()
    print(conn)
    print(client_addr)
    
    # 5.通信:收到信息
    data = conn.recv(1024)
    print(data)
    
    # 6.回复信息
    conn.send(data.upper())
    
    # 7.挂电话
    conn.close()
    
    # 8.关机
    phone.close()
    

    客户端

    import socket
    
    # 1. 买手机
    phone = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    
    # 2.拨电话
    phone.connect(('127.0.0.1', 8080))
    
    # 3.通信,发信息
    phone.send('hello'.encode('utf-8'))
    
    # 4.通信,收信息
    data = phone.recv(1024)
    print(data)
    
    # 5.关机
    phone.close()
    
    

    基于TCP协议的套接字编程(循环)

    服务端

    import socket
    
    phone = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    phone.bind(('127.0.0.1', 8080))
    phone.listen(5)
    print('wait...')
    while True:	# 连接循环
        conn, client_addr = phone.accept()
        print(client_addr)
        
        while True:	# 通信循环
            try:
                data = conn.recv(1024)
                if len(data) == 0:	# 客户端单方断开连接,服务端就会接收到空数据
                    break
                print(data)
                conn.send(data.upper())
            except ConnectionResetError:
                break
    

    客户端1

    import socket
    
    phone = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    phone.connect(('127.0.0.1', 8080))
    while True:
        msg = input('输入要发送的信息:>>>').strip()
    	phone.send(msg.encode('utf-8'))
        data = phone.recv(1024)
        print(data)
        
    phone.close()
    

    客户端2

    import socket
    
    phone = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    phone.connect(('127.0.0.1', 8080))
    while True:
        msg = input('输入要发送的信息:>>>').strip()
    	phone.send(msg.encode('utf-8'))
        data = phone.recv(1024)
        print(data)
        
    phone.close()
    

    补充:

    listen(半连接数)

    listen 是最大半连接数而不是连接数,半连接就是三次握手没有完成。

    产生半连接的情况:

    1. 握了一次,服务器没来得及回复
    2. SYN攻击,客户端故意不进行第三次握手

    在windows上,如果客户端异常断开,服务端报错,客户端正常退出,服务端一直接受空

    如果是linux全是发空消息

  • 相关阅读:
    WPF 命令基础
    委托 C#
    Volley网络请求框架的基本用法
    MailOtto 实现完美预加载以及源码解读
    Android_时间服务
    Android_Chronometer计时器
    Android_Json实例
    完结篇
    就快完结篇
    MySQL 选出日期时间最大的一条记录
  • 原文地址:https://www.cnblogs.com/lucky75/p/11093667.html
Copyright © 2011-2022 走看看