• socket 通信(UDP/TCP)


    udp:

    一:udp 发送数据

    如果只是发送数据的话,没必要绑定端口(其实操作系统会给随机分配个端口),只需要知道对方的ip 和port 就可以了,用sendto发送即可!

     1 from socket import *
     2 
     3 def main():
     4     udp_socket  =  socket(AF_INET,SOCK_DGRAM)
     5 
     6     while True:
     7         send_data = input("请输入要发送的内容>>>")
     8         if send_data == 'exit':
     9             break
    10 
    11         addr =("192.168.137.1",8080)
    12         udp_socket.sendto(send_data.encode("utf8"),addr)
    13         
    14     udp_socket.close()
    15 
    16 if __name__ == '__main__':
    17     main()

    二:udp 接收数据

    但是如果要接收数据,程序就必须得有个固定的端口,这样别人发送的时候才能发送!

     1 from socket import *
     2 
     3 def main():
     4     #创建套接字
     5     udp_socket  =  socket(AF_INET,SOCK_DGRAM)
     6 
     7     #绑定本机一个固定端口,用于接收数据
     8     local_addr = ("",9090)  #空的字符串代表本机任何一个ip
     9     udp_socket.bind(local_addr)
    10 
    11     #接收数据  recv_data 收到的既有内容还有  对方的ip +port 
    12     recv_data = udp_socket.recvfrom(1024)#一次最多接收1024字节 ,如果收不到会在这阻塞。
    13     print(recv_data)  #(b'hello world', ('192.168.137.1', 8080))
    14                       #意思是收到了192.168.137.1 中8080 端口发来的数据
    15 
    16 
    17     #关闭套接字
    18     udp_socket.close()
    19 
    20 if __name__ == '__main__':
    21     main()

    三:udp 发送和接收:

    服务端:

     1 from socket import *
     2 
     3 def main():
     4     #创建套接字
     5     udp_socket  =  socket(AF_INET,SOCK_DGRAM)
     6 
     7     #绑定本机一个固定端口,用于接收数据
     8     local_addr = ("",9090)  #空的字符串代表本机任何一个ip
     9     udp_socket.bind(local_addr)
    10 
    11     while True:
    12         #接收数据  recv_data 收到的既有内容还有  对方的ip +port
    13         recv_data = udp_socket.recvfrom(1024)#一次最多接收1024字节
    14         print("收到数据:",recv_data[0].decode("gbk"))  #之所以用gbk是因为对面用的是 ,windows默认用gbk 编码
    15         print("对方的ip,port: ",recv_data[1])
    16         c_ip_port = recv_data[1]  #是个元组
    17 
    18         send_data = "滚一边去,老子没空"
    19         udp_socket.sendto(send_data.encode("gbk"),c_ip_port)
    20 
    21     #关闭套接字
    22     udp_socket.close()
    23 
    24 if __name__ == '__main__':
    25     main()

    注:可以用tcp/udp 调试工具来模拟客户端

    udp小案例:udp 聊天器:

    通过网络不仅可以不同电脑通信,同一台电脑也可以通信:

    每个电脑都有一个127.0.0.1  ,它是不变的,可以用于本机两个进程间的通信!

    1,阻塞等待!

    单工:收音机(客户端只能接受数据)

    半双工:对讲机(在收的时候发不了,发的时候收不了)

    全双工:打电话(在收的时候也能发)

    2,socket 是全双工!

     

    TCP (重点):

    一:tcp服务端

     1 from socket import *
     2 
     3 def main():
     4     #创建套接字
     5     tcp_socket = socket(AF_INET,SOCK_STREAM)
     6     #绑定固定端口
     7     tcp_socket.bind(("",9090))
     8 
     9     #设置最大监听数
    10     tcp_socket.listen(128)  #最大监听数设置为128
    11     #accept()获得客户端的ip 和端口
    12     while True:
    13         new_socket,c_addr = tcp_socket.accept()
    14         print(c_addr)
    15         #通信
    16         while True:
    17             recv_data = new_socket.recv(1024)
    18             print(recv_data.decode("gbk"))
    19 
    20             if recv_data:
    21                 send_data = input("请输入(to client)>>>")
    22                 new_socket.send(send_data.encode("gbk"))
    23             else:
    24                 break  #使用它来退出循环
    25 
    26         new_socket.close()  #关闭用于通信的套接字
    27 
    28     #关闭套接字
    29     tcp_socket.close()
    30 
    31 
    32 if __name__ == '__main__':
    33     main()
    版本一:这在Linux平台是没错的

    但是,在win 平台上面,老是会抛出异常,所以,我们要用异常去捕捉它,并利用异常退出循环

     1 from socket import *
     2 
     3 def main():
     4     #创建套接字
     5     tcp_socket = socket(AF_INET,SOCK_STREAM)
     6     #绑定固定端口
     7     tcp_socket.bind(("",9090))
     8 
     9     #设置最大监听数
    10     tcp_socket.listen(128)  #最大监听数设置为128
    11     #accept()获得客户端的ip 和端口
    12     while True:
    13         new_socket,c_addr = tcp_socket.accept()
    14         print(c_addr)
    15         #通信
    16         while True:
    17             try:
    18                 recv_data = new_socket.recv(1024)
    19                 print(recv_data.decode("gbk"))
    20 
    21                 send_data = input("请输入(to client)>>>")
    22                 new_socket.send(send_data.encode("gbk"))
    23             except:
    24                 break
    25         new_socket.close()  #关闭用于通信的套接字
    26 
    27     #关闭套接字
    28     tcp_socket.close()
    29 
    30 
    31 if __name__ == '__main__':
    32     main()
    版本二:(win),利用异常退出里层循环

    二:tcp客户端:

     1 from socket import *
     2 
     3 def main():
     4     #建立soket套接字
     5     tcp_socket = socket(AF_INET,SOCK_STREAM)
     6 
     7     #connect() 连接服务器
     8     s_ip = "192.168.137.1"
     9     s_port = 9090
    10     tcp_socket.connect((s_ip,s_port))
    11 
    12     #通信
    13     while True:
    14         send_data = input("请输入要输入的内容(to server)>>>")
    15         tcp_socket.send(send_data.encode("gbk"))
    16 
    17         recv_data= tcp_socket.recv(1024) #每次收1024字节
    18         print(recv_data.decode("gbk"))
    19 
    20     #断开连接
    21     tcp_socket.close()
    22 
    23 if __name__ == '__main__':
    24     main()
    tcp_client

     

  • 相关阅读:
    C# ConfigMan.cs
    C# 反序列化JSON
    C#求数组最大值或最大值位置索引
    C#获取DataGridView数据源DataSource类型
    C#动态添加DataGridView列和行
    C# WinForm 检测文件是否被占用
    C#开源组件NPOI处理Excel导入DataTable数据至Sheet
    C# WinForm 扩展指定列宽适应DataGridView显示行数(二)
    C# WinForm 扩展指定列宽适应DataGridView显示行数
    VFP9 对 SqlServer Image字段的图片存取处理
  • 原文地址:https://www.cnblogs.com/zach0812/p/11339285.html
Copyright © 2020-2023  润新知