Python笔记—网络编程

Python 提供了两个级别访问的网络服务。:

  • 低级别的网络服务支持基本的 Socket,它提供了标准的 BSD Sockets API,可以访问底层操作系统Socket接口的全部方法。

  • 高级别的网络服务模块 SocketServer, 它提供了服务器中心类,可以简化网络服务器的开发。

什么是 Socket?

Socket又称"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求,使主机间或者一台计算机上的进程间可以通讯。

Python 中,我们用 socket()函数来创建套接字,语法格式如下:
socket.socket([family[, type[, proto]]])

服务端

我们使用 socket 模块的 socket 函数来创建一个 socket 对象。socket 对象可以通过调用其他函数来设置一个 socket 服务。

现在我们可以通过调用 bind(hostname, port) 函数来指定服务的 port(端口)

接着,我们调用 socket 对象的 accept 方法。该方法等待客户端的连接,并返回 connection 对象,表示已连接到客户端。

完整代码如下:

import socket
import threading
#创建服务套接字  serversocket
sos = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
print("建立端口连接")
#服务套接字绑定端口号,绑定主机(主机名,IP地址等...)
sos.bind(("localhost",1314))
print("绑定端口和主机")
#设置最大连接数,超过之后要排队
sos.listen(5)
print("开始等待客户的请求")
# 接收客户套接字请求
c = sos.accept()  #线程阻塞
print("某个客户连接到我了")
# msg = c[0].recv(1024)
# print(msg.decode())  #接收的数据要解码
# c[0].send("是,要约吗?".encode())
#线程 函数
def myrec(c):
    while True:
        msg = c.recv(1024) #当没有消息的时休息,阻塞
threading._start_new_thread(myrec,(c[0],))
while True:
    msg = input()
    c[0].send(msg.encode())

客户端

接下来我们写一个简单的客户端实例连接到以上创建的服务。端口号为 12345。

socket.connect(hosname, port ) 方法打开一个 TCP 连接到主机为 hostname 端口为 port 的服务商。连接后我们就可以从服务端后期数据,记住,操作完成后需要关闭连接。

完整代码如下:

import socket
import threading
#建立客户套接字
c = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
print("创建客户套接字")
# c.connect(("localhost",1314))  #连接对方,不成功抛出异常
print("我一连接到服务器")
#send 发送的数据要编码
# c.send("你是陈JJ吗".encode())
# msg = c.recv(1024)
# print(msg.decode())
#线程 函数
def myrec(c):
    while True:
        msg = c.recv(1024) #当没有消息的时休息,阻塞
threading._start_new_thread(myrec,(c,))
while True:
    msg = input()
    c.send(msg.encode())
设计多人聊天转发消息的服务:
'''
设计多人聊天转发消息的服务
要两个线程
    一个再收消息
    一个再把收到的消息发出去
'''
import socket
import threading
ss = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
ss.bind(("0.0.0.0",1314))
ss.listen(10)
msg = None
lock = threading.Lock()
con = threading.Condition(lock)
def server_recv(c,a):
    global msg
    while True:
        sll =c.recv(1024)
        con.acquire()
        msg =sll
        msg  =str(a)+":\t"+sll.decode()
        con.release()
def server_send(c,a):
    global msg
    while True:
        con.acquire()
        con.wait()
        con.release()
        c.send(msg.encode)
while True:
    c,a = ss.accept()
    threading._start_new_thread(server_recv,(c,a))
    threading._start_new_thread(server_send,(c, a))








猜你喜欢

转载自blog.csdn.net/yl20175514/article/details/78430271