ObjectStreams (input/output) og tråde
Hejsa alle eksperter. Jeg er ved at lave et miniprojekt under min datamatikeruddannelse og har i den forbindelse brug for lidt hjælp.Et af kravene er at applikationen anvender en tråd hos klienten til at håndtere data og hver klient får en seperat tråd hos serveren.
Anyways - problemet er, at mine klienter aldrig får oprettet deres ObjectInputStream på trods af, at der er forbindelse til serveren og denne har oprettet dens ObjectOutputStream.
Jeg har kun vedlagt de tråde der oprettes af klient/server - selve applikationen kan ikke noget endnu.
Note til server: denne har i main-metoden en simpel while løkke som tager imod clienter på en ventende ServerSocket (rettere: socket = serversocket.accept()) og giver denne videre til tråden.
Jeg håber i kan hjælpe mig - er det en deadlock der opstår og i så fald, hvordan kan jeg afhjælpe det ?
Jeg har sat pointene lidt højt da der er en del kode, der skal kigges igennem.
----------Kode Klient
/**
* @author ilm
*
* To change this generated comment edit the template variable "typecomment":
* Window>Preferences>Java>Templates.
* To enable and disable the creation of type comments go to
* Window>Preferences>Java>Code Generation.
*/
package client;
import java.io.*;
import java.net.*;
public class PacketHandler implements Runnable {
protected String host;
protected String requestString;
protected int port;
protected ObjectInputStream dataIn;
protected ObjectOutputStream dataOut;
protected Thread listener = null;
Socket socket;
boolean Stopped = false;
public PacketHandler(String host, int port) {
this.host = host;
this.port = port;
}
public synchronized void start() throws IOException {
{
socket = new Socket(host, port);
if (listener == null) {
try {
dataOut = new ObjectOutputStream(socket.getOutputStream());
dataIn = new ObjectInputStream(socket.getInputStream());
} catch (IOException ex) {
System.out
.println("Der skete en IOException i packethandler.java");
socket.close();
throw ex;
}
}
}
}
public synchronized void stop() throws IOException {
if (listener != null) {
Stopped = true;
dataOut.close();
dataIn.close();
listener = null;
}
}
public synchronized void run() {
try {
while (!Stopped) {
//kommenteret væk for at få skidtet til at virke med en streng først.
// ServerTilKlientPakke s2kpakke = (ServerTilKlientPakke)
// dataIn.readObject();
// System.out.println(s2kpakke.getHandling());
// send String
send();
}
} catch (IOException ex) {
if (!Stopped) {
System.out.println(ex);
}
}
}
public synchronized void send() throws IOException {
try {
dataOut.writeObject("dette er en pakke");
dataOut.flush();
} catch (Exception e) {
System.out.println(e);
}
;
}
}
------------- Kode Server -------------------
/*
* Java Network Programming, Second Edition
* Merlin Hughes, Michael Shoffner, Derek Hamner
* Manning Publications Company; ISBN 188477749X
*
* http://nitric.com/jnp/
*
* Copyright (c) 1997-1999 Merlin Hughes, Michael Shoffner, Derek Hamner;
* all rights reserved; see license.txt for details.
*/
package server;
import java.io.*;
import java.net.*;
import java.util.*;
import client.KlientTilServerPakke;
import client.ServerTilKlientPakke;
public class SpillerHandler implements Runnable {
protected Socket socket;
protected ObjectInputStream dataIn;
protected ObjectOutputStream dataOut;
protected Thread listener;
protected ArrayList handlers = new ArrayList();
public SpillerHandler(Socket socket) {
this.socket = socket;
}
public void run() {
try {
handlers.add(this);
KlientTilServerPakke nyPakke = null;
String message = "Her skal vi sige noget.";
while (!Thread.interrupted()) {
if (dataIn.readObject() != null) {
// nyPakke = (KlientTilServerPakke) dataIn.readObject();
String testmodtaget = (String) dataIn.readObject();
System.out.println(testmodtaget);
//send en streng istedet for.
// ServerTilKlientPakke returPakke = new
// ServerTilKlientPakke('A', 0, 0, 'W', "Martin", "Karl");
// broadcastObject(returPakke);
broadcast(message);
// broadcast(nyPakke.getAfsender());
}
}
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
handlers.remove(this);
}
stop();
}
public synchronized void start() {
if (listener == null) {
try {
dataOut = new ObjectOutputStream(new BufferedOutputStream(
socket.getOutputStream()));
dataIn = new ObjectInputStream(new BufferedInputStream(socket
.getInputStream()));
listener = new Thread(this);
listener.start();
} catch (IOException ex) {
System.out.println(ex.getMessage());
System.out.println(socket.getRemoteSocketAddress());
}
}
}
public synchronized void stop() {
if (listener != null) {
try {
if (listener != Thread.currentThread())
listener.interrupt();
listener = null;
dataOut.close();
System.out.println(socket.getRemoteSocketAddress()
+ " --- stop");
} catch (IOException ex) {
System.out.println(ex.getMessage());
System.out.println(socket.getRemoteSocketAddress());
}
}
}
protected synchronized void broadcast(String message) {
synchronized (handlers) {
int i = 0;
while (i < handlers.size()) {
SpillerHandler handler = (SpillerHandler) handlers.get(i);
i++;
try {
handler.dataOut.writeUTF(message);
handler.dataOut.flush();
} catch (IOException ex) {
handler.stop();
}
}
}
}
protected synchronized void broadcastObject(ServerTilKlientPakke pakke) {
synchronized (handlers) {
int i = 0;
while (i < handlers.size()) {
SpillerHandler handler = (SpillerHandler) handlers.get(i);
i++;
try {
handler.dataOut.writeObject(pakke);
handler.dataOut.flush();
} catch (IOException ex) {
handler.stop();
}
}
}
}
}