文章目录
- 1、windows 系统下如何查看当前的ip地址
- 2、qq消息为啥不会传到微信里面?端口号问题
- 3、 什么是端口(重点呐)
- 4、创建socket(python版)
- 5、发送与接受数据
- 6、公有ip和私有ip
- 7、单工、半双工、全双工
- 8、TCP客户端和服务器的建立
- TCP客户端(需要先运行服务器,才可以运行客户端,此外需要修改自己为自己的电脑ip)
- TCP服务器
1、windows 系统下如何查看当前的ip地址
打开终端(win+r)输入下面命令行
#写在前面:该页面ctrl+F可以查询内容,便于定位到你所需要知道的知识。
ipconfig
在公司时候输入ipconfig (在公司网络下你的电脑ip是固定的,每天你ipconfig一下都不会变)
个人的热点链接电脑,输入ipconfig
各部分的解释:
本地链接的IPv6:当前电脑的ip或者手机的热点ip
IPv4地址:当前电脑的ip或者手机的热点ip
子网掩码:
默认网关:网关又称网关路由器。比如我们要发送消息给翠花,消息会先经过自己家的路由器A,再由自己家的路由器A将消息发给翠花家路由器B,最后翠花家路由器B把消息传送给翠花。网关的作用类似一个通关口。
2、qq消息为啥不会传到微信里面?端口号问题
电脑有自己的ip,电脑上的软件有特定的端口号,qq有qq端口号,微信有微信端口号。所以传递的消息上也是有软件端口号信息的。下面两张图片引用了b站的python-socket教程。https://www.bilibili.com/video/BV1Xx411R743/?p=5&spm_id_from=pageDriver&vd_source=f99e21db912f182fe051b1b6b156e0e3
左边机器向右边机器发送消息:
右边机器向左边回复消息:
3、 什么是端口(重点呐)
一个程序没有运行之前称为:程序。
一个程序运行起来之后称为:进程,并用端口号标记该程序
端口号0-1023用于特定用途(类似于手机号码很多,但是110,120,119用于特定用途的),1024-65535端口号为动态端口,我们可以自由使用。
4、创建socket(python版)
Socket函数使用的格式为:socket(family,type[,protocol])
参数 | 功能 |
family | socket.AF_INET 表示服务器之间网络通信 |
type | socket.SOCK_STREAM,当使用TCP时选择此参数 |
type | socket.SOCK_DGRAM ,当使用UDP时选择此参数 |
import socket
# 创建tcp的套接字
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 不用时关闭
s.close()
# 创建udp的套接字
s1 = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 不用时关闭
s1.close()
5、发送与接受数据
注意:
1、如果未能绑定端口则操作系统会随机分配一个端口。如果应用需要接收并发送消息则需要给程序绑定特定的端口。
2、同一个电脑的两个应用程序不可以绑定同一个端口号。
3、windows通讯用gbk编码,与mac和liux通讯用utf-8编码
'''发送数据'''
import socket
def main():
# 1、创建套接字
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 2、绑定一个本地信息
localaddr = ("", 7790)
udp_socket.bind(localaddr) # 必须绑定自己电脑的ip以及port,其他的不行
# 3、接收数据 recv_data存储一个元组(接收到的数据,(发送方的ip和port端口号))
while True:
# 1、从键盘中获取数据
send_data = input("请输入要发送的数据:")
udp_socket.sendto(send_data.encode("gbk"), ("192.168.40.137", 7788))
# 5、关闭套接字
udp_socket.close()
if __name__ == "__main__":
main()
程序运行并输入111回车
'''接受数据'''
import socket
def main():
# 1、创建套接字
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 2、绑定一个本地信息
localaddr = ("", 7788)
udp_socket.bind(localaddr) # 必须绑定自己电脑的ip以及port,其他的不行
# 3、接收数据 recv_data存储一个元组(接收到的数据,(发送方的ip和port端口号))
while True:
recv_data = udp_socket.recvfrom(1024)
recv_mes = recv_data[0] # 存储接收的数据
send_addr = recv_data[1] # 存储方的地址信息
# 4、打印接收到的数据
# print("%s:%s" % (str(send_addr), recv_mes.decode("utf-8")))
# 接收来自windows的编码内容:windows默认采用gbk编码,因此需要用gbk解码,
print("%s:%s" % (str(send_addr), recv_mes.decode("gbk")))
# 5、关闭套接字
udp_socket.close()
if __name__ == "__main__":
main()
接收端会收到信息111并且显示电脑ip和端口号。
6、公有ip和私有ip
为什么你在学校实验或者在项目现场看到的IP都是192.168.1.1-192.168.255.255这个范围内部呢。因为这个ip区间是私有ip,是不直接上互联网的,无法和世界互联。只有和世界互联的ip才是唯一的独有的ip。
7、单工、半双工、全双工
单工:只可以发送或者接收消息,比如收音机
半双工:可以接收也可以发送消息,但是同一时刻只能接收或发送。
全双工:同一时刻既可以发消息也可以接收消息。socket套接字是全双工的。
8、TCP客户端和服务器的建立
tcp通讯包括三个部分:建立链接、发送消息、终止链接。
(比如在打电话时候,拨打出去并不会立马接通,因为需要先建立链接,所以tcp通讯传输数据更加稳定,不容易丢包。)
可靠传输:tcp采用发送应答机制、超时重传、错误校验、流量控制和阻塞管理
一个tcp的套接字可以转化为一个监听套接字,专门用于监听客户端的接入。
TCP客户端(需要先运行服务器,才可以运行客户端,此外需要修改自己为自己的电脑ip)
'''TCP客户端 '''
import socket
def main():
# 1.创建tcp的套接字
tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 2.链接服务器
tcp_socket.connect(("192.168.40.137", 7890))
# 3.发送数据、接收数据
while True:
send_data = input("请输入要发送的数据:")
tcp_socket.send(send_data.encode("gbk"))
# 4.关闭套接字
tcp_socket.close()
if __name__=="__main__":
main()
TCP服务器
'''TCP服务器'''
import socket
def main():
# 1.买个手机(创建套接字 socket)
tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 2.传入手机卡(绑定本地信息 bind)
tcp_server_socket.bind(("", 7890))
# 3.将手机设置为正常的 响铃模式(让默认的套接字由主动变为被动listen)
tcp_server_socket.listen(128)
print("等待一个新的客户端到来。。。。")
# 4.等待别人的电话到来(等待客户端的链接 accpet)
# new_client_socket 负责和客户端通讯
new_client_socket, clientAddr = tcp_server_socket.accept() # 卡住 等待客户端连接。
print("一个新的客户端已经到来%s"% str(clientAddr))
# 接收客户端发送过来的请求
while True:
recv_data = new_client_socket.recv(1024) # 卡住等待客户端输入。实时通讯依赖于recv_data。recv_data相当于信鸽
print("客户端发送过来的请求是:%s" % recv_data.decode("gbk"))
print("客户端连接断开")
if recv_data:
new_client_socket.send("shoudao".encode("gbk"))
else:
new_client_socket.close()
if __name__ == "__main__":
main()