socket简介

大部分网络应用都是用socket收发信息,例如聊天软件和浏览器。

使用方法

UDP

注意

  1. socket套接字为全双工
  2. 当socket接收数据时操作系统会对socket未读取的信息进行缓存

发送数据

  1. 创建套接字
  2. 使用套接字收数据
  3. 关闭套接字
1
2
3
4
5
6
7
8
9
10
11
12
13
14
import socket

#前边参数表示使用IPV4还是IPV6,后边表示使用TCP还是UDP
s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)

#可以绑定端口
s.bind(('',7890))

#前边参数为字节信息,后边为一个元组,包括对方ip和端口信息,首先要能ping的通.
#前边参数也可以使用.encode(utf-8)
s.sendto(b"hello",("192.168.33.5",8080))

#关闭套接字
s.close()

接收数据

  1. 创建套接字
  2. 绑定自己信息
  3. 接收信息
  4. 关闭套接字
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import socket

#前边参数表示使用IPV4还是IPV6,后边表示使用TCP还是UDP
s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)

#绑定本地信息
#前边为ip,空字符串表示本机ip,后边是端口号
localaddr('',7788)
s.bind(localaddr)

#接收数据,参数表示限制最大字数.
recv_data=s.recvfrom(1024)

#recv_data中收到的是一个元祖(接收到的数据,(发送方的ip,端口))
recv_msg=recv_data[0]

#输出接受的信息,注意编码格式
print(recv_msg.decode("gbk")

#关闭套接字
s.close()

TCP

发送数据

  1. 创建套接字
  2. 链接服务器
  3. 发送数据
  4. 关闭套接字
1
2
3
4
5
6
7
8
9
10
11
12
13
14
import socket

#创建套接字
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)

#链接服务器
s.connect(('192.168.33.11',7890))

#发送数据
send_data=input("请输入要发送的数据:")
s.send(send_data.encode("utf-8"))

#关闭套接字
s.close()

接收数据

  1. 创建套接字
  2. 绑定本地信息ip+端口
  3. 设置监听端口
  4. 等待客户端请求(accept会新建一个套接字)
  5. 接收客户端请求(使用新建的套接字接收请求)
  6. 响应客户端请求
  7. 关闭套接字
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import socket

#创建套接字
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)

#绑定本地ip
s.bind(('',7890))

#让默认套接字由主动变为被动listen,参数一般是默认值,对同时链接的客户端有一点关系
s.listen(128)

#等待客户端的链接 accept
#前边为新建一个处理客户端请求的套接字,后边是客户端ip+端口
new_client_socket,client_addr=s.accept()

#接收请求(会堵塞)
recv_data=new_client_socket.recv(1024)

#发数据给客户端
new_client_socket.send('hello'.encode('utf-8'))

#关闭套接字
s.close()
new_client_socket.close()

下载器案例

注意

  1. with在新建文件时用,在对文件操作异常时不用抛异常,可以直接close()
  2. 在打开文件时要使用try抛异常

客户端

1

服务器a

1