python: tcp/ip学习、端口号、UDP的发送和接受数据、绑定端口号、模拟聊天室

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

[python]  view plain  copy
  1. from socket import *  
  2.   
  3. udpSocket=socket(AF_INET,SOCK_DGRAM)  
  4.   
  5. #使用udp发送的数据,在每一次的时候都需要写上接收方的IP和port  
  6. udpSocket.sendto("hha",("192.168.80.88",8080))  
  7. udpSocket.sendto("hha111",("192.168.80.88",8080))  


相同 的程序每一次运行都会动态的分配一个端口号(动态端口号>1024),在同一个OS(操作系统中),端口不允许相同,即如果一个端口已经被使用,那么在这个进程释放这个端口之前,其他进程不可以使用这个端口。

因为端口来区分一个进程, 如果端口相同了,就无法将数据发送给正确的进程。因此端口号不可以相同。



为了解决同一个程序每次运行有不同端口号的问题,实行绑定:

[python]  view plain  copy
  1. #endcoding=utf-8  
  2. from socket import *  
  3.   
  4. udpSocket=socket(AF_INET,SOCK_DGRAM)  
  5.   
  6. udpSocket.bind(("",7788))  #参数是元组的形式  
  7. #使用udp发送的数据,在每一次的时候都需要写上接收方的IP和port  
  8. udpSocket.sendto("hha",("192.168.80.88",8080))  
  9. udpSocket.sendto("hha111",("192.168.80.88",8080))  


。。。未完待续

9、接收数据

[python]  view plain  copy
  1. #endcoding=utf-8  
  2. from socket import *  
  3.   
  4. udpSocket=socket(AF_INET,SOCK_DGRAM)  
  5.   
  6. udpSocket.bind(("",7788))  #参数是元组的形式  
  7. #使用udp发送的数据,在每一次的时候都需要写上发送方的IP和port  
  8. recvData=udpSocket.recvfrom(1024)  
  9.   
  10. 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地址和端口号的发送和接收消息

[python]  view plain  copy
  1. #endcoding=utf-8  
  2. from threading import Thread  
  3. import time  
  4.   
  5. import sys  
  6. reload(sys)  
  7. sys.setdefaultencoding('utf-8')  
  8.   
  9. from socket import *  
  10.   
  11. def recvData():  
  12.     while True:  
  13.         recvInfo=udpSocket.recvfrom(1024)  
  14.         print("[%s]:%s"%(str(recvInfo[1]),recvInfo[0]))  
  15.   
  16. def sendData():  
  17.     while True:  
  18.         sendInfo="hello"  
  19.         time.sleep(5)  
  20.         udpSocket.sendto(sendInfo.encode("gb2312"),("192.168.80.70",8080))  
  21.   
  22. udpSocket=None  
  23.   
  24.   
  25. def main():  
  26.     global udpSocket  
  27.     global destIP  
  28.     global destPort  
  29.     udpSocket=socket(AF_INET,SOCK_DGRAM)  
  30.     udpSocket.bind(("192.168.80.70",4545))    
  31.       
  32.     tr=Thread(target=recvData)  
  33.     ts=Thread(target=sendData)  
  34.   
  35.     tr.start()  
  36.     ts.start()  
  37.   
  38.     tr.join()  
  39.     ts.join()  
  40.   
  41. if __name__=="__main__":  

  1.     main()  

##################

转自:https://blog.csdn.net/yanhuatangtang/article/details/77104132

猜你喜欢

转载自blog.csdn.net/qq_41262248/article/details/80791000