python_网络编程

今天来使用python做一个小型在线聊天程序

预备知识:
1
2
3
4
5
6
网络通信
网线一共八根,白绿白蓝白橙白棕,目前只使用四根,1246
568A/B线序
ISP:网络服务运营商
IP地址
0.0.0.0-255.255.255.255

我的IP地址:222.94.33.63(动态,每次上网会改变)

不同电脑不同软件之间通信用端口区分,同一电脑用PID区分。

SOCKET简介

1
2
3
4
import socket
socket.socket(AddressFamily,Type)
#AF 可选: AF_INET(不同主机) AF_UNIX(同一主机)
#Type 套接字 SOCK_STREAM(TCP) SOCK_DGRAM(UDP)

步骤:

1
2
3
4
5
6
7
8
9
10
import socket
#创建socket对象
s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
#data发送数据,是二进制数据 address一个元组(IP地址,端口号)
s.bind(('192.168.40.1',9090))
s.sendto('hello'.encode('utf8'),('192.168.40.1',9090))
#data为二进制数据,addr[0]是IP地址,addr[1]是端口号
data,addr = s.recvfrom(1024
#关闭通信
s.close()

端口号0-65536,0-1024系统在用

netstat -an按回车显示所有已经占用的端口号

netstat -ano|findstr 端口号来看是否端口号被占用

在发送完消息之后需要对端口进行监听就能收到消息

1
2
3
4
5
6
7
import socket
s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
#绑定端口号和IP地址

content = s.recvfrom(1024)
print(content)
s.close()

我的实验:

接收方:我的电脑

发送方:我的Ubuntu虚拟机

效果:

TCP 面向连接的协议 区分服务器与客户端

服务器要用bind绑定IP和端口,设置监听listen(n),n表示可排队的最大值,接收信息使用accept,取出数据需要用recv()方的decode(编码)

服务器端:

客户端要用connect方法连接到服务器,使用send()方法发送数据的encode(编码)。

客户端:

输出内容是一个双元素元组,第0个是客户端的socket,第一个元素是客户端的ip地址和端口号,第二个元素是客户端的实际发送地址和端口号

1
>>接收到了192.168.43.207客户端11979端口号发送的数据,内容是<socket.socket fd=736, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('192.168.43.207', 9090), raddr=('192.168.43.207', 11979)>

文件下载:

Ubuntu作为客户端,Windows作为服务器,客户端从服务器下载文件

Windows服务器端:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import socket
import os
server_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
server_socket.bind(('10.0.61.146',9090))
server_socket.listen(128)
client_socket,client_addr = server_socket.accept()
data = client_socket.recv(1024).decode('utf8')
print('接收到了来自{}地址{}端口的数据,内容是:{}'.format(client_addr[0],client_addr[1],data))
if os.path.isfile(data):
print('读取文件返回给客户端')
while True:
with open(data,'r',encoding='utf8') as file:
content = file.read()
client_socket.send(content.encode('utf8'))
else:
print('文件不存在')

Ubuntu客户端:

最终文件也是下载成功了~