python 使用Socket库进行编程的原理
在阅读这篇文章之前,默认您已经学会了Python基本知识,废话不多说,自己写了一个小程序,直接上原理图和代码,希望各位网友多多指正。
1:目的
利用socket编写客户端和服务器代码,实现多个客户端能够正常访问服务器,能够处理信息和访问Html静态网页
1:基础知识
Socket于1970年在佳利福尼亚大学伯克利分校的一个研究组诞生,Socket的出现是为了在UNIX操作系统中进行TCP/IP软件移植。同时将移植结果提供给其他节点。作为项目的一部分,设计器创建了一个接口,该接口可由应用程序使用,以便于实现通信网络上的两个程序建立连接进行双向通信,从而达到交换数据的目的。而通信网络上的另外一端被称为套接字。
客户机和服务器需要一个端口建立网络通信连接。用户称该端口为套接口。套接字实际上就是一个编程接口,简称API,同时TCP/IP为程序员提供了网络开发的接口。通过该接口,程序员可以更好地开发软件,这就是是套接字编程接口。
2:基础调用
当客户机和服务器使用Socket连接时,服务器首先处于开启状态,侦听请求。
socket() #调用Socket套接字
bind() #绑定套接字使用的端口,即绑定IP和端口号
connect() #建立连接函数
listen() #进行系统侦听请求的函数,侦听由客户端发送的的消息
accept() #接受listen()侦听到的请求,建立连击,
send() #发送数据
recv() #接收数据
sendto() #在进行无连接(UDP)时数据发送
recvfrom() #在进行无连接(UDP)时数据接收
close() #数据传输完成后关闭套接字
3:Socket编程原理
服务器程序流程图 客户端程序流程图
4:服务器程序和客户端程序
#coding=utf-8
from multiprocessing import Process #导入Python自带库的Process模块
import SimpleHTTPServer #导入Http请求模块
import SocketServer #导入SockrtServer,该模块封装了Socketde 部分功能
from socket import * #导入Sockret中的所有内容
from threading import Thread #导入线程
HOST = ("192.168.50.92") #服务器地址
PORT = 7782 #端口号
def handleHttp(): #定义函数处理HTTP请求模块
Handler = SimpleHTTPServer.SimpleHTTPRequestHandler
httpd = SocketServer.TCPServer((HOST, PORT), Handler,)
print "--进程2--等待处理http请求--服务已开启在", PORT,"端口"
httpd.serve_forever()
#(5) Socket基础配置,包括创建Socket,绑定主机地址,建立侦听状态
serSocket = socket(AF_INET,SOCK_STREAM) #socket基础配置模块
serSocket.setsockopt(SOL_SOCKET,SO_REUSEADDR,1)
addr=("",7788)
serSocket.bind((addr))
serSocket.listen(100)
sockets = []
def process_1(): #(6)监听客户端请求模块,利用While循环监听客户端请求
global addr #定义全局变量
print("--进程1--,--等待新客户端连接--")
print('waiting for connecting...')
while True:
clientSock, addr = serSocket.accept()
print('connected from:%s'%str(addr))
print("成功连接")
clientSock.setblocking(0)
sockets.append(clientSock)
def handleClient(): #(7)处理Client端请求模块
while True:
for newSocket in sockets:
try:
recvData = newSocket.recv(1024)
print("----线程处理请求中---")
if len(recvData) > 0:
print "recv info form client%s:%s" %(str(addr) ,str(recvData))
sendData = (recvData) # 向客户端发送收到的数据
newSocket.send(sendData) # 发送的数据
else:
return "%s客户端已经关闭" % str(addr)
except Exception as e:
continue
if __name__ == '__main__': #主函数
P1 = Process(target=handleHttp)
P1.start()
client = Thread(target=handleClient,)
client.start()
process_1()
客户端程序:
#coding=utf-8
from socket import * #导入socket模块
tcpClientSocket = socket(AF_INET,SOCK_STREAM) #创建套接字,指明socket的类型是TCP套接字
IP=("192.168.50.131") #目标主机
Port=7788 #端口号
InfoLen = 1024 #传输的最大长度
tcpClientSocket.connect((IP,Port)) #绑定IP和端口,进行数据传输
tcpClientSocket.setsockopt(SOL_SOCKET,SO_REUSEADDR,1)
def send_request():
while True:
print("---已连接服务器,发送数据中---")
try:
sendData = raw_input("客户端:")
if len(sendData)>0: #判断发送数据的长度,长度大于零,将要发送的数据进行编码
tcpClientSocket.send(str(sendData)) #向Server端发送数据
else:
print("您发送的是空数据")
continue
recvData = tcpClientSocket.recv(infoLen) #接收从Server端返回的数据
print"收到服务器数据:%s"% (str(recvData))
except Exception as error:
print(error)
print("---请求连接服务器---")
if __name__ == '__main__':
send_request()
5:测试
将该程序在Linux上运行测试,首先查看Ubuntu本机的IP,在命令行模式下输入ifconfig,查看虚拟机的IP,得到本机的IP为192.168.50.131,
首先运行服务器程序。
测试时,在Windows运行多个客户端程序,运行环境为Pycharm,在不同的客户端输入不同的数据,这时客户端显示成功连接并接收了从服务器返回的数据。服务端则打印了客户端的地址和发送的数据。
Windows仔细看图,发现ip和端口都是相同的说明都是同一台电脑发送的信息
在来开启一台进行测试,看看能否访问成功。
可以看到都能够成功访问,小编在这里就不一一测试了,不使用Linux,使用Windows也可以进行测试
下面来测试处理HTTP请求:处理HTTP请求,以浏览器作为客户端,在浏览器中输入服务器地址:192.168.131:7782,向服务器发送请求,看服务器响应情况。需要将该网页丢到你的项目文件目录下。这是小编自己写的第一个Html页面,自学Bootstrap框架写的,Bootstrap框架非常强大,有兴趣的同学可以看看中文教程
服务器处理请求的情况;
6:小结
第一次写博文,写得不好各位博友勿喷,谢谢。邮箱[email protected],希望各位网友多多指点。