PDA

View Full Version : سوکت نویسی در پایتون



hirad000
پنج شنبه 07 اسفند 1393, 22:29 عصر
سلام دوستان
میخوام ی برنامه ای بنویسم که وقتی اطلاعات از کلاینت به سرور میره یا برعکس اطلاعات هش بشه مثلا با base64 .میخوام که متن از کاربر گرفته بشه.

import socket
host='localhost'
port=1891
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.bind((host,port))
s.listen(1)
conn,addr=s.accept()
print addr
while 1:
data=conn.recv(1024)
if not data:break
conn.send(data)
conn.close()



import socket
host='localhost'
port=1891
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.bind((host,port))
s.listen(1)
conn,addr=s.accept()
print addr
while 1:
data=conn.recv(1024)
if not data:break
conn.send(data)
conn.close()

اگه این کد کامل نمیکیند حداقل بگید از چه منبعی سوکت در پایتون یادبگیرم . برای پروژم نیاز دارم.

n.nowroozi
شنبه 09 اسفند 1393, 08:37 صبح
از فریم ورک twisted استفاده کن.. اگه هم از ساکت معمولی میخوای استفاده کنی کافیه متنی که از کاربر میگری رو base64 کنی و اونور متنی که میاد رو decode کنی..

hirad000
شنبه 09 اسفند 1393, 09:47 صبح
از فریم ورک twisted استفاده کن.. اگه هم از ساکت معمولی میخوای استفاده کنی کافیه متنی که از کاربر میگری رو base64 کنی و اونور متنی که میاد رو decode کنی..

مشکلم اینه که متنی که از کلاینت میفرستم به سرور تو سمت سرور نمیره . یعنی وقتی ران میکنم متنی که سمت کلاینت مینوسیم تو سمت سرور نوشته نمیشه.یعنی ارسال نمیشه که بخوام رمز کنم.اینو چکار کنم.

n.nowroozi
یک شنبه 10 اسفند 1393, 07:51 صبح
والا من تاحالا قسمت نشده با این کتابخونه socket که شما استفاده کردی کار کنم.. ولی خب یه راه باگ یابیش اینه که به جای کلاینت telnet معمولی بزنی به اون پرت که بفهمی سرورت داره درست کار میکنه یا نه.. اگه درست کار میکرد که میفهمی مشکل از سمت کلاینتت هست.

arman54
سه شنبه 12 اسفند 1393, 07:43 صبح
دوست عزيز دستوراتي كه بالا زديد فقط مربوط به سرور ميشه ... سمت كلاينتش رو هم بذار

hirad000
چهارشنبه 13 اسفند 1393, 00:01 صبح
دوست عزيز دستوراتي كه بالا زديد فقط مربوط به سرور ميشه ... سمت كلاينتش رو هم بذار

ببخشید حواسم نبود.
اینم کدش:

from socket import *

HOST = 'localhost'
PORT = 28812
BUFSIZE = 1024
ADDR = (HOST, PORT)
tcpTimeClientSock = socket(AF_INET, SOCK_STREAM)
tcpTimeClientSock.connect(ADDR)
while True:
data = raw_input('> ')
if not data:
break
tcpTimeClientSock.send(data)
data = tcpTimeClientSock.recv(BUFSIZE)
if not data:
break
print data
tcpTimeClientSock.close()


from socket import *from time import ctime
HOST = 'localhost'
PORT = 28812
BUFSIZE = 1024


ADDR = (HOST, PORT)


tcpTimeSrvrSock = socket(AF_INET,SOCK_STREAM)
tcpTimeSrvrSock.bind(ADDR)
tcpTimeSrvrSock.listen(50)


while True:
print 'waiting for connection...'
tcpTimeClientSock, addr = tcpTimeSrvrSock.accept()
print '...connected from:', addr


while True:
data = tcpTimeClientSock.recv(BUFSIZE)
print(data)
if not data:
break
tcpTimeClientSock.send('[%s] %s' % (ctime(), data))

tcpTimeClientSock.close()
tcpTimeSrvrSock.close()

arman54
پنج شنبه 14 اسفند 1393, 08:01 صبح
هم توي سرور و هم كلاينت بايد ADDR رو بصورت زير تعريف كني:


ADDR=((HOST,PORT))
2تا پرانتز تودرتو ميخواد

hirad000
پنج شنبه 14 اسفند 1393, 14:44 عصر
هم توي سرور و هم كلاينت بايد ADDR رو بصورت زير تعريف كني:


ADDR=((HOST,PORT))
2تا پرانتز تودرتو ميخواد

مرسی داداش درست شد

hirad000
یک شنبه 17 اسفند 1393, 19:00 عصر
سلام
خواستم ی چت دوطرفه برقرار کنم .تواین دو تاکد سرور اجرا میشه منتظر کلاینت میمونه ولی کلاینت فقط خط اول رو چاپ میکنه و از برنامه خارج میشه. چرا؟ مگه بعد از sys.exit نباید وارد ادامه برنامه بشه؟


import socket, select, string, sys
def prompt() :
sys.stdout.write('<You> ')
sys.stdout.flush()

#main function
if __name__ == "__main__":

if(len(sys.argv) < 3) :
print 'Usage : python telnet.py hostname port'
sys.exit(0)

host = sys.argv[1]
port = int(sys.argv[2])

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.settimeout(2)

# connect to remote host
try :
s.connect((host, port))
except :
print 'Unable to connect'
sys.exit()

print 'Connected to remote host. Start sending messages'
prompt()

while 1:
socket_list = [sys.stdin, s]

# Get the list sockets which are readable
read_sockets, write_sockets, error_sockets = select.select(socket_list , [], [])

for sock in read_sockets:
#incoming message from remote server
if sock == s:
data = sock.recv(4096)
if not data :
print '\nDisconnected from chat server'
sys.exit()
else :
#print data
sys.stdout.write(data)
prompt()

#user entered a message
else :
msg = sys.stdin.readline()
s.send(msg)
prompt()





import socket, select
#Function to broadcast chat messages to all connected clients
def broadcast_data (sock, message):
#Do not send the message to master socket and the client who has send us the message
for socket in CONNECTION_LIST:
if socket != server_socket and socket != sock :
try :
socket.send(message)
except :
# broken socket connection may be, chat client pressed ctrl+c for example
socket.close()
CONNECTION_LIST.remove(socket)

if __name__ == "__main__":

# List to keep track of socket descriptors
CONNECTION_LIST = []
RECV_BUFFER = 4096 # Advisable to keep it as an exponent of 2
PORT = 5000

server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# this has no effect, why ?
server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
server_socket.bind(("0.0.0.0", PORT))
server_socket.listen(10)

# Add server socket to the list of readable connections
CONNECTION_LIST.append(server_socket)

print "Chat server started on port " + str(PORT)

while 1:
# Get the list sockets which are ready to be read through select
read_sockets,write_sockets,error_sockets = select.select(CONNECTION_LIST,[],[])

for sock in read_sockets:
#New connection
if sock == server_socket:
# Handle the case in which there is a new connection recieved through server_socket
sockfd, addr = server_socket.accept()
CONNECTION_LIST.append(sockfd)
print "Client (%s, %s) connected" % addr

broadcast_data(sockfd, "[%s:%s] entered room\n" % addr)

#Some incoming message from a client
else:
# Data recieved from client, process it
try:
#In Windows, sometimes when a TCP program closes abruptly,
# a "Connection reset by peer" exception will be thrown
data = sock.recv(RECV_BUFFER)
if data:
broadcast_data(sock, "\r" + '<' + str(sock.getpeername()) + '> ' + data)

except:
broadcast_data(sock, "Client (%s, %s) is offline" % addr)
print "Client (%s, %s) is offline" % addr
sock.close()
CONNECTION_LIST.remove(sock)
continue

server_socket.close()

hirad000
پنج شنبه 21 اسفند 1393, 22:29 عصر
سمت کلاینت وقتی اجرا میکنم فقط خط اول رو چاپ میکنه و از برنامه خارج میشه.
وقتی همینو با cmd اجرا میکنم از خط 34 ایراد میگیره. چرا؟

arin1365
دوشنبه 25 اسفند 1393, 01:36 صبح
مرسی. اموزنده بود.

hirad000
دوشنبه 25 اسفند 1393, 10:33 صبح
مرسی. اموزنده بود.


مشکل ما که حل نشده..
حل بشه ، اموزنده تر میشه.

arman54
دوشنبه 25 اسفند 1393, 12:51 عصر
سمت کلاینت وقتی اجرا میکنم فقط خط اول رو چاپ میکنه و از برنامه خارج میشه.
وقتی همینو با cmd اجرا میکنم از خط 34 ایراد میگیره. چرا؟

بعد از exit از برنامه خارج ميشه.
توي كد اول خط33 اونجايي كه از select استفاده كردي با اين دستور ميخاي چيكار كني؟

hirad000
چهارشنبه 27 اسفند 1393, 15:27 عصر
بعد از exit از برنامه خارج ميشه.
توي كد اول خط33 اونجايي كه از select استفاده كردي با اين دستور ميخاي چيكار كني؟

لیست کلاینت هایی که متصل شدند.
وقتی خط 11 اجرا میشه برنامه بسته میشه. خط 10 چاپ میشه و بعدش از برنامه میادبیرون.

arman54
پنج شنبه 28 اسفند 1393, 08:21 صبح
چون از sys.exit استفاده كردي برنامت بسته ميشه

hirad000
پنج شنبه 28 اسفند 1393, 12:23 عصر
چون از sys.exit استفاده كردي برنامت بسته ميشه

خب اینکه باید باشه ، همینو تو ی برنامه ی دیگ استفاده کردم جواب داد. منظورم sys.exit .. نمیدونم مشکلش چیه. این باید باشه چون ip و پورت رو کلاینت وارد کنه.

دوستان اگه می تونن کمک کنن
ممنون میشم