介绍
本文介绍如何用python脚本实现socket通信,在一台服务器上开一个端口监听,其他机器通过telnet连进来,模仿B/S模式进行通信。
正文
一共两个文件。
webserver.py
import socket import re import os PORT = 8080 # Create a Server Socket serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) serversocket.bind((‘0.0.0.0‘, PORT)) serversocket.listen(5) # Open socket for listening, max of 5 connections # Take a request "string" def process_request(reqdata): request_headers = {} # Loop through each line and record the request headers for line in reqdata.split("\r\n"): # If the line contains a colon, it‘s a header if (line.find(‘:‘) != -1): (key, value) = line.split(": ", 1) request_headers[key] = value # Maybe it‘s a GET request... elif (line.find("GET") != -1): location = re.findall(r‘^GET (.*) HTTP/.*‘, line) if len(location): request_headers[‘GET‘] = location[0] return request_headers # Get a response def process_response(request): r = "HTTP/1.0 200 OK\n" r += "Content-type: text/html\n\n" url = request.get(‘GET‘, ‘/index.html‘) r += "You‘re running: %s<br/>\n" % request.get(‘User-Agent‘, ‘unknown‘) r += "You asked for: %s<br/>\n" % url if os.path.isfile("." + url): r += "Here it is: \n" f = open("." + url) r += f.read() return r while True: print "Server listening on port: ", PORT connection, address = serversocket.accept() running = True data = "" while running: buf = connection.recv(1024) requestdone = False if len(buf) > 0: data += buf if buf.find("\r\n") != -1: requestdone = True print "End of request found!" else: print "read: ‘%s‘" % buf if requestdone: # Data should now contain a string of the entire request request = process_request(data) connection.send(process_response(request)); # Disconnect our client connection.close() running = False else: running = Falsetest.html
<html> <head> <title>Mooo</title> </head> <body> <h1>Sample file</h1> <p>It has some stuff in it. Maybe even some lists.</p> <ul> <li>Item 1</li> <li>Item 2</li> <li>Item 3</li> <li>Item 4</li> </ul> </body> </html>
测试
a. 在服务端运行:python webserver.py
[hadoop@hadoop-zookeeper1-503500 socket_lesson]$ python webserver.py
Server listening on port: 8080
End of request found!
Server listening on port: 8080
b. 在另外一台机器上执行:telnet $IP 8080
[hadoop@hadoopslave3 ~]$ telnet 10.9.214.167 8080 Trying 10.9.214.167... telnet: connect to address 10.9.214.167: Connection refused [hadoop@hadoopslave3 ~]$ telnet 10.9.214.167 8080 Trying 10.9.214.167... Connected to 10.9.214.167. Escape character is ‘^]‘. GET /test.html HTTP/1.1 HTTP/1.0 200 OK Content-type: text/html You‘re running: unknown<br/> You asked for: /test.html<br/> Here it is: <html> <head> <title>Mooo</title> </head> <body> <h1>Sample file</h1> <p>It has some stuff in it. Maybe even some lists.</p> <ul> <li>Item 1</li> <li>Item 2</li> <li>Item 3</li> <li>Item 4</li> </ul> </body> </html> Connection closed by foreign host.
c. 然后输入:GET /test.html HTTP/1.1
这时服务端会把test.html的内容返回。
本文出自 “Linux和网络” 博客,谢绝转载!
原文地址:http://haohaozhang.blog.51cto.com/9176600/1613453