IP地址的四个等级
A类:1.0.0.0~126.255.255.255
默认子网掩码255.0.0.0
B类:128.0.0.0~191.255.255.255
默认子网掩码255.255.0.0
C类:192.0.0.0~223.255.255.255
默认子网掩码255.255.0.0
D类:224.0.0.0~239.255.255.255
E类:240.0.0.0~255.255.255.255 一般用于研究用途..
本机地址:127.0.0.0~127.255.255.255为环回地址,用于本地环回测试等用途
我们用 socket()函数来创建套接字
常用套接字
服务器端
.bind()绑定地址
.listen()开始TCP监听,该值至少为1
.accept()被动接受TCP客户端连接,(阻塞式)等待连接的到来
客户端
.connect()主动初始化TCP服务器连接,如果连接出错,返回socket.error错误
公共的
.recv()接收TCP数据,数据以字符串形式返回
.send()发送TCP数据
.close()关闭套接字
服务器端
import socket import threading
serversocket=socket.socket(socket.AF_INET,socket.SOCK_STREAM) serversocket.bind(("localhost",9999))#绑定服务地址和端口号localhost=127.0.0.1 9999位端口 print("服务器已等待") serversocket.listen(5)#最多同时接收5个 msg=None #定义一个全局的变量,用来存储聊天信息,临时存储当前抢到线程的数据 lock=threading.Lock() mythread=threading.Condition(lock) def server_recv(c,a):#接受客户端消息 global msg while True: mystr=c.recv(1024) mythread.acquire()#线程同步 msg = str(a) + mystr.decode() print(msg) mythread.notify_all() mythread.release() def server_send(c,a):#发送给客户端消息 global msg while True: mythread.acquire() mythread.wait() mythread.release() c.send(msg.encode()) print(msg) while True: c,a=serversocket.accept() threading._start_new_thread(server_recv,(c,a)) threading._start_new_thread(server_send,(c,a))
客户端
import socket import threading client=socket.socket(socket.AF_INET,socket.SOCK_STREAM) client.connect(("localhost",9999)) def myrerv(c): while True: msg = c.recv(1024) # 接收消息 print(msg.decode('utf-8')) threading._start_new_thread(myrerv,(client,)) def myinput(): while True: msg=input() client.send(msg.encode('utf-8')) threading._start_new_thread(myinput())