# زبان های اسکریپتی > Python >  سوکت نویسی در پایتون

## hirad000

سلام دوستان
میخوام ی برنامه ای بنویسم که وقتی اطلاعات از کلاینت به سرور میره یا برعکس اطلاعات هش بشه مثلا با 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

از فریم ورک twisted استفاده کن.. اگه هم از ساکت معمولی میخوای استفاده کنی کافیه متنی که از کاربر میگری رو base64 کنی و اونور متنی که میاد رو decode کنی..

----------


## hirad000

> از فریم ورک twisted استفاده کن.. اگه هم از ساکت معمولی میخوای استفاده کنی کافیه متنی که از کاربر میگری رو base64 کنی و اونور متنی که میاد رو decode کنی..


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

----------


## n.nowroozi

والا من تاحالا قسمت نشده با این کتابخونه socket که شما استفاده کردی کار کنم.. ولی خب یه راه باگ یابیش اینه که به جای کلاینت telnet معمولی بزنی به اون پرت که بفهمی سرورت داره درست کار میکنه یا نه.. اگه درست کار میکرد که میفهمی مشکل از سمت کلاینتت هست.

----------


## arman54

دوست عزيز دستوراتي كه بالا زديد فقط مربوط به سرور ميشه ... سمت كلاينتش رو هم بذار

----------


## hirad000

> دوست عزيز دستوراتي كه بالا زديد فقط مربوط به سرور ميشه ... سمت كلاينتش رو هم بذار


ببخشید حواسم نبود.
اینم کدش:
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

هم توي سرور و هم كلاينت بايد ADDR رو بصورت زير تعريف كني:

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

----------


## hirad000

> هم توي سرور و هم كلاينت بايد ADDR رو بصورت زير تعريف كني:
> 
> ADDR=((HOST,PORT))2تا پرانتز تودرتو ميخواد


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

----------


## hirad000

سلام
خواستم ی چت دوطرفه برقرار کنم .تواین دو تاکد سرور اجرا میشه منتظر کلاینت میمونه ولی کلاینت فقط خط اول رو چاپ میکنه و از برنامه خارج میشه. چرا؟ مگه بعد از 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

سمت کلاینت وقتی اجرا میکنم فقط خط اول رو چاپ میکنه و از برنامه خارج میشه.
وقتی همینو با cmd اجرا میکنم از خط 34 ایراد میگیره. چرا؟

----------


## arin1365

مرسی. اموزنده بود.

----------


## hirad000

> مرسی. اموزنده بود.



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

----------


## arman54

> سمت کلاینت وقتی اجرا میکنم فقط خط اول رو چاپ میکنه و از برنامه خارج میشه.
> وقتی همینو با cmd اجرا میکنم از خط 34 ایراد میگیره. چرا؟


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

----------


## hirad000

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


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

----------


## arman54

چون از sys.exit استفاده كردي برنامت بسته ميشه

----------


## hirad000

> چون از sys.exit استفاده كردي برنامت بسته ميشه


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

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

----------

