Lokalen commandline chat

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
HardwareManager
User
Beiträge: 59
Registriert: Freitag 31. Mai 2013, 21:18

hallo,
ich wollte mal einen Chat machen aber ich finde im Internet nur ewiglange Programme(ich hasse ewiglange Programme).
Könnt ihr mir ein einfaches Beispiel hier posten?
Es soll eine Server - Client Verbindung sein.
Danke!! :D
ImmmerEineGuteIdee
|=|=|=|=|=|=|=|
HardwareManager
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@HardwareManager: ein lokaler commandline chat über das Dateisystem

Code: Alles auswählen

#!/bin/bash
touch chat.txt
tail -f chat.txt &
cat /dev/stdin >>chat.txt
HardwareManager
User
Beiträge: 59
Registriert: Freitag 31. Mai 2013, 21:18

:D nein so meine ich das nicht..
Ich meine das es im lokalen netzwerk funzt...
ImmmerEineGuteIdee
|=|=|=|=|=|=|=|
HardwareManager
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

Zeig mir das kurze Beispiel und ich / andere können dir sagen, ob es realistisch ist es noch kleiner / kürzer / einfacher hinbekommen kann.
HardwareManager
User
Beiträge: 59
Registriert: Freitag 31. Mai 2013, 21:18

Ich habe ein kurzes beispiel weis aber
1. nicht wie es funkt
2. wie man das mit mehreren leuten macht
Danke

Code: Alles auswählen

import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(("", 50000))
s.listen(1)

try:
    while True:
        komm, addr = s.accept()
        while True:
            data = komm.recv(1024)

            if not data:
                komm.close()
                break
                
            print("[{}] {}".format(addr[0], data.decode()))
            nachricht = input("Antwort: ")
            komm.send(nachricht.encode())
finally:
    s.close()

Code: Alles auswählen

import socket

ip = input("IP-Adresse: ")
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((ip, 50000))

try:
    while True:
        nachricht = input("Nachricht: ")
        s.send(nachricht.encode())
        antwort = s.recv(1024)
        print("[{}] {}".format(ip, antwort.decode()))
finally:
    s.close()
ImmmerEineGuteIdee
|=|=|=|=|=|=|=|
HardwareManager
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

Kürzer als das geht es kaum. Mit welcher Bibliothek es einfacher geht kann ich keine Empfehlung geben, aber es gibt sicherlich einfacheres als lowlevel socket Programmierung.

Der erste Codeschnipsel öffnet einen Server (Code vor while True) und wartet auf eingehende Nachrichten und gibt diese dann aus und gibt dann die Möglichkeit dem Benutzer über input eine Antwort einzugeben die dann abgesendet wird.

Das zweite Codeschnipsel, verbindet sich mit dem Server (Server muss dazu bereits laufen) und gibt dem Benutzer eine Eingabe Möglichkeit (input) und sendet diese dann an den Server und wartet dann auf eine Antwort (s.recv).

Bei beiden läuft der send und recv Teil in einer while Schleife damit es für immer und ewig so weiter geht.

PS da die Frage gleich als nächstes kommt: Das sollte bei dir ohne Probleme mit Python 3 laufen. Allerdings nur im LAN, sobald etwas wie Router / NAT ins Spiel kommen hast du das Problem das der Port an den PC durchgereicht werden muss. Gleiche Problem welches Spieler haben wenn sie Server auf machen.
HardwareManager
User
Beiträge: 59
Registriert: Freitag 31. Mai 2013, 21:18

Danke.
Und das mit dem Port kenne ich auch(ich habe einen Server gehostet)
ImmmerEineGuteIdee
|=|=|=|=|=|=|=|
HardwareManager
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@HardwareManager: Einfache Chats zu schreiben, ist eben nicht so einfach, dass man das in wenigen Zeilen hinbekommt. Das Ding, das Du da gepostet hast, hat eben nur eine Verbindung, man muß warten, bis der andere etwas gesendet hat, bevor man wieder was schreiben kann, es werden unter umständen nur Teilnachrichten empfangen, so dass der Chat danach total unbrauchbar ist. Das Beispiel ist also kein Chat, sondern nur ein Beispiel, wie man keine Client-Server-Prozess aufbauen sollte.
Und alles in allem erwartet der Nutzer etwas mehr Komfort.
Antworten