今天来使用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)
|
步骤:
1 2 3 4 5 6 7 8 9 10
| import socket
s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
s.bind(('192.168.40.1',9090)) s.sendto('hello'.encode('utf8'),('192.168.40.1',9090))
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)
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客户端:
最终文件也是下载成功了~