1.网络通讯

socket:在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用已实现进程在网络中通信

在python中通过socket写一个cs架构的软件

简单的通信服务端


#导入一个socket模块
import socket

#想象成买手机打电话:socket.SOCK_STREAM 表示建立tcp连接 ,udp连接socket.SOCK_DGRAM
#买了个手机
soc=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#插电话卡:绑定ip地址  传元组:(ip,端口号)
soc.bind(('192.168.11.146',8080))  #如果写本机ip,局域网外部可以访问
# soc.bind(('127.0.0.1',8080))    #如果写127.0.0.1,只能自己访问

#开机,监听,这个5 是半连接池的大小
soc.listen(5)
#等待别人给我打电话
print('xxxx')
conn,addr=soc.accept()
print('yyyy')
print(addr)
# conn 就是通路
#接收1024个字节
data=conn.recv(1024)
print('我收到客户端发的',data)
#conn.send  发送数据,数据必须是bytes格式
conn.send(b'xxxxx')

#挂断电话
conn.close()
#销毁手机
soc.close()

简单的通信客户端

from multiprocessing import Process
import time
def foo():
    print('进程  start ')
    time.sleep(2.3)
    print('进程  end ')



if __name__ == '__main__':
    p = Process(target=foo)
    p.start() #
    # 核心需求就是
    # time.sleep(5)
    p.join() # 阻塞住主进程再等待子进程结束,然后再往下执行,(了解的是:内部会待用wait())
    print('主')

通信循环

服务器同循环

# import socket
# #生成一个socket对象
# soc=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# #绑定地址跟端口号
# soc.bind(('127.0.0.1',8001))
# #监听(半连接池的大小)
# soc.listen(5)
# #等着客户端来连接,conn相当于连接通道,addr是客户端的地址
# conn,addr=soc.accept()    #卡主,如果没有客户端连接,会一直卡在这,当有连接,才继续往下走
# print(addr)
# while True:
#     #等待接收,最大收取1024个字节
#     data=conn.recv(1024)    #会卡主,当客户端有数据过来,才会执行
#     print(data)
#
# #关闭通道
# conn.close()
# # 关闭套接字
# soc.close()

客户端通信循环

import socket

soc=socket.socket()

soc.connect(('127.0.0.1',8001))
while True:
    in_s=input('请输入要发送的数据:')
    #发送的数据必须是b格式,in_s.encode('utf-8')  把字符串编码成b格式
    #把b格式转成字符串
    # ss=str(b'hello',encoding='utf-8')
    # ss=b'hello'.decode('utf-8')
    # #把字符串转成b格式
    # by=bytes('hello',encoding='utf-8')
    # by='hello'.encode('utf-8')


    soc.send(in_s.encode('utf-8'))