Java UDP kliens (valós többszálúság)

Java UDP kliens (valós többszálúság)
2011-08-22T17:47:08+02:00
2011-09-17T23:12:47+02:00
2022-11-23T02:40:39+01:00
grais
Sziasztok. Az alábbi problémában kérném a segítségeteket:

Szeretnék egy olyan UDP klienst létrehozni, ami a létrehozás után:

ClientW407 = new AnotherSideUDPClient(); ClientW407.server_Adress = "10.0.2.2"; ClientW407.serverPort = 10500; ClientW407.runInBackGround();

elindít 2 szálat ugyanazon szerver ugyanazon portjára.
Az egyik figyeli a beérkező adatokat, és feldolgozza azokat, a másik ciklikusan 10 mp-enként küld egy életben tartó adatot. Esetleg alkalmanként más adatot amit már nem a szál intéz hanem majd direktben hívom meg....

Sajnos az a gondom, a kódommal, hogy egyszer-csak a socket értéke NULL lesz (debug nem mutat semmit - gondolom nem az én kódomba lesz null én csak előidézem a rossz kódolással). Sajnos C# ra vagyok rászokva így lehet hogy valami alapvető dolgot csinálok rosszul..

Sajnos a neten csak oda-vissza válaszolgató példákat találtam, vagy csak nem esett le hogy előttem a megoldás...

Forrásom:

import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.ServerSocket; import java.net.SocketException; import android.R.string; import android.text.style.BackgroundColorSpan; import android.util.Log; public class AnotherSideUDPClient implements Runnable { private InetAddress serverAddr; public String server_Adress = "127.0.0.1"; public int serverPort = 10500; public DatagramSocket socket; Thread BackgraundClient, Receivehread; public void run() { // TODO Auto-generated method stub while (true) { receiveFromServer(); } } void runInBackGround() { sendHelloToServer(); BackgraundClient = new Thread(new SimpleThread(socket, serverAddr, serverPort)); BackgraundClient.start(); // new SimpleThread(socket,serverAddr,serverPort).start(); } void sendHelloToServer() { try { // Retrieve the ServerName serverAddr = InetAddress.getByName(server_Adress); Log.d("UDP", "C: Connecting..."); /* Create new UDP-Socket */ //socket = new DatagramSocket(serverPort, serverAddr); socket = new DatagramSocket(); /* Prepare some data to be sent. */ byte[] buf = ("HELLO").getBytes(); /* * Create UDP-packet with data & destination(url+port) */ DatagramPacket packet = new DatagramPacket(buf, buf.length, serverAddr, serverPort); Log.d("UDP", "C: Sending: '" + new String(buf) + "'"); // Kickoff the Client Receivehread = new Thread(new AnotherSideUDPClient()); Receivehread.start(); /* Send out the packet */ socket.send(packet); Log.d("UDP", "C: Sent."); Log.d("UDP", "C: Done."); } catch (Exception e) { Log.e("UDP", "C0: Error", e); CloseClientSocket(socket); } } @Override protected void finalize() throws Throwable { // TODO Auto-generated method stub super.finalize(); socket.disconnect(); socket.close(); BackgraundClient.stop(); BackgraundClient.destroy(); Receivehread.stop(); Receivehread.destroy(); Log.e("FINALIZE", "finalized"); } void receiveFromServer() { byte[] receiveData = new byte[50]; DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length, serverAddr, serverPort); try { while (true) { socket.receive(receivePacket); String modifiedSentence = new String(receivePacket.getData()); System.out.println("FROM SERVER:" + modifiedSentence); Log.e("RECIVED DATA", modifiedSentence); } } catch (Exception e) { Log.e("UDP", "C1: Error", e); } } public boolean CloseClientSocket(DatagramSocket clientSocket) { clientSocket.close(); return true; } } class SimpleThread extends Thread { DatagramSocket socket; InetAddress serverAddr; int serverPort; public SimpleThread(DatagramSocket socket, InetAddress serverAddr, int serverPort) { super(); this.socket = socket; this.serverAddr = serverAddr; this.serverPort = serverPort; } public void run() { sendToServer(); } void sendToServer() { try { // Retrieve the ServerName // serverAddr = InetAddress.getByName(server_Adress); Log.d("UDP", "C: Connecting..."); /* Create new UDP-Socket */ // socket = new DatagramSocket(); /* Prepare some data to be sent. */ byte[] buf = ("eletben").getBytes(); /* * Create UDP-packet with data & destination(url+port) */ DatagramPacket packet = new DatagramPacket(buf, buf.length, serverAddr, serverPort); Log.d("UDP", "C2: Sending: '" + new String(buf) + "'"); /* Send out the packet */ while (true) { socket.send(packet); Log.d("UDP", "C: Sent."); Log.d("UDP", "C: Done."); Thread.sleep(10000); } } catch (Exception e) { Log.e("UDP", "C3: Error", e); CloseClientSocket(socket); } } public boolean CloseClientSocket(DatagramSocket clientSocket) { clientSocket.close(); return true; } }
Mutasd a teljes hozzászólást!

  • Ha csak az kell hogy 10mp-enként küldj egy választ akkor minek 2 szál? Abba a szálban ahol fogadod az adatokat figyeld az időt és ott növelj 1 számlálót másodpercenként. Ha eltelik 10 másodperc küldesz adatot,majd számlálót nullázol.
    Mutasd a teljes hozzászólást!
  • Hmm lehet nem nagyon látom át a kódodat, de azért kapsz NUll Pointer Exception-t, mert:

    // Kickoff the Client Receivehread = new Thread(new AnotherSideUDPClient()); Receivehread.start();
    itt nem inicializálod a Receivehread lévő socketet, amit elvileg sendHeloToServer() metódussal csinálsz az AnotherSideUDPClient() osztályban. csak ezt nem hívod meg csak a start-ot...nem is kell meghívnod, vagy másik ilyen osztályt csinálnod, elég ez:

    // Kickoff the Client Receivehread = new Thread(this); Receivehread.start();

    Megjegyzés:
    - Inkább csinálj rendes konstruktorokat, amiben inicializálod a socket stb.. átláthatóbb legyen

    - Deklarálj egy private static volatile boolean enough = false; és ezzel le tudod állítani a while ciklust... (while(!enough){})
    Jah meg plusz egy setter metódus erre a flagre.

    -Előttem lévő írta hogy erre elég lenne egy szál is...pl ha jön adat akkor küldjön valamit..



    üdv Ákos
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd