Python网络编程

本文介绍了Python网络编程的基础,包括TCP和UDP的简单示例、UDP广播、Cisco Packet Tracer的使用,以及DNS攻击和NAT的概念。讲解了TCP连接中的listen参数、服务器和客户端的交互,还探讨了UDP在局域网中的应用。此外,还提到了网络攻击类型如DoS攻击和DNS攻击,以及NAT在家庭网络中的作用。
摘要由CSDN通过智能技术生成

查看Python中支持的编码方式:https://docs.python.org/3/library/codecs.html?highlight=utf

IP地址工具:http://ipblock.chacuo.net/

查看应用程序进程PID:

1.启动任务管理器,点击进程:默认是这样的:

2.点击查看, 选择列,勾上PID即可。

进程PID与进程使用的端口号是不同的概念。

Windows下看看哪个端口被占用及占用的进程

命令:

netstat -aon | findstr "8080"
netstat -an#查看所有的端口使用情况

8080是要查看的端口号。

例如在pycharm中建立一个网络通信

TCP

#time_server.py
import socket
import time
HOST = '127.0.0.1'
PORT = 12345
BUFSIZE = 1024
ADDR = (HOST,PORT)
tcpServerSock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
tcpServerSock.bind(ADDR)
tcpServerSock.listen(5)

while True:
    print("waiting for connection...")
    #这里tcpClietnSock为<socket.socket fd=932, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 12345), raddr=('127.0.0.1', 64764)>,包含了socket的信息
    tcpClientSock,addr = tcpServerSock.accept()
    print("...connected from:",addr)
    while True:
        data = tcpClientSock.recv(BUFSIZE)
        if not data:
            break
        # tcpClientSock.send('[%s] %s'%(time.ctime().encode('utf-8'),str(data).encode('utf-8')))
        # tcpClientSock.send('%s %s'%(time.ctime().encode('utf-8'),data))
        tcpClientSock.send(bytes("[%s] %s"%(time.ctime(),data.decode('utf-8')),encoding='utf-8'))
    tcpClientSock.close()

#time_client.py
import socket
HOST = '127.0.0.1'
PORT = 12345
BUFSIZE = 1024
ADDR = (HOST,PORT)

tcpClientSock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
tcpClientSock.connect(ADDR)

while True:
    data = input('>')
    if not data:
        break
    tcpClientSock.send(bytes(data,encoding='utf-8'))
    # tcpClientSock.send(data.encode('utf-8'))
    data = tcpClientSock.recv(BUFSIZE)
    if not data:
        break
    print(data.decode('utf-8'))
tcpClientSock.close()

 服务器端使用的端口好为:12345,运行服务器和客户端后,发现客户端使用的端口号为12037,执行命令:

查看到端口12345和12037被占用了,在任务管理其中查看到是Python3占用了这两个端口

为什么使用端口,而不直接使用PID了?

PID也可以唯一表示一个进程呀,这是因为使用PID代价太大,双方通信之前,得需要提前知道对方的PID,但是PID是操作系统自动分配的,人工去查很麻烦。如果直接使用端口的话比较方便,一般一个服务的端口比较固定。

同一个系统中,端口不能重复。

通信调试助手:模拟发送和接收情况。链接:https://pan.baidu.com/s/1GJTYxvUKGIHB9KM-D0CVug 密码:31z1

TCP连接中listen参数问题:

连接队列长度:客户端已经和服务器建立连接,或者客户端正在和服务器建立连接,但是还没有被服务器accept的最大个数。即同时等待accept的个数,和已经accept的个数没有关系。

Windows和Mac中严格安装这个参数来,Linux中内核会自己处理。

服务器

from socket import *
import time

s = socket(AF_INET,SOCK_STREAM)
s.bind(("127.0.0.1",12345))
s.listen(5)#队列缓存

while True:
    clientScoket,addr = s.accept()
    print(addr)
    time.sleep(1)

客户端


                
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值