PDA

View Full Version : مشکل در چت با شبکه



hirad000
پنج شنبه 06 فروردین 1394, 00:59 صبح
سلام دوستان .
من این کرد رو هم تو لینوکس اجرا کردم هم تو ویندوز .جفتش ارور داده. تو لینوکس کانکت نمیشد. تو ویندوز هم در سمت کلاینت فقط خط اول اجرا میشه و از برنامه خارج میشه.
اگ میشه مشکلش بگید.
مرسی


# telnet program exampleimport 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()

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()


# Tcp Chat server
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()

arman54
پنج شنبه 06 فروردین 1394, 10:36 صبح
توي قسمت اول sys.exit() رو پاك كن

hirad000
جمعه 07 فروردین 1394, 22:39 عصر
توي قسمت اول sys.exit() رو پاك كن

نمیشه : IndexError: list index out of range
نباید پاک بشه .
شما همین رو اجرا کردید، اجرا شد؟

n.nowroozi
شنبه 08 فروردین 1394, 09:56 صبح
نمیدونم چرا انقدر خودت رو عذاب میدی! ماژول سوکت خیلی ابتدایی هست و باید برای اینکارها از فریم ورک استفاده کنی خیلی کارت راحتتر میشه.. مثلا میتونی مثال سرور کلاینت ساده با توییستد رو اینجا (http://www.pyhome.ir/weblog/2014/02/07/twisted_echo_server/) ببینی

arman54
شنبه 08 فروردین 1394, 12:19 عصر
سلام....
اول فايل كلاينتت اول بايد socket, select, string, sys را import كني.
بعدش sys.exit() رو پاك كن.
توي cmd به مسيري كه فايلات رو ذخيره كردي برو و دستور زير رو بزن:
client.py 127.0.0.1 5000

(البته قبلش بايد سرورشو راه انداخته باشي)
كلاينت كانكت ميشه فقط توي كلاينت اونجايي كه از دستور select استفاده كردي يه خطايي وجود داره كه حالا يا از خيرش بگذر و پاكش كن يا دستور درستشو بزن

hirad000
شنبه 08 فروردین 1394, 15:19 عصر
نمیدونم چرا انقدر خودت رو عذاب میدی! ماژول سوکت خیلی ابتدایی هست و باید برای اینکارها از فریم ورک استفاده کنی خیلی کارت راحتتر میشه.. مثلا میتونی مثال سرور کلاینت ساده با توییستد رو اینجا (http://www.pyhome.ir/weblog/2014/02/07/twisted_echo_server/) ببینی

اخه twisted خیلی سخته.برای ی برنامه ی ساده چقدر ابجکت نوشته. یعنی میگید برای برنامه های بزرگ سوکت مناسب نیست؟ کلا برم سمت کتابخونه twisted ?

n.nowroozi
شنبه 08 فروردین 1394, 23:50 عصر
اخه twisted خیلی سخته.برای ی برنامه ی ساده چقدر ابجکت نوشته. یعنی میگید برای برنامه های بزرگ سوکت مناسب نیست؟ کلا برم سمت کتابخونه twisted ?

همین چندتارو متوجه بشی اصلش همیناست.. صد در صد فریم ورک برای کار بهتره .. شاید اولش به نظرت سخت بیاد ولی بعد انقدر کارهات راحت هندل میشه که فکرش نمیکنی!
در نظر بگیر که واسه وب نیای مثلا از فریم ورکی مثل جنگو استفاده کنی و همه رو دستی بنویسی خیلی ازت وقت میگیره..