码迷,mamicode.com
首页 > 编程语言 > 详细

Python实现socket通信

时间:2015-02-11 02:05:16      阅读:181      评论:0      收藏:0      [点我收藏+]

标签:python socket

介绍

本文介绍如何用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 = False
test.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和网络” 博客,谢绝转载!

Python实现socket通信

标签:python socket

原文地址:http://haohaozhang.blog.51cto.com/9176600/1613453

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!