如何在客户端和服务器之间进行通信

时间:2016-06-16 06:46:46

标签: python django sockets

我想在连接到服务器后立即收到客户端的mac地址。为此,我尝试过套接字但服务器不会运行,除非我设置超时。我希望一直运行套接字,以便每当它到达服务器时我都可以从客户端接收数据。 基本上我有一个Wi-Fi设置,并希望使用连接到我的Wi-Fi网络的mac地址记录客户端。有没有其他方法可以将他们的mac地址与ssh区分开来。 我的view.py文件如下,如果有错误请通知。

from django.shortcuts import render

import os
# Create your views here.
#from django.http import HttpResponse
from django.shortcuts import render, get_object_or_404
#import socket, sys

import pickle
import socket

TCP_IP = '127.0.0.1'
TCP_PORT = 5005
BUFFER_SIZE = 1024

s = socket.socket ( socket.AF_INET, socket.SOCK_STREAM )
s.bind((TCP_IP, TCP_PORT))
s.listen(1)
s.settimeout(3)
try:
    conn, addr = s.accept()
    objrcv = pickle.loads ( conn.recv ( 1024 ) )
    ip = objrcv[0]
    mac = objrcv[1]
except:
    print "Can't connect"

def student_detail(request):
    queryset = attendance.objects.filter(mac=mac)
    context ={
        "object_list":queryset,
        "title": "Attendance",

    }
    return render(request, "attendance.html", context)  

1 个答案:

答案 0 :(得分:1)

你知道'连接客户端的IP地址。因此,您可以使用此信息获取更多信息,例如与arp -n

# your_app/views.py
import re
from subprocess import Popen, PIPE
from django.shortcuts import render

def mac(request):

    x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR')
    if x_forwarded_for:
        ip = x_forwarded_for.split(',')[0]
    else:
        ip = request.META.get('REMOTE_ADDR')

    proc = Popen(["arp", "-n", ip], stdout=PIPE)
    out = proc.communicate()[0]
    mac = re.search(r"(([a-f\d]{1,2}\:){5}[a-f\d]{1,2})", out).groups()[0]

    return render(request, 'mac.html', {'mac': mac})

现金:

注意:

arp -n仅提供“已知”的结果。条目(arp -a)。在这种情况下,它正在工作,因为客户端请求在 arp查找之前发生