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

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()




  • 3
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一枚努力的程序猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值