python socket编程多线程_python中的多线程socket编程

我正在使用python进行客户机/服务器套接字编程。我可以设置它没有任何问题,但线程,我迷失了。我不知道如何完成那部分。我也查看了python文档,但是我找不到我所期望的。在

我要实现的是-服务器接受来自客户机的连接,并监视一个目录,以便创建任何文件。我试图同时运行这两个程序,但没有成功。在#!/usr/bin/python # This is server.py file

import socket # Import socket module

import sys,os

import time

from watchdog.observers import Observer

from watchdog.events import PatternMatchingEventHandler

class MyHandler(PatternMatchingEventHandler):

patterns = ["*.challenger", "*.challenger"]

def process(self, event):

"""

event.event_type

'modified' | 'created' | 'moved' | 'deleted'

event.is_directory

True

event.src_path

/home/abcd/Maildir/new/

"""

# the file will be processed there

print event.src_path, event.event_type # print now only for degug

def on_modified(self, event):

self.process(event)

flag = '1'

print flag

def on_created(self, event):

self.process(event)

def on_any_event(self,event):

if event.event_type == 'created':

send()

s = socket.socket() # Create a socket object

host = socket.gethostname() # Get local machine name

port = 12346 # Reserve a port for your service.

s.bind((host, port)) # Bind to the port

flag = '0'

s.listen(5) # Now wait for client connection.

while True:

c, addr = s.accept() # Establish connection with client.

print 'Got connection from', addr

# c.send('Thank you for connecting')

# c.send(flag)

if __name__ == '__main__':

args = sys.argv[1:]

observer = Observer()

observer.schedule(MyHandler(), path='/home/abcd/Maildir/new')

observer.start()

try:

while True:

time.sleep(1)

except keyboardInterrupt:

observer.stop()

observer.join()

c.send(flag)

c.close() # Close the connection

我发布的代码没有线程,因为有了线程,它根本就不起作用。在

我正在使用watchdog监视/home/zhong/Maildir/new监视创建的任何新电子邮件文件,如果创建了该文件,我希望向客户端发送已收到电子邮件的确认(在本例中为标志)。插座连接和看门狗单独工作很好,但我不知道为什么它们不能一起工作?:(

如何将这些方法放在不同的线程中以使它们并行运行?谢谢你的帮助。在

编辑:克雷格输入后的代码:

^{pr2}$

编辑2:

当我从客户机发送电子邮件到服务器时,我第一次得到正确的结果,但当我再次连接时,输出很奇怪(“In message”打印两次,标志值也打印两次,我得到断管错误)

修改服务器.py在克雷格的输入之后:import threading

import socket # Import socket module

import sys,os

import time

from watchdog.observers import Observer

from watchdog.events import PatternMatchingEventHandler

def send_message(conn, flag):

print "In message"

conn.send(flag)

print "flag"+flag

class MyHandler(PatternMatchingEventHandler):

patterns = ["*.challenger", "*.challenger"]

def __init__(self, conn, *args, **kwargs):

super(MyHandler, self).__init__(*args, **kwargs)

self.conn_list = conn

def process(self, event):

time.sleep(5)

print "In process"

print event.src_path, event.event_type # print now only for degug

def on_created(self, event):

flag = '1'

print "before process event"

self.process(event)

print "after process, before thread target"

threads = [threading.Thread(target=send_message, args=(conn, flag)) for$

flag = '0'

for t in threads:

t.start()

# print "Before process(Event)"

# self.process(event)

print "after process event"

for t in threads:

t.join()

s = socket.socket() # Create a socket object

host = socket.gethostname() # Get local machine name

port = 12345 # Reserve a port for your service.

s.bind((host, port)) # Bind to the port

flag = '0'

s.listen(5) # Now wait for client connection.

print "flag before: "+flag

from collections import deque

conn_list = deque()

if __name__ == '__main__':

observer = Observer()

observer.start()

args = sys.argv[1:]

observer.schedule(MyHandler(conn_list), path='/home/abcd/Maildir/new')

while True:

try:

c, addr = s.accept() # Establish connection with client.

print 'Got connection from', addr

flag = '0'

print flag

conn_list.append(c)

except KeyboardInterrupt:

observer.stop()

while conn_list:

conn_list.pop().close()

print "Connections closed"

break

observer.join()

输出如下:Got connection from ('72.123.27.223', 39844)

0

before process event

In process

/home/abcd/Maildir/new/1425403821.V801I2ac232cM275759.challenger created

after process, before thread target

In message

In message

flag1In message

after process event

flag1

Exception in thread Thread-7:

Traceback (most recent call last):

File "/usr/lib/python2.7/threading.py", line 810, in __bootstrap_inner

self.run()

File "/usr/lib/python2.7/threading.py", line 763, in run

self.__target(*self.__args, **self.__kwargs)

File "/home/paras/server42.py", line 11, in send_message

conn.send(flag)

error: [Errno 32] Broken pipe

这是我的客户端.py-我所要做的就是检查从客户机到服务器的电子邮件延迟时间,并从服务器获得响应。在#!/usr/bin/python # This is client.py file

import sys,smtplib

import socket # Import socket module

import threading,time

import urllib

import random

import datetime

#class myThread(threading.Thread):

# def __init__ (self,name):

# threading.Thread.__init__(self)

# self.name=name

# def run(self):

# connection()

# print "Starting"+self.name

def connection():

s = socket.socket() # Create a socket object

host = socket.gethostbyname('server.edu') # Get local machine name

port = 12345 # Reserve a port for your service.

try:

s.connect((host, port))

# print s.recv(1024)

t1 = datetime.datetime.now()

sendmail()

t2 = datetime.datetime.now()

print str(t1),str(t2)

print "Time taken to send e-mail from client to server: "+str(t2-t1)

print "came back"

flag = s.recv(1024)

print flag

if (flag=='1'):

t3=datetime.datetime.now()

print "Time taken to receive response from server: "+str(t3-t2)

s.close # Close the socket when done

except KeyboardInterrupt:

s.close

def sendmail():

fromaddr = 'xyz@gmail.com'

toaddrs = 'email@server.edu'

url = "http://www.google.com"

seq = str(random.randint(1,9))

msg = 'URL: '+ url + '\n'+'SEQ:'+seq+'\n'

print "In sendmail"

#print msg

# Credentials (if needed)

username = 'xyz@gmail.com'

password = 'somepassword'

#The actual mail send

server = smtplib.SMTP('smtp.gmail.com:587')

#server = smtplib.SMTP('localhost')

server.starttls()

server.login(username,password)

server.sendmail(fromaddr, toaddrs, msg)

server.quit()

print "email sent"

return

if __name__ == "__main__":

connection()

请帮帮我。谢谢。在

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值