Code Monkey home page Code Monkey logo

hisock's Introduction

CircleCI Badge Documentation Status Codacy Badge Language grade: Python Downloads

PyPI Version Github Version Github Commits

hisock (HiSock, Hisock)

A higher level extension of Python's built-in socket module, with simpler and more efficient usages.

Documentation

Documentation is located on ReadTheDocs. Some documentation is also located in the code as docstrings, though most are already well-documented on ReadTheDocs.

Installation

Hisock only supports Python versions 3.7 and onwards, due to annotations from the __future__ module.

hisock is available on PyPI here, so it is installable by pip. Just do the following command.

$ python -m pip install hisock (WINDOWS)
  OR
$ pip3 install hisock (MAC/LINUX)

To build the bleeding-edge version of hisock from GitHub, download the repository with your favorite way, cd into it, then type:

$ python -m pip install -e . (WINDOWS)
  OR
$ pip3 install -e . (MAC/LINUX)

Note that you MUST cd into the cloned directory for this to work.

Code of Conduct and Contributing Guidelines:

Code of Conduct

Contributing Guidelines

Examples

hisock utilizes decorators as the core of receiving messages instead of having if statements handling all of the logic. More in-depth examples are located in the examples directory, including a tic-tac-toe game. Here is what a basic server script would look like using hisock:

Server

import sys
import time
import random

from hisock import start_server, get_local_ip

ADDR = get_local_ip()
PORT = 6969

if len(sys.argv) == 2:
    ADDR = sys.argv[1]
if len(sys.argv) == 3:
    PORT = int(sys.argv[2])

print(f"Serving at {ADDR}")
server = start_server((ADDR, PORT))

@server.on("join")
def client_join(client_data):
    print(f"Cool, {client_data.ip_as_str} joined!")
    if client_data['name'] is not None:
        print(f"    - With a sick name \"{client_data.name}\", very cool!")
    if client_data['group'] is not None:
        print(f"    - In a sick group \"{client_data.group}\", cool!")

    print("I'm gonna send them a quick hello message")

    server.send_client(client_data['ip'], "hello_message", str(time.time()).encode())

@server.on("processing1")
def process(client_data, process_request: str):
    print(f"\nAlright, looks like {client_data.ip_as_str} received the hello message, "
          "\nas now they're trying to compute something on the server, because they have "
          "potato computers")
    print("Their processing request is:", process_request)

    for _ in range(process_request.count("randnum")):
        randnum = str(random.randint(1, 100000000))
        process_request = process_request.replace("randnum", randnum, 1)

    result = eval(process_request)  # Insecure, but I'm lazy, so...
    print(f"Cool! The result is {result}! I'mma send it to the client")

    server.send_client(client_data, "something", str(result))


server.start()

Client

import time

from hisock import connect, get_local_ip

server_to_connect = input("Enter server IP to connect to (Press enter for default of your local IP): ")
port = input("Enter Server port number (Press enter for default of 6969): ")

if server_to_connect == '':
    server_to_connect = get_local_ip()

if port == '':
    port = 6969
else:
    port = int(port)

name = input("Name? (Press enter for no name) ")
group = input("Group? (Press enter for no group) ")

print("======================================= ESTABLISHING CONNECTION =======================================")

if name == '':
    name = None
if group == '':
    group = None

client = connect(
    (server_to_connect, port),
    name=name, group=group
)
join_time = time.time()


@client.on("hello_message")
def handle_hello(msg: str):
    print("Thanks, server, for sending a hello, just for me!")
    print(f"Looks like, the message was sent on timestamp {msg}, "
          f"which is just {round(float(msg) - join_time, 6) * 1000} milliseconds since the connection!")
    print("In response, I'm going to send the server a request to do some processing")

    client.send("processing1", b"randnum**2")
    result = client.recv("something", int)

    print(f"WHOAAA! The result is {result}! Thanks server!")

client.start()

Contributors

Special thanks to the following:

  • Sheepy0125, for refactoring the underhood code as well as the API
  • SSS-Says-Snek, for maintaining and developing the library
  • Ankith26, for helping me understand the usages of headers
Copyright SSS-Says-Snek, 2021-present

hisock's People

Contributors

dependabot[bot] avatar sss-says-snek avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.