Need help with a script - TechSaavy - 12-11-2012
Hello!
I have been sitting on a script for a multi-thread server for a while.
I have no idea how to change the bold bit of code, co it will work.
The script is taken from a tutorial, bu the tutorial was not completely working.
The highlighted part is the one that does not work. Server starts up normally, but when I try connecting, it does not work ![Sad Sad](https://sinister.ly/images/smilies/set/sad.png)
Any ideas what I should do?
I know that the client_thread is not defined anywhere, but I have no idea what to put instead. I am on Python 3.2
Code: import socket
import threading
import _thread
print('Starting server...')
print('Setting up details...')
HOST = 'localhost'
PORT = 8050
BUFSIZ = 1024
ADDR = (HOST, PORT)
print('Setting up listener...')
serversock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
serversock.bind(ADDR)
serversock.listen(2)
while 1:
print('Done! Waiting for connections...')
clientsocket = serversock.accept()
print('Connected from', clientsocket)
[u][b] ct = client_thread(clientsocket)[/b][/u]
ct.run()
print('Closing Thread')
serversock.close()
Any help would be appreciated. Thank you
RE: Need help with a script - 3SidedSquare - 12-18-2012
Threads require a target, in this case, you have no defenition for clientsocket, furthermore, looks like there are some bad programming practices in general here...
Code: from socket import socket, AF_INET, SOCK_STREAM #importing only certain methods or classes makes your program more memory efficient.
from threading import Thread #also not sure what _thread is....
print("Details n' shit...")
HOST = '' #localhost and '' should do the same thing
PORT = 8050
BUFFER_SIZE = 1024 #standard convention for constants is to use the whole name
ADDRESS = (HOST,PORT)
print("wait for connection, and do something with it")
sock = socket(AF_INET, SOCK_STREAM) #if you imported these, you don't need to say socket.___
sock.bind(ADDRESS)
print("Done with setup")
sock.listen(1) #1, 2 what does it matter...
def handelConnection(conn, addr): #Do whatever the connection is supposed to do here
conn.send(b"Hello, dear sir!") #The b' means bytes, sockets can only send bytes in and out
conn.close() #I'm handeling closeing the connection here, because it would be easier then setting up a lock or join for the thread
while(True):
#Why are you printing here?! you'll get spammed with prints! print up there ^^^
conn, addr = sock.accept()
thread = Thread(target=handelConnection, args=(conn, addr)) #Since I'm going to assume you know threads, but not python, here we go
#Threads need a target, a method to run when their start() gets called, if the method requires parameters, the args parameter takes a
#tuple to pass onto the method.
thread.start() #actually starts the thread, the thread should handle closing itself on it's own.
print("Holy shit, since when did true become false?")
Typed up on the fly, not tested, you should be able to debug it pretty easy though
RE: Need help with a script - TechSaavy - 12-18-2012
Thanks! It works as it should ![Biggrin Biggrin](https://sinister.ly/images/smilies/set/biggrin.png)
I have one more question, how can I make my server answer when someone writes something in the client (I mean like netcat), like a command..
For example, client connects to server:
Server:Welcome!
Client: ffddf
Server: Command not spotted etc.
I just need help with setting up this small transaction between client & server. The command can I set up by myself.
Thanks again for this script I've learned alot from looking through it
RE: Need help with a script - 3SidedSquare - 12-18-2012
My pleasure,
For commands, look at what your handel connection method is actually doing
Code: def joke():
return "I really hate this damned machine\nI really wish they'd sell it\nIt never does quite what I want\nbut only what I tell it!"
def anotherCommand():
file = open("Hello", 'w')
file.write("anotherCommand makes a file!")
file.close()
print("Someone did a command!")
return "You just did a command!"
#Reason number ___ python is awesome: you can make arrays of methods with strings as indexes
commandlist = {}
commandlist["Joke"] = joke #Does the joke method
commandlist["AnotherCommand"] = anotherCommand #Does the anotherCommand method
def clientHandel(conn, addr)
data = conn.recv(1024) #This waits till the connection has sent something, and stores it in data
string = str(data, 'UTF-8') #Python sends bytes over, so we need to convert it to a string
try:
message = commandlist[string]()
except:
message = 'Failed to do command!'
outputBytes = bytes(message, 'UTF-8') # need to turn it back into bytes before sending it
conn.send(outputBytes) #Sends a message to the client
RE: Need help with a script - TechSaavy - 12-19-2012
Thank you again ![Biggrin Biggrin](https://sinister.ly/images/smilies/set/biggrin.png)
I have no time to test it now though, but I will test it after the new year ![Smile Smile](https://sinister.ly/images/smilies/set/smile.png)
It looks like you know alot about python
|