Python, How To Send Data Over Tcp
I need to create a simple server that listens for TCP connections. If it receives text on or off then it sends (echo) back success. The receiving part is wor
Solution 1:
Well i did it a day before following a very good tutorial, cant find the link but here is the code
client.py
import socket
host = socket.gethostname()
port = 12345 # The same port as used by the server
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((host, port))
s.sendall(b'Hello, world')
data = s.recv(1024)
s.close()
print('Received', repr(data))
For server
echo_server.py
import socket
host = ''# Symbolic name meaning all available interfaces
port = 12345# Arbitrary non-privileged port
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((host, port))
print host , port
s.listen(1)
conn, addr = s.accept()
print('Connected by', addr)
whileTrue:
try:
data = conn.recv(1024)
ifnot data: breakprint"Client Says: "+data
conn.sendall("Server Says:hi")
except socket.error:
print"Error Occured."break
conn.close()
Solution 2:
A better approach from the python 3 docs would be:
Server
import socketserver
classMyTCPHandler(socketserver.BaseRequestHandler):
"""
The request handler class for our server.
It is instantiated once per connection to the server, and must
override the handle() method to implement communication to the
client.
"""defhandle(self):
# self.request is the TCP socket connected to the client
self.data = self.request.recv(1024).strip()
print("{} wrote:".format(self.client_address[0]))
print(self.data)
# just send back the same data, but upper-cased
self.request.sendall(self.data.upper())
if __name__ == "__main__":
HOST, PORT = "localhost", 9999# Create the server, binding to localhost on port 9999
server = socketserver.TCPServer((HOST, PORT), MyTCPHandler)
# Activate the server; this will keep running until you# interrupt the program with Ctrl-C
server.serve_forever()
Client
import socket
import sys
HOST, PORT = "localhost", 9999
data = " ".join(sys.argv[1:])
# Create a socket (SOCK_STREAM means a TCP socket)with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
# Connect to server and send data
sock.connect((HOST, PORT))
sock.sendall(bytes(data + "\n", "utf-8"))
# Receive data from the server and shut down
received = str(sock.recv(1024), "utf-8")
print("Sent: {}".format(data))
print("Received: {}".format(received))
Hope it helps. Arturo
Solution 3:
If you need an endless/ continuous server connection you can use the following server code.
Server Code
import socket # Import socket module
port = 50000# Reserve a port for your service every new transfer wants a new port or you must wait.
s = socket.socket() # Create a socket object
host = ""# Get local machine name
s.bind(('localhost', port)) # Bind to the port
s.listen(5) # Now wait for client connection.print('Server listening....')
x = 0whileTrue:
conn, address = s.accept() # Establish connection with client.whileTrue:
try:
print('Got connection from', address)
data = conn.recv(1024)
print('Server received', data)
st = 'Thank you for connecting'
byt = st.encode()
conn.send(byt)
x += 1except Exception as e:
print(e)
break
conn.close()
Client Code
import socket # Import socket moduleimport os
import re
s = socket.socket() # Create a socket object
port = 50000# Reserve a port for your service every new transfer wants a new port or you must wait.
s.connect(('localhost', port))
x = 0
st = str(x)
byt = st.encode()
s.send(byt)
# send message for hundred timeswhile x<100:
st = str(x)
byt = st.encode()
s.send(byt)
print(x)
whileTrue:
data = s.recv(1024)
if data:
print(data)
x += 1breakelse:
print('no data received')
print('closing')
s.close()
Post a Comment for "Python, How To Send Data Over Tcp"