查看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)
客户端