Skip to content

Instantly share code, notes, and snippets.

@welmends
Created August 24, 2022 20:33
Show Gist options
  • Save welmends/0ce616d13da231ae947a974731e93179 to your computer and use it in GitHub Desktop.
Save welmends/0ce616d13da231ae947a974731e93179 to your computer and use it in GitHub Desktop.
Simple example of chat using sockets implemented in Python 3
from sockets import SocketP2P
from threading import Thread
import sys
def receive(peer):
while(True):
packet = peer.receive()
print('Received: {}'.format(packet))
def chat(args):
ip = args[:args.find('/')]
port = args[args.find('/')+1:]
peer = SocketP2P(ip, int(port))
peer.connect()
th = Thread(target = receive, args=[peer])
if peer.peer_type()=='server':
th.start()
while(True):
packet = input()
peer.send(packet)
elif peer.peer_type()=='client':
th.start()
while(True):
packet = input()
peer.send(packet)
return
def main():
try:
args = sys.argv[1]
except:
print(' Error: inform ip/port')
print('Example: python3 chat.py 192.168.0.11/9999')
print('Example: python3 chat.py localhost/9999')
return
chat(args)
if __name__ == '__main__':
main()
from socket import *
def get_localhost_ip():
s = socket(AF_INET, SOCK_DGRAM)
s.connect(("8.8.8.8", 80))
ip = s.getsockname()[0]
s.close()
return ip
class SocketP2P:
def __init__(self, ip, port):
self._sock_srv = socket(AF_INET, SOCK_STREAM)
self._sock_srv.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
self._sock_clt = socket(AF_INET, SOCK_STREAM)
self._sock_clt.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
self._ip = ip
self._port = port
if ip == 'localhost':
self._ip = get_localhost_ip()
def connect(self):
#Client Mode
self._peer = 'client'
try:
self._sock_clt.connect((self._ip, self._port))
print('### Client Connected ###')
except:
# Server Mode
self._peer = 'server'
try:
self._sock_srv.bind((self._ip, self._port))
self._sock_srv.listen(1)
(self._sock_clt, address) = self._sock_srv.accept()
print('### Server Connected ###')
except:
# Failed
self._peer = 'none'
print('### Connection Failed ###')
def peer_type(self):
return self._peer
def close(self):
self._sock_srv.close()
def receive(self):
return self._sock_clt.recv(2048).decode("utf-8")
def send(self, packet):
self._sock_clt.send(packet.encode("utf-8"))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment