Jump to content

Pirmie soļi Pitonā


Jurkins
 Share

Recommended Posts

Sveicināti normālā? tēmā!

Saprotu, ka kāds smiesies?, bet esmu tupikā. Tātad tiek sperti pirmie kopīgie soļi ar to velna čūsku (kas gan neesot čūska, bet Montijs Paitons). TCP serveris un klients. Visvienkāršākais. No daudziem avotiem.

import socket

server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('localhost',9900))
server_socket.listen(1)
print('server is running')
while True:
    connection, address = server_socket.accept()
print("new connection from {address}".format(address=address))
print(str(connection.recv(1024)))

connection.close()

un

import socket

client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
client_socket.connect(('localhost', 9900))
client_socket.send(bytes('hello from client ', encoding='UTF-8'))
client_socket.close

Palaižu serveri. Laižu klientu. Rezultātā dabūju šo:

>>>
 RESTART: C:\Users\User\AppData\Local\Programs\Python\Python35\TCP_server.py
server is running

 RESTART: C:/Users/User/AppData/Local/Programs/Python/Python35/TCP_client1.py
Traceback (most recent call last):
  File "C:/Users/User/AppData/Local/Programs/Python/Python35/TCP_client1.py", line 4, in <module>
    client_socket.connect(('localhost', 9900))
ConnectionRefusedError: [WinError 10061] No connection could be made because the target machine actively refused it
>>>

 

It kā pilns nets ar šo kļūdu, bet citam serveris nav palaists, citam "zemie" porti izmantoti, citam adreses nevienādas/nepareizas. Bet nu nevaru saprast, kas par lietu.

Pitons 3.5, mūrī atvēru visus portus priekš pytonw.exe... Kur es lohojos? Vēl bišķi un iešu lasīt par ozona caurumu?

  • Patīk 1
Link to comment
Share on other sites

Ar telnetu pieslēdzas.

 

netstat -a -n rāda,  ka 127.0.0.1:9900 listening

Labots - Jurkins
Link to comment
Share on other sites

server.py:

import socket
from time import sleep

server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('localhost',9900))
server_socket.listen(1)
print('server is running')

connection, address = server_socket.accept()
print("new connection from {address}".format(address=address))


while True:
    sleep(2)
    print(str(connection.recv(1024)))


connection.close()

 

Link to comment
Share on other sites

Pirms 5 minūtēm , ieleja teica:

 

 

tad tev vajadzētu redzēt


0.0.0.0:9900

 

Kāpēc? Esmu kaut ko palaidis garām? localhost vai tad standartā vienmēr nav 127.0.0.1?
Es notestēju abus kodus un man arī bija 127.0.0.1:9900. 
Jebkurā gadījumā, problēma bija, ka 

connection, address = server_socket.accept()

bija iebāzts ciklā

Link to comment
Share on other sites

Pirms 18 minūtēm , TOoMoOT teica:

Jebkurā gadījumā, problēma bija, ka 


connection, address = server_socket.accept()

bija iebāzts ciklā

 

Tas jau atkarīgs no tā ko vēlas panākt. Ja grib apstrādāt pieslēgumu pēc pislēguma, tad tam jābūt ciklā, savādāk tik viens klients pieslēgsies un viss.

Jebkurā gadījumā man @Jurkins iepostotais kods strādā.

Pareizāk pat būtu katru requestu apstrādāt savā threadā.

 

 

  • Patīk 1
Link to comment
Share on other sites

Pirms 1 minūtes , AndrisBB teica:

kods strādā.

hmmmm... velns, kur tad varētu būt problēma. Ports tiek uzklausīts...

par tiem thrediem... gan jau viss ar laiku?.

Link to comment
Share on other sites

import socket
import threading 

def handle_client(conn,addr):
	while True:
		print("Wait for data")
		data = conn.recv(1024)
		if not data:
			break
		print(str(data))

	conn.close()


def start_server():
	server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
	server_socket.bind(('',9900))
	server_socket.listen(1)
	print('server is running')

	while True:
		connection, address = server_socket.accept()
		print("new connection from {address}".format(address=address))
		t = threading.Thread(target=handle_client, args=(connection, address))
		t.start()

	connection.close()


if __name__ == "__main__":
	start_server()

 


Atstāj servera adresi tukšu
Labots - AndrisBB
  • Atbalstu 1
Link to comment
Share on other sites

Paldies, @AndrisBB, bet pagaidām nezinu, ko ar šo visu darīt.

 

Velns, čujs teica, ka vajag uz cita datora pamēģināt. Uz cita iet. Jāmeklē tomēr, kur problēma. Ņeporjadoks citādi.

Link to comment
Share on other sites

Un ja pieliec šo, gan clientā gan serverī?

 

host_ip = socket.gethostbyname('localhost')
print("IP : ",host_ip)
Link to comment
Share on other sites

IP:127.0.0.1 abos gadījumos

Bet kļūda klientam tāpat. Arī ja šādi

 

client_socket.connect((host_ip, 9900))

 

 

Link to comment
Share on other sites

Pie reizes pamēģini arī xmlrpc:

server:

from xmlrpc.server import SimpleXMLRPCServer
from xmlrpc.server import SimpleXMLRPCRequestHandler

# Restrict to a particular path.
class RequestHandler(SimpleXMLRPCRequestHandler):
    rpc_paths = ('/RPC2',)

# Create server
with SimpleXMLRPCServer(('localhost', 8000), requestHandler=RequestHandler) as server:
    server.register_introspection_functions()
    def HelloFrom(name):
        print("Hello from " + name)
        return "OK"
    server.register_function(HelloFrom)
    server.serve_forever()

 

client

import xmlrpc.client

s = xmlrpc.client.ServerProxy('http://localhost:8000')
s.HelloFrom("Džeris")
print(s.system.listMethods())

 

 

Link to comment
Share on other sites

Nu tas jau XML bāzēts rcp. Maz ticams ka viņam tas vajadzīgs.

 

pirms 5 stundām , Jurkins teica:

ConnectionRefusedError: [WinError 10061] No connection could be made because the target machine actively refused it

Pašā errorā jau tev ir dota atbilde, ar Pitina kodu tur sakars mazs. Skaties kas tev tajos portos sakonfigurēts, sistēma vienkarshi neatļauj piekonekteties portam.

 

Pameģini ar netcat (vai kas tur uz Windows), ganjau būs līdzīgs rezultāts.

netcat localhost 9900

 

Link to comment
Share on other sites

Varbūt palīdz pašu konsoli palaist ar admina tiesībām un tikai tad startēt pitona kodu.

Vēl protams AV/Firewall var bloķēt. Varbūt kaut kas jau sēž uz tā porta. Cits Pitonā process kas vienkārši nokāries fonā griežas. Restartēt datoru ?! :sarkasms:

Labots - MIGs
Link to comment
Share on other sites

Tā, nu ierados mājās. Bļin, uz mājas datora arī tas pats.

Darbā, uz tā datora, uz kura negāja, skatījos ar netstat, nekas nesēž uz tā porta un netstats saka, ka ports tiek klausīts. Ja mēģināju slēgties klāt ar klientu no otra datora(uz kura viss gāja), tad netstats parādīja, ka savienojums ir izveidots, bet konsole neko nesaņēma. Pamēģināšu ar admin tiesībām. Darbā un mājās nekā līdzīga. w7 un w10.

Nja, sākums grūts?. Kā vienmēr.

 

edit:

@camel piemērā serveris aiziet, klients izmet veselu sarkanu lappusi un beigās tas pats error10061.

Labots - Jurkins
Link to comment
Share on other sites

Pirms 10 minūtēm , Jurkins teica:

ar klientu no otra datora

Nu ja tu mēģini slēgties no otra datora un servers klausās uz localhost vai 127.0.0.1, tad loģiski ka neies.

Klausies uz 0.0.0.0 (visiem intefeisiem) vai vēl labāk, nolasi visus interfeisus, dabon interfeisa IP un klausies uz tā. Tad no kliena taisi pieslēgumu uz to IP. 

Link to comment
Share on other sites

Nē, es izmainīju adresi uz to, kas datoram bija tīklā 10.10.1.2 konkrētajā gadījumā.

Link to comment
Share on other sites

Bet servers tak tev klausās uz localhost, pat ja tu mēģināsi pieslēgties ar servera IP, tikuntā neies.

Liec serverī 0.0.0.0 vai interfeisa IP, un clientā servera IP. (tad redzēs vai iet).

 

Vispār jau es ar Wirešarku paskatītos vai TCP savienojums tiek noraidīts no servera puses.

Labots - AndrisBB
Link to comment
Share on other sites

Just now, AndrisBB teica:

Bet servers tak tev klausās uz localhost

Es maldos trijās priedēs..  gan serverim liku klausīties 10.10.1.2:9900, gan klients no otra kompja slēdzās pie 10.10.1.2:9900. Netstats rādīja, ka savienojums ar otru datoru ir ESTABLISHED, bet konsole to "hello"nesaņēma.

Wirešarks vēl jāpagūst.

Link to comment
Share on other sites

Kas to lai zin kas tev tur par zvērudārzu, visādi Windows, firewalli un antivīrusi.

Uzinstalē normālu OS un viss darbosies :D

 

Pirms 9 minūtēm , Jurkins teica:

Wirešarks vēl jāpagūst

Tur nav ko apgūt. Pienstalē, taver interfeisu un redzēsi visu trafiku. Izfiltrē pec porta vai, lai liekais netraucē un redzēsi kas notiek.

Link to comment
Share on other sites

pirms 9 stundām , Jurkins teica:

while True:
    connection, address = server_socket.accept()
print("new connection from {address}".format(address=address))
print(str(connection.recv(1024)))

Tev tur tai ciklā ir neriktīgs copy-paste vai kā? Tās "print" rindas ir ar atstarpi rindas sākumā vai bez?

while True:
    connection, address = server_socket.accept()
    print("new connection from {address}".format(address=address))
    print(str(connection.recv(1024)))

 

Link to comment
Share on other sites

Pirms 5 minūtēm , binary teica:

Tev tur tai ciklā ir neriktīgs copy-paste vai kā? Tās "print" rindas ir ar atstarpi rindas sākumā vai bez?

Nu ja viņam tur ir kā tavā pirmajā citātā, tad tā arī būs ka savienojumu izveidos, bet neko uz konsoli nedrukās.

Pirms 16 minūtēm , Jurkins teica:

Netstats rādīja, ka savienojums ar otru datoru ir ESTABLISHED, bet konsole to "hello"nesaņēma.

 

Labots - AndrisBB
Link to comment
Share on other sites

Just now, binary teica:

ir ar atstarpi rindas sākumā vai bez

Paldies par norādi, bet tas ir ok. Pašā sākumā ar šo bija problēmas.

Palaidu tādu appu TCP/IP Builder.

Uztaisu soketu 127.0.0.1:9900 un palaižu uz klausīšanos.

Palaižu pitona klientu un viss notiek. Netstats arī rāda, ka ir ok.

 

Palaižu pitona serveri, no buildera konnektējos klāt un viss ok.

 

Savā starpā abi nu ni.

Link to comment
Share on other sites

pirms 10 stundām , Jurkins teica:

client_socket.close

Šitam arī neaizmirsti pielikt "()" galā, nav jau Perl. Tiesa, tas konkrēto problēmu neatrisinās.

Link to comment
Share on other sites

Sviests...?

Sapratu, kāpēc uz cita datora gāja. Uz šamā stāvēja brīvā Visual Studio (izmantoju priekš Arduino, daudz patīkamāk nekā oriģinālais interfeiss) un tur bija arī paitona modulis vai kā to nosaukt. Uzrakstīju iekš VS un strādāja. Mājās arī ir līdzīga situācija. Uzveidoju uz VS17 un viss strādā. WTF??? Mēģināju py konsoli laist kā administrators, bet tas neko nelīdzēja.

Gribētos tomēr saprast, kas par lietu.

 

Serveris no VS, klients no py konsoles - OK.

Serveris no py konsoles, klients no VS - OK.

Serveris un klients no VS - OK

Serveris un klients no py konsoles - pakaļa...

Labots - Jurkins
Link to comment
Share on other sites

Esi pārliecināts ka tabi bij salikti OK un kods nebij kā Binary teica?

Ieposto neejošos failus, kā failus nevis copy/paste

Link to comment
Share on other sites

Faili izskatās vienādi

 

Varbūt pitoni nav vieni un tie paši

 
import sys

print(sys.version)
print(sys.version_info)
print(sys.prefix)

 

Link to comment
Share on other sites

Konsolē:

 

>>> import sys
>>> print(sys.version)
3.8.0 (tags/v3.8.0:fa919fd, Oct 14 2019, 19:37:50) [MSC v.1916 64 bit (AMD64)]
>>> print(sys.version_info)
sys.version_info(major=3, minor=8, micro=0, releaselevel='final', serial=0)
>>> print(sys.prefix)
C:\Users\Jurchixx\AppData\Local\Programs\Python\Python38
>>>

 

 

VS:

 

>>> import sys
>>> print(sys.version)
3.8.0 (tags/v3.8.0:fa919fd, Oct 14 2019, 19:37:50) [MSC v.1916 64 bit (AMD64)]
>>> print(sys.version_info)
sys.version_info(major=3, minor=8, micro=0, releaselevel='final', serial=0)
>>> print(sys.prefix)
C:\Users\Jurchixx\AppData\Local\Programs\Python\Python38
>>>

 

 

 

Pamēģināju vēlreiz... paC sev neticēju. Krustām šķērsām un VS viss lieliski, abi gali konsolē - čušss.

 

 

 

To 3.8.0 ieliku šodien. Pirms tam bija 3.5 kaut kāds. Izrādās šis neraksta pa virsu vecajam. 3.8 ieinstalējās zem appdata/local..., vecais 3.5 bija programmās. Ar abiem pilnīgi tas pats stāsts. Domāju, varbūt kaut kas ar atļaujām...

 

Labots - Jurkins
Link to comment
Share on other sites

Kas ir "py konsole"? Kā no viņas to serveri un klientu palaist? Es palaižu no cmd.

Link to comment
Share on other sites

IDLE Pyton

Ieinstalējas tāda figņa

 

ka  tevi piķis! No cmd strādā. Skaidrs, aizmirstam to IDLE. Likās diezgan ērts redaktors.

 

Paldies visiem! Problēma atrisināta. Nepagāja pat diennakts. ?

 

 

 

 

 

 

Labots - Jurkins
Link to comment
Share on other sites

pirms 7 stundām , Jurkins teica:

Serveris no VS, klients no py konsoles - OK.

Serveris no py konsoles, klients no VS - OK.

Serveris un klients no VS - OK

Serveris un klients no py konsoles - pakaļa...

Man tomēr nav skaidrs, kāpēc tikai pēdējā kombinācija nestrādā.

Link to comment
Share on other sites

Viņš tur iekšēji neizmanto pats kaut kādus portus? Varbūt pārklājas kas. Pamēģini citus portus, 55555?

Link to comment
Share on other sites

Teiksim tā, par pitonu līdz aizvakardienai zināju tieši neko. Tikai to, ka interpretators apmēram kā beisiks Z80 laikos  - ievadi komandu, nospied enter, šis šo izpilda. Ieinstalēju, skatos kaut kāds redaktors, IDLE python, nu i rakstu ar šamo.

Vienalga kādus portus, Randomā mēģināju visvisādus. 55555 tikko izmēģināju. Tas pats. Mājās uz W10 no cmd viss strādā, no tās IDLEs clients nekādi.

 

Sistēma normāla. Antivīrusa vispār nav bijis. Pēdējais vīruss bija nez cik gadus atpakaļ vēl uz W7.

FW iebūvētais. Pie izslēgta tas pats.

 

Tagad esmu pie darba datora, no cmd klients nestrādā, tā pati kļūida.

Labots - Jurkins
Link to comment
Share on other sites

Pirms 13 minūtēm , Jurkins teica:

Teiksim tā, par pitonu līdz aizvakardienai zināju tieši neko. Tikai to, ka interpretators apmēram kā beisiks Z80 laikos  - ievadi komandu, nospied enter, šis šo izpilda.

Tik pat labi var teikt, ka PHP ir kā beisiks Z80 laikos. Tur ir tieši tas pats.

Tā, starp citu - python prot arī "nokompilēt" savu .py failu un saglabāt savu "nokompilēto" bytecode .pyc failā, lai nav katru reizi jāinterpretē vienu un to pašu.

 

Pirms 13 minūtēm , Jurkins teica:

Tas pats. Mājās uz W10 no cmd viss strādā, no tās IDLEs clients nekādi.

Rakstīji tak, ka viss OK, ja serveri palaiž no VS, bet klientu no IDLE.

Labots - binary
Link to comment
Share on other sites

Tātad. Ātrumā bišķi saputrojos. Darbā tas pats, kas mājās.

Laikam sapratu apmēram, kas notiek. Nestrādā abi gali no tās IDLEs.

 

Nezinu, kā tas "process" notiek, bet izskatās, ka tā "čaula" vai kā to nosaukt nespēj strādāt vai ar diviem uzdevumiem vienlaicīgi.

Labots - Jurkins
Link to comment
Share on other sites

Jā problēma ir tajā idel. Tev vajag atvērt divus atsevišķus idle logus, vienā ielādēt serveri, otrā klientu, tad darbosies.

Link to comment
Share on other sites

Izveido kontu, vai pieraksties esošajā, lai komentētu

Jums ir jābūt šī foruma biedram, lai varētu komentēt tēmas

Izveidot jaunu kontu

Piereģistrējies un izveido jaunu kontu, tas būs viegli!

Reģistrēt jaunu kontu

Pierakstīties

Jums jau ir konts? Pierakstieties tajā šeit!

Pierakstīties tagad!
 Share

×
×
  • Izveidot jaunu...