python 网络编程

来源:互联网 发布:网络电视机顶合 编辑:程序博客网 时间:2024/06/07 00:28

今天要扩展的是python的网络编程

先介绍一下Socket

什么是socket?

Socket 是进程间通信的一种方式,它与其他进程间通信的一个主要不同是:它能实现不同主机间的进程间通信,我们网络上各种各样的服务大多都是基于 Socket 来完成通信的,例如我们每天浏览网页、QQ 聊天、收发 email 等等。要解决网络上两台主机之间的进程通信问题,首先要唯一标识该进程,在 TCP/IP 网络协议中,就是通过 (IP地址,协议,端口号) 三元组来标识进程的,解决了进程标识问题,就有了通信的基础了。

创建 socket

首先要创建 socket,用 Python 中 socket 模块的函数 socket 就可以完成:

import socket   #for sockets#create an AF_INET, STREAM socket (TCP)s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

函数 socket.socket 创建一个 socket,返回该 socket 的描述符,将在后面相关函数中使用。该函数带有两个参数:

  • Address Family:可以选择 AF_INET(用于 Internet 进程间通信) 或者 AF_UNIX(用于同一台机器进程间通信)
  • Type:套接字类型,可以是 SOCKET_STREAM(流式套接字,主要用于 TCP 协议)或者SOCKET_DGRAM(数据报套接字,主要用于 UDP 协议)
我们写一个聊天的功能来举例子

先创建一个服务套接字,让其他的机器连接

import socket
import threading
#创建服务套接字
ss = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
print("建立服务套接字")
ss.bind(("localhost",9999))
print("绑定端口和主及")
ss.listen(5)
print("开始等待客户的请求")
c = ss.accept()
print("某个用户连接了我")
def myrecv(c):
    while True:
        msg = c[0].recv(1024)
        print(msg.decode())
threading._start_new_thread(myrecv,(c,))
while True:
    msg = input()
    c[0].send(msg.encode())


再创建一个连接主机的服务

import socket
import threading
#创建客户套接字
c = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
print("创建客户套接字")
c.connect(("192.168.11.59",9999))
print("连接成功")
def myrecv(c):
    while True:
        msg = c.recv(1024)
        print(msg.decode())
threading._start_new_thread(myrecv,(c,))
while True:
    msg = input()
    c.send(msg.encode())


这样就完成了一个1v1的聊天功能,如果想要实现多人聊天的话,需要一个服务器端。

import  socketimport threadingss=socket.socket(socket.AF_INET,socket.SOCK_STREAM)ss.bind(("0.0.0.0",9999))ss.listen(10)msg=Nonelock=threading.Lock()con=threading.Condition(lock)def server_recv(c,a):    global msg    while True:        msg1=c.recv(3000)        con.acquire()        msg=msg1        msg=str(a)+msg1.decode()        con.notify_all()        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))

这样多人聊天就创建好啦,如果想要了解更多,可以去http://www.runoob.com/python/python-socket.html里面看