Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Java: Serveri kaveripiirin iloksi

Sivun loppuun

kpzpt [06.07.2007 12:23:50]

#

Hei!

Olen tekemässä kaveri piirin iloksi nettipelejä..
shakki, othello, ristinolla, pikku auts ja pari omaa sotapeliä, alustana linux fedora7/ubundu ja Java 6u1..

minkälaista päivä serverin toteutus käytännössä on, en omaa minkäänlaista serveri/client tason ohjelmointi kokemusta..

jos sinulla on jo Java serveri kotona ja koet että minunkaltaisen netti aloittelijan tulisi tietää jotkin tietyt asiat ennen siirtymistä paperi tason suunnittelusta itse serveri/client ohjelmointiin, niin, kirjoitapa viestiä..

ajattelinpa käyttää webstarttia client ohjelmien kera,
jonkinlainen ws eteinen josta näkee omat kesken eräiset pelinsä ja jossa voi jättää uusia peli haasteita taikka antaa mahdollisuus tulla haastetuksi, tai jotain..

kuten postin alussa kirjoitin en omaa serveri/client ohjelmointi kokemusta, jotenka minkälainen lähestymis tapa soveltuisi minun serveri/client ohjelmointiin TCP/UDP entä minkälaiset roomi ulkoasut..

jos olet nähnyt jossain hienoja (yhden ihmisen toteutettavissa olevia) server sivuja laita vaikka linkki osoite niihin minulle..

oli aika huonoti muotoiltu kysymys, mutta, kiitos kun vastaat..

JariTapio / Helsinki

kpzpt [09.07.2007 12:57:46]

#

Jeps!

Sain RistiNolla pelini pelattavaan kuntoon..
kun pelaaja on tehnyt siirtonsa, siirto lähetetään TCPnä serverilleni,
joka käsittelee siirron ja lähettää paketin web hotelliini jonne peli
tilanteet olisivat tallennettuina..

minulla on seuraava koodi rakentumassa, tallentamaan peli tilanteet web hotelliini,
mutta koodi ei tallenna annettuun url osoitteeseen mitään, missä kohden vika ??

jos laitan pathin osoittamaan minun kovalevylleni niin "siirto.dat" tallentuu minun kovalevylleni, mutta miksi url tallennukseni ei toimi ??

byte[] buf = new byte[32];
String path = "http://www.5mingames.eurojari.net/siirto.dat";
String path = "file://c:/siirto.dat";

try
{
    URL url = new URL (path);
    File file = new File ( url.getFile() );
    out = new FileOutputStream( file );

    for ( int kohta = 0; kohta < buf.length; kohta++ )
    {
        int c = (char)buf[kohta];
        out.write((char)c);
    }
    out.flush();
    if (out != null) out.close();
}
catch (Exception e)
{
    e.printStackTrace();
}

entäs seuraava koodi, miksi ei toimi??

URL url = new URL ("http://www.5mingames.eurojari.net/Siirto.dat");
        URLConnection connection = url.openConnection();
        connection.setDoOutput(true);
        PrintWriter out2 = new PrintWriter(connection.getOutputStream());
        out2.println("firstName=Joe");
        out2.println("lastName=Average");
        out2.close();

(Mod. Edit. Kooditagit.)

Matso [09.07.2007 23:21:40]

#

Et tietenkään voi jostain java sovelluksesta tai sovelmasta kirjottaa etäpalvelimelle noin vain, jos voisit niin voisit mennä sotkemaan millä vaan servulla olevia tiedostoja :D

Tarviit serverin puolelle esim. jonkun java servletin tai php skriptin joka hoitaa sen kirjottamisen serverillä olevaan filuun.

tsuriga [10.07.2007 02:15:53]

#

http://mureakuha.com/keskustelut/4?14605

Matso [10.07.2007 08:01:52]

#

tsuriga kirjoitti:

http://mureakuha.com/keskustelut/4?14605

Nonii ja turhaa vastasin >:(. Kerranki ku pääs pätemää.

Mobel [12.07.2007 18:25:24]

#

Olen myös kiinnostunut aiheesta ja palailin juuri lomilta koneen ääreen, joten olisiko mahdollista julkaista tekemäsi ristinolla-pelin lähdekoodia? Se varmasti auttaisi asian ymmärtämistä.

kpzpt [15.07.2007 17:21:27]

#

Et tietenkään voi jostain java sovelluksesta tai sovelmasta kirjottaa etäpalvelimelle noin vain, jos voisit niin voisit mennä sotkemaan millä vaan servulla olevia tiedostoja :D

Matso kirjoitti:

Tarviit serverin puolelle esim. jonkun java servletin tai php skriptin joka hoitaa sen kirjottamisen serverillä olevaan filuun.

eli kylläpäs voi, alla linkki,
http://mureakuha.com/keskustelut/4?14605

Mobel kirjoitti:

Olen myös kiinnostunut aiheesta ja palailin juuri lomilta koneen ääreen, joten olisiko mahdollista julkaista tekemäsi ristinolla-pelin lähdekoodia? Se varmasti auttaisi asian ymmärtämistä.

julkaista tekemäsi ristinolla-pelin LÄHDEKOODIA,
hmmm, mikähän lähdekoodin kohta/vaihe herraa mahtaa kiinnostaa,
ristinolla on aika simppeli ohjelma,
tein vain 800x800 pixeliä kokoisen ruutupaperi GIF fileen,
jossa on 30x30 ruutua,
ja näitten päälle sitten lyödään vuoronperään
joko sininen ruxi taikka punainen pallo,
ja char 30x30 taulukosta etsitään
siirto vuoron päätyttyä 5 peräkkäistä,
ja ping voittaja löytyi,
game over..

JariTapio / Helsinki

(Mod. Edit. Lainaukset.)

Olga [15.07.2007 19:49:08]

#

Mobel varmastikin tarkoitti lähinnä tuon nettiliikenteen hoitamista, eikä niinkään tuon ristinollan toteutusta.

Mobel [15.07.2007 20:24:55]

#

Juu pahoittelen epäselvyyttäni...

Eli lähinnä internet-liikenteen puoli kiinnostaa. Olen itsekin kirjoitellut serveriä(näin aluksi perus echo-servu), mutta en ole saanut sitä toimimaan.

Ensinnäkin haluaisin selvittää voiko echo-serveriä testata niin, että vaikkapa Eclipsestä hakeutuu valikkoon Run|Run As|Java Application ja valitsee kummankin luokan(Client ja Server)? Jos ei, niin miten?

Tällainen on yritelmäni:

Asiakas:

import java.net.*;
import java.io.*;

public class Client {

	public static void main(String[] args) {

		try{
			Socket soketti=new Socket("localhost", 9696);

			InputStream sisään=soketti.getInputStream();
			OutputStream ulos=soketti.getOutputStream();

			BufferedReader lukija=new BufferedReader(new InputStreamReader(sisään, "ISO-8859-1"));
			BufferedWriter kirjoitin=new BufferedWriter(new OutputStreamWriter(ulos, "ISO-8859-1"));

			kirjoitin.write("Kaikuuko");
			kirjoitin.flush();

			String vastaus;
			while((vastaus=lukija.readLine())!=null){
				System.out.println(vastaus);
			}

			kirjoitin.close();
			lukija.close();
			soketti.close();

		}catch(IOException ioe){
			ioe.printStackTrace();
		}
	}
}

Servu:

import java.net.*;
import java.io.*;

public class Server {

	public void main(String [] args){
		try{
			ServerSocket servuSoketti=new ServerSocket(9696);

			while(true){
				Socket soketti=servuSoketti.accept();

				InputStream sisään=soketti.getInputStream();
				OutputStream ulos=soketti.getOutputStream();
				Reader lukija=new InputStreamReader(sisään, "ISO-8859-1");
				Writer kirjoitin=new OutputStreamWriter(ulos, "ISO-8859-1");
				BufferedReader puskuLukija=new BufferedReader(lukija);
				BufferedWriter puskuKirjoitin=new BufferedWriter(kirjoitin);

				String viesti=puskuLukija.readLine();
				if(viesti!=null){
					System.out.println(viesti);
					puskuKirjoitin.write("ECHO: "+viesti);
					puskuKirjoitin.flush();
				}

				puskuLukija.close();
				puskuKirjoitin.close();
				soketti.close();

				if("EXIT".equals(viesti)) break;
			}
			servuSoketti.close();
		}catch(IOException ioe){
			System.out.println(ioe.getMessage());
		}
	}
}

Olisikohan pitänyt aloittaa uusi topikki?

Matso [15.07.2007 21:09:54]

#

kpzpt: Tässä foorumissa on tollanen lainaa linkki tossa viestin ylhäällä oikealla. Sitä käyttämällä lainaukset erottu vähän selkeemmin viestistä.

kpzpt [15.07.2007 21:59:29]

#

Mobel kirjoitti:

Juu pahoittelen epäselvyyttäni...

Eli lähinnä internet-liikenteen puoli kiinnostaa. Olen itsekin kirjoitellut serveriä(näin aluksi perus echo-servu), mutta en ole saanut sitä toimimaan.

Hei!

tossa on linkki mun käyttämääni koodiin..

http://java.sun.com/developer/onlineTraining/Programming/BasicJava2/socket.html

itseasiassa minulla on täsmälleen sama tilanne kuin sinulla,
minullakaan BufferedWriter ei toimi,
kokeileppas käyttää PrintWriteria
kuten java.sun.com linkin koodi esimerkissä on..
jos ratkaiset tuon BufferedWriterin niin laitappas postia..

JariTapio / Helsinki

Mobel [16.07.2007 14:18:33]

#

No niin nyt sain echo-serverin toimimaan. Kokeilin sitä myös lähiverkon yli ja näytti toimivan. Käytän tässä tosiaan bufferedWriteriä ja laitanpa nyt servun ja clientin kooditkin näkyville.

Client:

import java.net.*;
import java.io.*;

public class LameChatClient {

	public static void main(String[] args) {

		try{
			Socket soketti=new Socket("localhost", 9696);

			InputStream sisään=soketti.getInputStream();
			OutputStream ulos=soketti.getOutputStream();

			BufferedReader lukija=new BufferedReader(new InputStreamReader(sisään, "ISO-8859-1"));
			BufferedWriter kirjoitin=new BufferedWriter(new OutputStreamWriter(ulos, "ISO-8859-1"));

			kirjoitin.write("Moro\n");
			kirjoitin.flush();

			String vastaus;
			while((vastaus=lukija.readLine())!=null){
				System.out.println(vastaus);
			}

			kirjoitin.close();
			lukija.close();
			soketti.close();

		}catch(IOException ioe){
			ioe.printStackTrace();
		}
	}
}

Ja serveri:

import java.io.*;
import java.net.*;

public class LameChatServer {

  public static void main(String[] args) {
	  try {
		  ServerSocket servuSoketti=new ServerSocket(9696);

	    	while(true) {
	    		Socket soketti=servuSoketti.accept();

		        InputStream sisään=soketti.getInputStream();
		        OutputStream ulos=soketti.getOutputStream();
		        Reader lukija=new InputStreamReader(sisään,"ISO-8859-1");
		        Writer kirjoitin=new OutputStreamWriter(ulos,"ISO-8859-1");
		        BufferedReader puskuLukija=new BufferedReader(lukija);
		        BufferedWriter puskuKirjoitin=new BufferedWriter(kirjoitin);


		        String viesti =puskuLukija.readLine();

		        if(viesti !=null ) {
		        	System.out.println(viesti);
		        	puskuKirjoitin.write("ECHO: " + viesti);
		        	puskuKirjoitin.flush();
		        }

		        puskuLukija.close();
		        puskuKirjoitin.close();
		        soketti.close();


		        if ("EXIT".equals(viesti)) break;
	    	}

	    	servuSoketti.close();

	    }catch(IOException ioe){
	      System.out.println(ioe.getMessage());
	    }
  }
}

Ja käynnistelin nämä siten, että komentorivillä komensin ensin:

java LameChatServer

ja sitten avasin toisen komentorivi-ikkunan - koska serveri jää odottamaan vastausta ensimmäiseen - ja siihen laitoin:

java LameChatClient

Serverin tuloste on

Moro

ja asiakkaan tuloste näyttää tältä

ECHO: Moro

Kokeilin myös vaihtaa localhostin tilalle ip-osoitteen ja näytti toimivan niinkin. Ja vinkkinä vielä jos kokeilet tuota suoraan, niin serveri jää kuuntelemaan porttia loputtomiin, sillä EXIT-komentoa ei tule. Ainut minkä asiakas lähettää on Moro ja sitten poistuu ohjelmasta. Serverin komentorivillä kun painaa Ctrl+V niin se lopettaa toimintansa. Vaihtoehtoisesti serverin saa kiinni sammuttamalla Java SE Binary-prosessin tehtävienhallinnasta.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta