1、 在进程中为每个系统定义了一个数字,就是端口,知道数据发送到哪个程序中;ip决定发送到哪个电脑。因为不同的电脑程序所在的进程号不同,不能通过进程号来发送。
通过端口进入程序所在的进程。
2、端口号的数值0-65535
3、知名端口号0~1023和动态端口号
80端口网站:HTTP
ipv4:
端口号用来区分不同的应用程序。
4、ip地址:在网络上标定一个电脑,地址: 网络地址和主机地址(即网络号和主机号),网络号相同说明在同一个网络中,用后面的主机号来区分网络中的电脑。
A类IP地址:网络号占一个字节,主机号占三个字节;B类IP地址:网络号占二个字节,主机号占二个字节;C类IP地址:网络号占三个字节,主机号占一个字节1-254,0和255无法使用,为0时表示当前网络号;为255时表示广播地址。
虚拟机也占一个IP地址。
在一个局域网中不能有两个相同的ip地址。
在程序中,若一个变量表示字符,初始化时str1="";若一个变量表示对象,初始化时str2=None;
5、有一部分IP地址是私有IP:只能在局域网中能被访问到
10.0.0.0~10.255.255.255
172.16.0.0~172.31.255.255
192.168.0.0~192.168.255.255
一部分IP地址是公用IP:在网络中可以访问到到。
6、不同电脑中的进程之间的通信是通过socket
使用:创建socket
import socket
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)://第一个参数是满足IP地址协议,第一个参数创建的socket完成TCP协议
s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)://第一个参数是满足IP地址协议,第一个参数创建的socket完成UDP协议
7、现行IPMSG为版本1,基本格式如下:
版本号:包编号:发送者姓名:发送者机器名:命令名:附加信息
1:123223:user:machine:32:have a try
8、应用层也有自己的协议:比如QQ有自己的协议
下一层就是传输层:TCP/UDP
from socket import *
udpSocket=socket(AF_INET,SOCK_DGRAM)
#使用udp发送的数据,在每一次的时候都需要写上接收方的IP和port
udpSocket.sendto("hha",("192.168.80.88",8080))
udpSocket.sendto("hha111",("192.168.80.88",8080))
相同 的程序每一次运行都会动态的分配一个端口号(动态端口号>1024),在同一个OS(操作系统中),端口不允许相同,即如果一个端口已经被使用,那么在这个进程释放这个端口之前,其他进程不可以使用这个端口。
因为端口来区分一个进程, 如果端口相同了,就无法将数据发送给正确的进程。因此端口号不可以相同。
为了解决同一个程序每次运行有不同端口号的问题,实行绑定:
#endcoding=utf-8
from socket import *
udpSocket=socket(AF_INET,SOCK_DGRAM)
udpSocket.bind(("",7788)) #参数是元组的形式
#使用udp发送的数据,在每一次的时候都需要写上接收方的IP和port
udpSocket.sendto("hha",("192.168.80.88",8080))
udpSocket.sendto("hha111",("192.168.80.88",8080))
。。。未完待续
9、接收数据
#endcoding=utf-8
from socket import *
udpSocket=socket(AF_INET,SOCK_DGRAM)
udpSocket.bind(("",7788)) #参数是元组的形式
#使用udp发送的数据,在每一次的时候都需要写上发送方的IP和port
recvData=udpSocket.recvfrom(1024)
print(recvData)
接收结果(recvData):('http://www.cmsoft.cn', ('192.168.80.96', 8080))
接收方也需要绑定端口号,不然发送方不确定要发送的目的。
10、发送数据过程:
消息内容---->端口号+消息内容-------->目的IP地址+端口号+消息内容--------->MAC(硬件信息)+目的IP地址+端口号+消息内容------------>目的
接受数据过程:
相反过程
11、模拟聊天室
错误提示:File "<string>", line 1, in bind
出现这样的问题,说明IP地址或端口号绑定有问题
利用多线程的方法实现固定ip地址和端口号的发送和接收消息
#endcoding=utf-8
from threading import Thread
import time
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
from socket import *
def recvData():
while True:
recvInfo=udpSocket.recvfrom(1024)
print("[%s]:%s"%(str(recvInfo[1]),recvInfo[0]))
def sendData():
while True:
sendInfo="hello"
time.sleep(5)
udpSocket.sendto(sendInfo.encode("gb2312"),("192.168.80.70",8080))
udpSocket=None
def main():
global udpSocket
global destIP
global destPort
udpSocket=socket(AF_INET,SOCK_DGRAM)
udpSocket.bind(("192.168.80.70",4545))
tr=Thread(target=recvData)
ts=Thread(target=sendData)
tr.start()
ts.start()
tr.join()
ts.join()
if __name__=="__main__":
main()