python网络编程-socket编程

互联网协议:

python网络编程-socket编程

Socket是介于应用层和传输层之间

python网络编程-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()

依次运行即可聊天

python网络编程-socket编程

python网络编程-socket编程

群聊服务器

服务端

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'))

群聊服务器会接受消息并分发出去

python网络编程-socket编程

python网络编程-socket编程

在没有网但是在同一局域网时可以使用这种小程序交流:):):):):):):):):):):):):):)