zoukankan      html  css  js  c++  java
  • 2.Python网络编程_TCP(简略版)

    TCP监听套接字:

      当新的客户端请求连接时,服务器端监听套接字收到消息,会分配一个新的套接字对应于客户端(新socket包括四部分:源IP、源端口号、目的IP、目的端口号)用于接收客户端的消息,仔细观察可以看出对于不同的客户端每个新产生的套接字的源IP和源端口号都是一样的,目的IP和目的端口号则不同,说明四元组只要其中一个不相同,这个socket就是不一样的.

     1 #tcp客户端
     2 import socket
     3 
     4 def cilent():
     5     #1.创建TCP套接字
     6     # socket.AF_INET:IPV4  socket.SOCK_STREAM:TCP
     7     socket_tcp_cilent=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
     8     
     9     #客户端一般不绑定(bind)ip和port
    10     #2.连接服务器
    11     server_ip='192.168.1.103'
    12     server_port=5566
    13     server_addr=(server_ip,server_port)
    14     socket_tcp_cilent.connect(server_addr)
    15     
    16     while True:
    17         #3.发送数据/接收数据
    18         send_data=input("请输入要发送的数据: ")
    19         if send_data=='exit':
    20             print("客户端关闭!")
    21             break
    22         socket_tcp_cilent.send(send_data.encode('utf-8')) 
    23         recv_data,recv_ip_port=socket_tcp_cilent.recvfrom(1024)
    24         print("服务器端回送的消息%s"%(recv_data.decode('gbk')))
    25         
    26     #4.关闭TCP连接
    27     socket_tcp_cilent.close()
    28     
    29     
    30 if __name__=='__main__':
    31     cilent();
     1 #TCP服务器端
     2 import socket
     3 
     4 def server():
     5     num=1
     6     #1.创建套接字
     7     socket_tcp_server=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
     8     
     9     #2.绑定本地信息 bind(ip,port)
    10     server_ip=''
    11     server_port=5566
    12     server_addr=(server_ip,server_port)
    13     socket_tcp_server.bind(server_addr)
    14     
    15     #3.让默认的套接字由主动变为被动 listen
    16     #监听套接字:负责等待新的各个客户端进行连接
    17     socket_tcp_server.listen(128)
    18     
    19     #4.等待客户端的连接 accept
    20     # 程序执行的到这里默认阻塞,当客户端连接服务端时,解阻塞
    21     # accept 返回一个二元元组,第一个是新的套接字,第二个是客户端
    22     # accept 负责产生新的套接字为客户端服务
    23     while True:
    24         print('等待一个新的客户端的到来...')
    25         new_cilent_socket,cilent_addr=socket_tcp_server.accept() 
    26         #accept返回的新socket包括四部分:源IP、源端口号、目的IP、目的端口号,这个四元组确定一个套接字
    27         #仔细观察可以发现对应于每个客户端的新分配的socket的源IP和源端口号是一样的,目的IP和目的端口号是不一样的
    28         #四元组一个不一样,就是一个不同的socket
    29         #具体见 https://blog.csdn.net/woxiaohahaa/article/details/78038442
    30         print('新分配的套接字: ',new_cilent_socket) 
    31         print('一个新的客户端已经到来%s'%str(cilent_addr))
    32         while True: #循坏多次,为同一个客户端服务多次
    33              #使用新分配的套接字,接收客户端发送过来的请求
    34              #如果recv阻塞,两种方式解阻塞:
    35              #1.客户端发送过来数据
    36              #2.客户端调用close导致
    37              try:
    38                  recv_data=new_cilent_socket.recv(1024) #接收到普通数据
    39              except:
    40                  break
    41              print('客户端发送过来的请求是:%s'%recv_data.decode('utf-8'))
    42              #如果客户机不需要服务了,当客户端socket.close()执行时,服务器套接字的消息会为空(recv解阻塞)
    43              #回送部分数据给客户端
    44              new_cilent_socket.send('-------ok-------'.encode('utf-8'))
    45         #关闭套接字
    46         new_cilent_socket.close()
    47         print('%d号客户机已经服务完毕!'%num)
    48         num+=1
    49     #关闭套接字 
    50     socket_tcp_server.close()
    51 
    52 if __name__=='__main__':
    53     server()
  • 相关阅读:
    HTML -- Note
    JavaScript使用childNodes和children
    Qt编写自定义控件69-代码行数统计
    Qt编写自定义控件68-IP地址输入框
    Qt编写自定义控件67-通用无边框
    Qt编写自定义控件66-光晕时钟
    Qt编写自定义控件65-光晕日历
    Qt编写自定义控件64-垂直时间轴
    Qt编写自定义控件63-水波效果
    Qt编写自定义控件62-探探雷达
  • 原文地址:https://www.cnblogs.com/NiBosS/p/11933145.html
Copyright © 2011-2022 走看看