zoukankan      html  css  js  c++  java
  • 网络编程: 基于TCP协议的socket, 实现一对一, 一对多通信

    TCP协议  面向连接 可靠的 面向字节流形式的

    tcp是基于链接的,必须先启动服务端,然后再启动客户端去链接服务端

    TCP协议编码流程:

    服务器端:                  客户端

    实例化对象                  实例化对象

    绑定IP地址和端口号         

    监听

    接收客户端的连接           连接服务器

    收发                         收发

    关闭                         关闭

     

     

    问题:有的同学在重启服务端时可能会遇到

    解决方法: 

    #加入一条socket配置,重用ip和端口
    import socket
    from socket import SOL_SOCKET,SO_REUSEADDR
    sk = socket.socket()
    sk.setsockopt(SOL_SOCKET,SO_REUSEADDR,1) #就是它,在bind前加
    sk.bind(('127.0.0.1',8898))  #把地址绑定到套接字
    sk.listen()          #监听链接
    conn,addr = sk.accept() #接受客户端链接
    ret = conn.recv(1024)   #接收客户端信息
    print(ret)              #打印客户端信息
    conn.send(b'hi')        #向客户端发送信息
    conn.close()       #关闭客户端套接字
    sk.close()        #关闭服务器套接字(可选)
    View Code

    tcp三次握手: 一定是client先发起请求

                 a 客户端发起请求连接服务器

                 b 服务器返回:接收到请求,并要求连接客户端

                 c 客户端回复:可以连接

    四次挥手:  谁先发起断开连接的请求都可以

                 a 客户端发起断开连接的请求:

                      意思是: 我想和你断开连接,我没有数据要继续发送了,但是如果你有数据需要发送,我可以继续接收

                 b  服务器回复 : 我接收到你的请求了

                 c  服务器发送 : 我已经准备好断开连接了

                 d  客户端回复 : 收到你的信息,断开连接

     tcp实现的一个聊天室, 可以实现一对多,但是必须断掉别人的连接, 然后才能和下一个人聊,本质还是一对一

    只是创建一个死循环,让服务器一直处于待机状态  

    while 1:
        conn,addr = sk.accept()
    
     1 import socket
     2 
     3 
     4 sk = socket.socket()
     5 sk.bind(('127.0.0.1',8888))
     6 sk.listen()
     7 
     8 while 1:
     9 
    10     conn,addr = sk.accept()
    11 
    12     msg_r = conn.recv(1024)
    13     if msg_r.decode('utf-8') != 'q':
    14         print(msg_r.decode('utf-8'))
    15 
    16     else:
    17         break
    18 
    19     msg_s = input('>>>')
    20     if msg_s != 'q':
    21         conn.send(msg_s.encode('utf-8'))
    22     else:
    23         conn.send(msg_s.encode('utf-8'))
    24         break
    sever1
     1 import socket
     2 
     3 name = input('请输入你的名字:
    ')
     4 
     5 sk = socket.socket()
     6 sk.connect(('127.0.0.1', 8888))
     7 
     8 
     9 while 1:
    10 
    11     msg_s = input('>>>')
    12     if msg_s != 'q':
    13         sk.send((name + msg_s).encode('utf-8'))
    14     else:
    15         sk.send(msg_s.encode('utf-8'))
    16         break
    17 
    18     msg_r = sk.recv(1024)
    19     if msg_r != 'q':
    20         print(msg_r.decode('utf-8'))
    21     else:
    22         break
    23 
    24 sk.close()
    client1
     1 import socket
     2 
     3 name = input('请输入你的名字:
    ')
     4 
     5 sk = socket.socket()
     6 sk.connect(('127.0.0.1', 8888))
     7 
     8 while 1:
     9 
    10     msg_s = input('>>>')
    11     if msg_s != 'q':
    12         sk.send((name + msg_s).encode('utf-8'))
    13     else:
    14         sk.send(msg_s.encode('utf-8'))
    15         break
    16 
    17     msg_r = sk.recv(1024)
    18     if msg_r != 'q':
    19         print(msg_r.decode('utf-8'))
    20     else:
    21         break
    22 
    23 sk.close()
    client2
  • 相关阅读:
    python中获取今天昨天和明天的日期
    Redis安装系统服务1073错误
    npm 安装删除模块
    git 远程服务器创建项目自动化部署、克隆推送免密码
    A20地址线科普【转载】
    fork 与 vfork
    /bin /usr/bin /sbin /usr/sbin 目录的作用
    Coreutils
    VMware 设置支持UEFI
    npm 发布包
  • 原文地址:https://www.cnblogs.com/niuli1987/p/9469457.html
Copyright © 2011-2022 走看看