Simple parse error, but i can't find him

my code ist this

[CODE]
#!/usr/bin/ruby

Dies ist der Server der auf die Verbindung wartet und entweder

Dateien versendet oder sie hochläd

Der Server läuft auf PORT 10032 und läuft in einer Endlosschleife

noch

require ‘socket’

def hochladen

gs = TCPServer.open(10032) #Es wird ein Server auf Port 10032 gestartet

Der Server wartet auf einen Verbindungsaufbau. Dies

ist als Endlosschleife gemacht da es in Ruby leider keine

Möglichkeit gibt auf eine Tastatureingabe zu warten und

trotzdem weiter zu laufen. Vielleicht kann man das mit

Threads realisieren aber ich hab momentan noch keinen

Plan wie ich dies machen könnte

while true

# Wenn eine Verbindungsanfrage eingeht wird ein eigener
# Thread gestartet für den User und ein Socketobjekt erstellt
Thread.start(gs.accept) do  |s|

	# Statusmeldung, könnte man zB. in ein Serverlog reinschreiben
	# aber das gehört ja nicht zur Aufgebenstellung, deshalb hier
	# nur auf dem Bildschirm bisher, aber das umleiten solte kein 
	# Problem darstellen

	print(s, " hat eine Verbindung aufgebaut\n")

	# Wir warten darauf was der User tun will
	s.gets
	auswahl = $_
	auswahl.chop! # Die \n Zeichen am ende werden entfernt
	
	if auswahl == "H" # Der Client will also eine Datei hochladen
		# zuerst sagen wir dem Client dass wir verstanden haben
		# was er will 
		s.write("ok\n")
		# und warten auf den Dateinamen
		s.gets
		dateiname = $_
		dateiname.chop!
		puts dateiname + " wird hochgeladen\n"
		# Jetzt öffnen wir die Datei zum schreiben
		# Und senden dem Client ein signal ob dies 
		# funktioniert hat.
		dateiname =  dateiname + "up"
		f = File::open(dateiname,mode="w")
		if f
			s.write("ok\n")
		else
			s.write("f\n")
		lesen = s.gets
		lesen.chomp!
		bytezaehler = 0
		while bytezaehler < lesen.to_i
			f.putc(s.getc)
			bytezaehler=bytezaehler+1
		end
		f.close
	 end	
	 if auswahl == "D"
···

		 #
		 #
	 end
	print (s, " wurde abgebrochen\n")
	s.close
end

end
[/CODE]

And her i get a parse Error in Line 75, its one of the two end at the end of
the file . I think the Problem is the Thread Command but i do not know what
to do :frowning: I hope somebody can !? And perhaps can explain what my error.

mfg. Jonas Hoffmann

Jonas Hoffmann wrote:

  	f = File::open(dateiname,mode="w")
  	if f
  		s.write("ok\n")
  	else
  		s.write("f\n")
  	lesen = s.gets
  	lesen.chomp!
  	bytezaehler = 0
  	while bytezaehler < lesen.to_i
  		f.putc(s.getc)
  		bytezaehler=bytezaehler+1
  	end
  	f.close
   end	
   if auswahl == "D"
  	 #
  	 #
  	 #
   end
  print (s, " wurde abgebrochen\n")
  s.close

end
end
[/CODE]

And her i get a parse Error in Line 75, its one of the two end at the end of
the file . I think the Problem is the Thread Command but i do not know what
to do :frowning: I hope somebody can !? And perhaps can explain what my error.

I don’t see where you closed the “if f” block:

 f = File::open(dateiname,mode="w")
 if f
   s.write("ok\n")
 else
   s.write("f\n")
 end                 # <---- this "end" was missing!
 lesen = s.gets
 lesen.chomp!
 ...

Hope this helps,

Lyle

[CODE]
#!/usr/bin/ruby

Dies ist der Server der auf die Verbindung wartet und entweder

Dateien versendet oder sie hochläd

Der Server läuft auf PORT 10032 und läuft in einer Endlosschleife

noch

require ‘socket’

def hochladen
^^^^^^^^^^^^^^^

Finish this method or delete this line.

gs = TCPServer.open(10032) #Es wird ein Server auf Port 10032 gestartet

Der Server wartet auf einen Verbindungsaufbau. Dies

ist als Endlosschleife gemacht da es in Ruby leider keine

Möglichkeit gibt auf eine Tastatureingabe zu warten und

trotzdem weiter zu laufen. Vielleicht kann man das mit

Threads realisieren aber ich hab momentan noch keinen

Plan wie ich dies machen könnte

while true

“loop do” is perhaps better style. Im glad that Ruby doesn’t require
one to use tricks if one really wishes to program that infinite loop.

Wenn eine Verbindungsanfrage eingeht wird ein eigener

Thread gestartet für den User und ein Socketobjekt erstellt

Thread.start(gs.accept) do |s|

  # Statusmeldung, könnte man zB. in ein Serverlog reinschreiben
  # aber das gehört ja nicht zur Aufgebenstellung, deshalb hier
  # nur auf dem Bildschirm bisher, aber das umleiten solte kein 
  # Problem darstellen

  print(s, " hat eine Verbindung aufgebaut\n")

  # Wir warten darauf was der User tun will
  s.gets
  auswahl = $_
  auswahl.chop! # Die \n Zeichen am ende werden entfernt
  
  if auswahl == "H" # Der Client will also eine Datei hochladen
  	# zuerst sagen wir dem Client dass wir verstanden haben
  	# was er will 
  	s.write("ok\n")
  	# und warten auf den Dateinamen
  	s.gets
  	dateiname = $_
  	dateiname.chop!
  	puts dateiname + " wird hochgeladen\n"
  	# Jetzt öffnen wir die Datei zum schreiben
  	# Und senden dem Client ein signal ob dies 
  	# funktioniert hat.
  	dateiname =  dateiname + "up"
  	f = File::open(dateiname,mode="w")

It is a good Ruby idiom to use a block here:

File::open(dateiname, “w”) do |f|

end

The file ‘f’ is closed at the final end.

  	if f
  		s.write("ok\n")
  	else
  		s.write("f\n")

An “end” is missing here.

  	lesen = s.gets
  	lesen.chomp!
  	bytezaehler = 0
  	while bytezaehler < lesen.to_i
  		f.putc(s.getc)
  		bytezaehler=bytezaehler+1
  	end
  	f.close
   end	
   if auswahl == "D"
  	 #
  	 #
  	 #
   end
  print (s, " wurde abgebrochen\n")

Ruby warns with “-w” here. “print(s, …” would be better.

  s.close

end
end
[/CODE]

And her i get a parse Error in Line 75, its one of the two end at the
end of the file . I think the Problem is the Thread Command but i do
not know what to do :frowning: I hope somebody can !? And perhaps can explain
what my error.

I hope I could help you.

···

On 2002-12-18 01:56:36 +0900, Jonas Hoffmann wrote:


7) “Klingon function calls do not have ‘parameters’ - they have
‘arguments’ - and they ALWAYS WIN THEM.”
– “Top 12 things likely to be overheard if you had a Klingon Programmer”

def hochladen

^^^^^^^^^^^^^^^

Finish this method or delete this line.

-i will.

  	f = File::open(dateiname,mode="w")

It is a good Ruby idiom to use a block here:

File::open(dateiname, “w”) do |f|

end

The file ‘f’ is closed at the final end.

  	if f
  		s.write("ok\n")
  	else
  		s.write("f\n")

An “end” is missing here.

This was the keyproblem.

I hope I could help you.

Yes, thanks.

Jonas