Python语言 Socket 网络编程

   python 使用Socket库进行编程的原理

在阅读这篇文章之前,默认您已经学会了Python基本知识,废话不多说,自己写了一个小程序,直接上原理图和代码,希望各位网友多多指正。

1:目的

    利用socket编写客户端和服务器代码,实现多个客户端能够正常访问服务器,能够处理信息和访问Html静态网页

                                      Python语言 Socket 网络编程_第1张图片

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编程原理

                         服务器程序流程图                                                                          客户端程序流程图

     Python语言 Socket 网络编程_第2张图片                                                    Python语言 Socket 网络编程_第3张图片

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,

                                  Python语言 Socket 网络编程_第4张图片        

首先运行服务器程序。

                                  Python语言 Socket 网络编程_第5张图片

 

  测试时,在Windows运行多个客户端程序,运行环境为Pycharm,在不同的客户端输入不同的数据,这时客户端显示成功连接并接收了从服务器返回的数据。服务端则打印了客户端的地址和发送的数据。

          Python语言 Socket 网络编程_第6张图片

             Python语言 Socket 网络编程_第7张图片

 Windows仔细看图,发现ip和端口都是相同的说明都是同一台电脑发送的信息

             Python语言 Socket 网络编程_第8张图片

    在来开启一台进行测试,看看能否访问成功。

                                  Python语言 Socket 网络编程_第9张图片

    可以看到都能够成功访问,小编在这里就不一一测试了,不使用Linux,使用Windows也可以进行测试

    下面来测试处理HTTP请求:处理HTTP请求,以浏览器作为客户端,在浏览器中输入服务器地址:192.168.131:7782,向服务器发送请求,看服务器响应情况。需要将该网页丢到你的项目文件目录下。这是小编自己写的第一个Html页面,自学Bootstrap框架写的,Bootstrap框架非常强大,有兴趣的同学可以看看中文教程

            Python语言 Socket 网络编程_第10张图片

    服务器处理请求的情况;

          Python语言 Socket 网络编程_第11张图片

6:小结

        第一次写博文,写得不好各位博友勿喷,谢谢。邮箱[email protected],希望各位网友多多指点。

你可能感兴趣的:(Python语言 Socket 网络编程)