ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Python 复习笔记 socket

2020-05-07 18:04:42  阅读:225  来源: 互联网

标签:socket Python IP tcp 复习 接字 recv 客户端


 

UDP:相当于写信,需要IP,端口,内容 然后一起发出。不安全,甚至可能丢或者被别人收走
TPC:相当于打电话,连接时需要应答,超时后会验证,比较麻烦但是比较安全。虽然内容可能丢失,
套接字是全双工的

UDP:
  流程:
    1.创建套接字
    2.接受/发送数据
    3.关闭套接字

 发送数据
  创建套接字:
    概念:s = socket.socket(AddressFamily(协议IPV4,IPV6),Type(类型TCP,UDP)) 创建的是对象
    例子:s = socket.socket(socket.AF_INET,socket.SOCK_STREAM/socket.SOCK_DGRAM)
  发送数据:
    s.sendto(b'hello',('127.0.0.1',8080))
  关闭套接字:
    s.close()

 接收数据
  创建套接字:
    s = socket.socket(AF_INET,SOCK_DGARM)
  绑定信息:
    addr=('',7788) 前面代表IP,后面代表端口,如果不写就默认为本机IP
    s.bind(addr)
  接受数据
    1.recv_date = s.recvfrom(1024) # 数字表示本次接收的最大字节数
    recv_date 的内容是以元组表示(内容,(发送方的IP,发送方的端口))
    所以想要得到内容是就是 recv_date[0] 需要解码( 应该根据电脑判断)才能正确显示(如果是Windos发送的要用gbk解码)
    想得到数据发送人的信息就是recv_date[1]
  关闭套接字:
    s.close()

温馨提示:recvrecv_date = s.recvfrom(1024) 接收时 如果没有数据就会堵塞

TCP:
明确区分服务端和客户端,发送时,好像都不需要自己绑定IP和端口
1.客户端和UDP使用类似:
  1.创建套接字
    tcp_client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
  2.连接服务器的IP和端口
    tcp_client.connect((IP,PORT)) 元组
  3.发送数据:
    send_data = input('请输入发送内容:')
    tcp_client.send(send_data.encode('utf-8'))
  4.关闭套接字:
    tcp_client.close()

2.服务端
  1.创建套接字:
    tcp_server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
  2.绑定属于自己的IP和端口: (bind)
    tcp_server.bind(('',7788))   #  一定要绑定IP和端口,就跟110一样,是固定的,能让人随时知道
  3.使套接字变成可以被动链接:(listen)
    tcp_server.listen(128)   #  后面的数字一般为128,虽然不同的数字可能会稍微影响同一时刻的客户端的接入数量,但最终接入数量还是由操作系统自己决定)
  4.等待用户连接:(accept)
    client_socket,client_add = tcp_server.accept()    # 这兄弟会返回一个元组(一个新的套接字,地址),而且堵塞,直到有人链接进来
  5.接受/发送数据:(recv/send)
    接受:recv_data = client_socket.recv(1024)
    发送:client_socket.send('OK接收到了 '.encode('gbk'))

温馨提示:
1.在 accept 前加循环 为循环为多个客户端服务
2.在 recv 前加循环,在为多个客户服务时,循环为一个客户服务
3.如果客户端解堵塞有两种原因:
1.对方发送数据 ,所以 recv 便解堵塞
2.对方调用了 close() 也会
4.服务端在接收到文件名时应该用try来打开文件,不应该用with open来打开否则,如果文件名不存在,用with open 会出错误
5.客户端要判断服务端发送的数据是否为空,不然会创建空文本

总的注意事项:
1. tcp服务器一般情况下都需要绑定,否则客户端找不到这个服务器,更无法链接到服务器

2. tcp客户端一般不绑定,因为是主动链接服务器,所以只要确定好服务器的ip、port等信息就好,本地客户端可以随机。而且可以避免打开服务器时发生端口问题

3. tcp服务器中通过listen可以将socket创建出来的主动套接字变为被动的,这是做tcp服务器时必须要做的

4.当客户端需要链接服务器时,就需要使用connect进行链接,udp是不需要链接的而是直接发送,但是tcp必须先链接,只有链接成功才能通信

5.当一个tcp客户端连接服务器时,服务器端会有1个新的套接字,这个套接字用来标记这个客户端,单独为这个客户端服务

6. listen后的套 接字是被动套接字,用来接收新的客户端的链接请求的,而accept返回的新套接字是标记这个新客户端的

7.关闭listen后的套接字意味着被动套接字关闭了,会导致新的客户端不能够链接服务器,但是之前已经链接成功的客户端正常通信。

8.关闭accept返回的套接字意味着这个客户端已经服务完毕

9.当客户端的套接字调用close后,服务器端会recv解堵塞,并且返回的长度为0,因此服务器可以通过返回数据的长度来区别客户端是否已经下线

标签:socket,Python,IP,tcp,复习,接字,recv,客户端
来源: https://www.cnblogs.com/otome/p/12844585.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有