Python Socket,How to Create Socket Server? - 网络编程实例

文章出自:Python socket – network programming tutorial by Silver Moon

原创译文,如有版权问题请联系删除。

Network programing in Python:

Part2: Programing sockets servers.

在所有的通信实例中,都分为Client 和Server. 其中:Client是请求的发起点,Server是使用Socket接收传入的值并且提供返回数据。

  Server的职能如下:

  1>.创建/打开一个socket

  2>.绑定IP地址(端口) (Bind IP with port)

  3>.监听请求的连接(Listen for incoming conecting)

  4>.同意连接(Accpect connecting)

  5>.读取/发送

  OK,到此,我们明白了server要做什么和怎么做(上面所描述的代码执行的顺序也是不能随意修改的)。在上一节点Part1中,我们已经掌握如何创建和打开一个socket,

接下来我们就要学习如何绑定和监听。

  Bind a socket:  

#!/usr/bin/python
import socket   #for sockets
import sys  #for exit

HOST = ‘‘   #HOST name or IP address
PORT = 7001             #remote port

s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
print (‘Socket created‘)

try:
    s.bind((HOST,PORT))
except socket.error as msg:
    print (‘Bind failed. Error Code : ‘ + str(msg[0]) + ‘ Message ‘ + msg[1])
    sys.exit()
print (‘Socket bind complete‘)

  现在,利用IP地址和端口的绑定已经完成了,在绑定之前,你必须确保所有的请求方的数据能够通过这个端口被访问,接下来开始监听连接,当然不排除多个不同的程序监听同一个端口的情况。(如何处理这样的情况??!)

  Listen for incoming connections:

  成功绑定之后,要监听这个连接,方法:socket_listen用来监听,只需要在bind()成功后加上如下代码即可:  

#listen connecting
s.listen(10) #why we input 10, you can read manual about listen function
print(‘Socket now listening‘)

  Accept connection:

  方法: socket_accpect用来接收请求。  

#!/usr/bin/python
import socket   #for sockets
import sys  #for exit

HOST = ‘‘   #HOST name or IP address
PORT = 7001             #remote port

s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
print (‘Socket created‘)

#bind ip/port
try:
    s.bind((HOST,PORT))
except socket.error as msg:
    print (‘Bind failed. Error Code : ‘ + str(msg[0]) + ‘ Message ‘ + msg[1])
    sys.exit()

print (‘Socket bind complete‘)

#listen connecting
s.listen(10)
print(‘Socket now listening‘)

#wait to accept a connection - blocking call
conn, addr = s.accept()

#display client information
print (‘Connected with ‘ + addr[0] + ‘:‘ + str(addr[1]))

  结果输出:

  

  现在程序已经开始等待请求数据从port 7001, 不要关闭程序,让它保持运行,我们看看会得到什么...

  Receving/send Data:  

#!/usr/bin/python
import socket   #for sockets
import sys  #for exit

HOST = ‘‘   #HOST name or IP address
PORT = 7001             #remote port

s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
print (‘Socket created‘)

#bind ip/port
try:
    s.bind((HOST,PORT))
except socket.error as msg:
    print (‘Bind failed. Error Code : ‘ + str(msg[0]) + ‘ Message ‘ + msg[1])
    sys.exit()

print (‘Socket bind complete‘)

#listen connecting
s.listen(10)
print(‘Socket now listening‘)

#wait to accept a connection - blocking call
conn, addr = s.accept()

#display client information
print (‘Connected with ‘ + addr[0] + ‘:‘ + str(addr[1]))

#now keep talking with the client
data = conn.recv(1024)
print(data)
conn.sendall(data)

#close and dispoiled socket
conn.close()
s.close()

  然后连接到这台server,需要注意的是如果防火墙开启,要注意设置的端口是否可以安全访问。如果答案是肯定的,你将看到:

  

  现在我们已经完成了一个绑定/监听/同意请求的一个完整连接,但是你会发现,在代码执行完成并返回‘Hello‘后会退出,这样的设计是效率非常低下的,实际上我们的很多逻辑是在接收完成数据后才执行的。

  在现实使用的应用场景中,我们的server需要的是 Keep running non-stop, 有一种方法就是将Accpect()方法放在循环中,这样的话它将会一直接收客户端发来的请求。  

  Live Server:

  顾名思义,一直运行(监听客户端请求并同意处理请求)。  

#!/usr/bin/python
import socket   #for sockets
import sys  #for exit

HOST = ‘‘   #HOST name or IP address
PORT = 7001             #remote port

s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
print (‘Socket created‘)

#bind ip/port
try:
    s.bind((HOST,PORT))
except socket.error as msg:
    print (‘Bind failed. Error Code : ‘ + str(msg[0]) + ‘ Message ‘ + msg[1])
    sys.exit()

print (‘Socket bind complete‘)

#listen connecting
s.listen(10)
print(‘Socket now listening‘)

#simple way as server
#-------------------------------------------------------
#wait to accept a connection - blocking call
#conn, addr = s.accept()

##display client information
#print (‘Connected with ‘ + addr[0] + ‘:‘ + str(addr[1]))

##now keep talking with the client
#data = conn.recv(1024)
#-------------------------------------------------------

#liver server, always running
#-------------------------------------------------------
#now keep talking with the client
while 1:
    #wait to accept a connection - blocking call
    conn, addr = s.accept()
    print (‘Connected with ‘ + addr[0] + ‘:‘ + str(addr[1]))
    data = conn.recv(1024)
    #reply = ‘OK...‘ + data
    if not data:
        break

    conn.sendall(data)
    print(data)
#-------------------------------------------------------
#close and dispoiled socket
conn.close()
s.close()

  输出结果:

  server:

  

  client:

  

  到目前为止,我们做的不错,但是这个不是一个有效的网络通信实例,server端的代码在一个循环中同意client的请求并回应给他们,然后并没有针对接收到的请求的数据做任何的处理,同时它也没有能力处理同一时间的多个请求,现在我们就来处理这个问题。

  Handling Connections:

  想要处理每个请求连接,我们需要一个独立的代码处理逻辑和一台独立的服务器,有一种办法就是使用多线程,主服务器同意请求然后创建一个线程去管理这个请求,然后服务器返回在继续处理其他请求。  

#!/usr/bin/python
import socket   #for sockets
import sys  #for exit
import threading
# from thread  import *

HOST = ‘‘   #HOST name or IP address
PORT = 7001             #remote port

s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
print (‘Socket created‘)

#bind ip/port
try:
    s.bind((HOST,PORT))
except socket.error as msg:
    print (‘Bind failed. Error Code : ‘ + str(msg[0]) + ‘ Message ‘ + msg[1])
    sys.exit()

print (‘Socket bind complete‘)

#listen connecting
s.listen(10)
print(‘Socket now listening‘)

#simple way as server
#-------------------------------------------------------
#wait to accept a connection - blocking call
#conn, addr = s.accept()

##display client information
#print (‘Connected with ‘ + addr[0] + ‘:‘ + str(addr[1]))

##now keep talking with the client
#data = conn.recv(1024)
#-------------------------------------------------------

#liver server, always running
#-------------------------------------------------------
#now keep talking with the client
#while 1:
#    #wait to accept a connection - blocking call
#    conn, addr = s.accept()
#    print (‘Connected with ‘ + addr[0] + ‘:‘ + str(addr[1]))
#    data = conn.recv(1024)
#    #reply = ‘OK...‘ + data
#    if not data:
#        break

#    conn.sendall(data)
#    print(data)
##------------------------------------------------------- 

#Function for handling connections. This will be used to create threads
def clientthread(conn):
    #Sending message to connected client
    conn.send(‘Welcome to the server. Type something and hit enter\n‘) #send only takes string

    #infinite loop so that function do not terminate and thread do not end.
    while True:

        #Receiving from client
        data = conn.recv(1024)
        reply = ‘OK...‘ + data
        if not data:
            break

        conn.sendall(reply)

    #came out of loop
    conn.close()

#now keep talking with the client
while 1:
    #wait to accept a connection - blocking call
    conn, addr = s.accept()
    print (‘Connected with ‘ + addr[0] + ‘:‘ + str(addr[1]))

    #start new thread takes 1st argument as a function name to be run, second is the tuple of arguments to the function.
    #start_new_thread(clientthread ,(conn,))  threading._start_new_thread(clientthread ,(conn,))

#close and dispoiled socket
conn.close()
s.close()

  输出结果:

  server:

  

  Client:

  

  So,现在我们拥有了一个server,它是一个很棒的学你说话的机器人,HAHA

  Conclusion:

  截至目前,我相信你已经掌握了在Python中基础的socket网络编程,你可以尝试创建其他的社交客户端或与其相近的实例。至此,放学。不会再讲5分钟。

  Bug fix:

  开发环境: Python3.4 + ptvs

  以上代码均已通过测试,当然不排除Python版本不一样的情况,实际上我也在原作者的基础上修改了很多,如果有bug的话,欢迎指正。  

时间: 2024-08-07 08:40:37

Python Socket,How to Create Socket Server? - 网络编程实例的相关文章

C# Socket网络编程实例

本文实例讲述了C# Socket网络编程技巧.分享给大家供大家参考.具体分析如下: 客户端要连接服务器:首先要知道服务器的IP地址.而服务器里有很多的应用程序,每一个应用程序对应一个端口号 所以客户端想要与服务器中的某个应用程序进行通信就必须要知道那个应用程序的所在服务器的IP地址,及应用程序所对应的端口号 TCP协议: 安全稳定,一般不会发生数据丢失,但是效率低.利用TCP发生数据一般经过3次握手(所有效率低,自己百度三次握手) UDP协议: 快速,效率高,但是不稳定,容易发生数据丢失(没有经

Python全栈开发之10、网络编程

网络编程就是如何在程序中实现两台计算机的通信,而两台计算机间的通信其实就是两个进程间的通信,进程间的通信主要通过socket(套接字)来描述ip地址(主机)和端口(进程)来实现的,因此我们学习网络编程,必须学习socket 一.socket socket模块是针对 服务器端 和 客户端Socket 进行[打开][读写][关闭],一个完整的套接字模型图如下图所示 在python中读写操作调用的函数有些不一样,下面我们来看一下一个完整的socket(TCP)在服务端和客户端的实现 # server.

python基础--面向对象高级、异常处理、网络编程

一.面向对象高级 1.接口与归一化设计 接口只是定义了一些方法,而没有去实现,多用于程序设计时,只是设计需要有什么样的功能,但是并没有实现任何功能,这些功能需要被另一个类(B)继承后,由 类B去实现其中的某个功能或全部功能. 在python中接口由抽象类和抽象方法去实现,接口是不能被实例化的,只能被别的类继承去实现相应的功能 归一化让使用者无需关心对象的类是什么,只需要知道这些对象都具备某些功能就可以了,这极大地降低了使用者的使用难度. 归一化使得高层的外部使用者可以不加区分的处理所有接口兼容的

python学习【第十一篇】网络编程

一.socket的简介 socket(简称:套接字)进程间通信的一种方式,它与其他进程间通信的一个主要不同是:能实现不同主机间的进程间通信,我们网络上各种各样的服务大多都是基于 Socket 来完成通信的,如qq聊天.微信聊天等. 二.socke的基本使用 在python中使用socket模块就可以创建套接字: import socket socket.socket(AddressFamily, Type) 函数说明: Address Family:可以选择 AF_INET(用于 Interne

Python之操作Excel、异常处理、网络编程

知识补充: 1.falsk模块中一些方法总结 import flask from flask import request,jsonify server = flask.Flask(__name__) #把当前文件当作一个服务 server.config['JSON_AS_ASCII'] = False #不以ASCII码传 @server.route('/reg',methods=['post','get']) #接口方法前的修饰 methods有两个值:post和get jsonify({"

Java学习之网络编程实例

转自:http://www.cnblogs.com/springcsc/archive/2009/12/03/1616413.html 多谢分享 网络编程 网络编程对于很多的初学者来说,都是很向往的一种编程技能,但是很多的初学者却因为很长一段时间无法进入网络编程的大门而放弃了对于该部分技术的学习. 在学习网络编程以前,很多初学者可能觉得网络编程是比较复杂的系统工程,需要了解很多和网络相关的基础知识,其实这些都不是很必需的.首先来问一个问题:你 会打手机吗?很多人可能说肯定会啊,不就是按按电话号码

linux网络编程实例

获取服务器时间 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <netdb.h> #

C语言Socket网络编程实例

转自:http://www.cnblogs.com/huxc/p/4272940.html 服务端: #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <winsock2.h> #pragma comment (lib, "ws2_32.lib") /* TCP服务端 */ int main(void) { int len = 0; WSADATA wd; int ret = 0; SOCKE

python学习笔记(十一):网络编程

一.python操作网络,也就是打开一个网站,或者请求一个http接口,使用urllib模块. urllib模块是一个标准模块,直接import urllib即可,在python3里面只有urllib模块,在python2里面有urllib模块和urllib2模块. import json from urllib import request from urllib import parse pay_url = 'http://szz.nnzhp.cn/pay' balance_url = 'h