计算机通过网卡通信,一台计算机可以有多个网卡。
通信线路可传递各种类型的数据,遵循不同的通信协议。
socket:相当于通信双方的端口。
机器上最多开放的端口数:65535.
建立连接需要IP地址和端口号。
每个机器有IP地址,有端口号,通信时找到IP地址,再找到具体的端口号,因为机器上可以同时运行很多程序,所以需要同时开放很多端口。
发送端伪代码:
import socketsocket.TCP/IPconnect(server.ip,server.port)socket.send('hello,world')socket.recv() #发送端也可以接收服务器传来的数据socket.close() #关闭端口
服务器端伪代码:
import socketsocket.TCP/IPlisten(0.0.0.0,1234) #0.0.0.0是IP地址,一个服务器可以有多个IP地址,每个IP地址下有多个端口,接收数据时需要指定IP地址和端口#0.0.0.0是指所有IP地址,1234是端口号socket.waiting() #等待数据传来socket.recv() send() #服务器也可以发送数据
socket families(地址簇,网络层):
socket.AF_UNIX 进程通过内存通信,不经过硬盘
socket.AF_INET IPV4,网络层
socket.AF_INET6 IPV6
socket types(传输层):
socket.SOCK_STREAM #for tcp协议
socket.SOCK_DGRAM #for udp协议
socket.SOCK_RAW #原始套接字,处理底层、原始的数据ICMP\IGMP等网络报文;更改IP地址;
真代码:
服务器端:
import socketserver=socket.socket()server.bind(('localhost',9696))server.listen()print('开始等待')conn,addr=server.accept() #返回两个值,第一个是客户端连过来而在服务器端为其生成的一个连接实例,第二个是地址print(conn,addr)print('电话来了')data=conn.recv(1024)print('receive:', data)conn.send(data.upper())server.close()
客户端:
import socketclient=socket.socket() #声明socket类型,同时生成socket连接对象client.connect(('localhost',9696))# client.send(b"hello,world.") #只能以字节的格式发送,b代表byte,b只能转换ACS码,不能转换中文 client.send("胖虎就是刚田武".encode('utf-8')) #中文转换为bytesdata=client.recv(1024)print('recv:',data.decode()) #把bytes转换为utf-8client.close()
多次传输信息:
服务器端:
import socketserver=socket.socket()server.bind(('localhost',9696))server.listen()print('开始等待')conn,addr=server.accept() #返回两个值,第一个是客户端连过来而在服务器端为其生成的一个连接实例,第二个是地址print('电话来了')while True: data=conn.recv(1024) print(type(data)) #data是bytes类型 print(type(data.decode())) #data.decode()是str类型 print('receive:',data.decode()) #收到的是bytes,需要decode()解码成string conn.send(data.upper())server.close()
客户端:
import socketclient=socket.socket() #声明socket类型,同时生成socket连接对象client.connect(('localhost',9696))# client.send(b"hello,world.") #只能以字节的格式发送,b代表byte,b只能转换ACS码,不能转换中文# client.send("胖虎就是刚田武".encode('utf-8')) #中文转换为byteswhile True: massage=input('输入要发送的内容:').strip() client.send(massage.encode('utf-8')) data=client.recv(1024) print('receive:',data.decode())client.close()