python网络编程-socket编程
互联网协议:
Socket是介于应用层和传输层之间
Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。所以,我们无需深入理解tcp/udp协议,socket已经为我们封装好了,我们只需要遵循socket的规定去编程,写出的程序自然就是遵循tcp/udp标准的。
聊天服务器:
服务端
import socket #1.创建个服务器 server=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #绑定ip和窗口 server.bind(('192.168.43.29',8000)) #设置最大挂起连接数5 server.listen(5) print('服务器启动 等待客户端连接...') #等待客户端链接 如果有链接 将返回一个 链接对象和对方的地址 conn,address=server.accept() while True: #接受客户端发过来 多大字节的数据 msg=conn.recv(1024) print('客户端:',msg.decode()) #给客户端回复数据 conn.sendall(input('服务端:').encode('utf-8')) #结束了 连接关闭 服务关闭 conn.close() server.close()
客户端
import socket #创建客户端 client=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #建立连接 client.connect(('192.168.43.29',8000)) print('客户端成功连接服务器...n 结束:') while True: msg=input('客户端:') if msg.__eq__('n'):break #发消息 格式 bytes 以utf-8的字符集去转成bytes client.send(msg.encode('utf-8')) #等待回复 并读取回复 msg=client.recv(1024) print('服务器 :',msg.decode())#接受到的bytes转出回去 #关闭连接 client.close()
依次运行即可聊天
群聊服务器
服务端
import socket,threading #1.创建个服务器 server=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #绑定ip和窗口 server.bind(('192.168.43.29',8888)) #设置最大挂起连接数5 server.listen(5) print('服务器启动 等待客户端连接...') #中间转换数据的变量 message='' #创建一把锁 lock=threading.Lock() Cond=threading.Condition(lock=lock) #不停的收 不停的发 def recv_msg(conn,address): while True: msg=conn.recv(1024) global message Cond.acquire() message=str(address)+'>>:'+msg.decode() print('收到:'+message) Cond.notify_all()#唤醒其他给我发消息的线程 Cond.release() def send_msg(conn,address): while True: Cond.acquire() Cond.wait() Cond.release() conn.sendall(message.encode('utf-8')) print('发送'+message) #为每一个连接者提供收和发的线程 while True: conn,address=server.accept() threading._start_new_thread(recv_msg,(conn,address))#不停收 threading._start_new_thread(send_msg,(conn,address))#不停发
客户端
import socket,threading #创建客户端 client=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #建立连接 client.connect(('192.168.43.29',8888)) #收取其他用户的数据 def recv_msg(): while True: msg=client.recv(1024) print('收到:',msg.decode()) threading._start_new_thread(recv_msg,()) while True: msg=input('请输入数据消息:') client.send(msg.encode('utf-8'))
群聊服务器会接受消息并分发出去
在没有网但是在同一局域网时可以使用这种小程序交流:):):):):):):):):):):):):):)