Java-Server-sockel stecken, auf accept call (Android-Client, Java-Server)
Unten habe ich ein fragment von code zu verstehen mein problem. Ich habe einen server-code, funktioniert gut, für das erste mal, das der client lädt und sendet ein Paket. Nach dem das erste Paket empfangen wird, der server ist fest auf "akzeptieren".
Habe ich wireshark konfiguriert für diesen port, und der server ist immer diese Pakete. Ich Frage mich nur, warum akzeptieren Sie nicht mehr zurück als einmal. Seine mich verrückt.
Server-Code
public class DAPool implements Runnable {
private ServerSocket serverSocket;
private ArrayList<DA> pool;
private LinkedList<Socket> clientConnQ;
public DAPool(int newPoolSize, int serverPort) {
try {
serverSocket = new ServerSocket(serverPort, 500, InetAddress.getByName("127.0.0.1"));
} catch (IOException e) {
e.printStackTrace();
return;
}
poolSize = newPoolSize;
clientConnQ = new LinkedList<Socket>();
pool = new ArrayList<DA>(poolSize);
DA deviceThread;
for (int threads = 0; threads < poolSize; threads++) {
deviceThread = new DA();
connPool.add(deviceThread);
deviceThread.start();
}
}
public void run() {
while (true) {
Socket incomingSocket;
try {
incomingSocket = serverSocket.accept();
} catch (IOException e) {
e.printStackTrace();
return;
}
insertNewConnToQ(incomingSocket);
}
}
private class DA extends Thread {
private Socket clientSocket;
private ObjectInputStream inputObjectStream;
public DA() {
}
public void run() {
while (true) {
while (clientConnQ.isEmpty()) {
synchronized (clientConnQ) {
try {
clientConnQ.wait();
} catch (InterruptedException ignored) {
ignored.printStackTrace();
}
}
}
synchronized (clientConnQ) {
clientSocket = (Socket) clientConnQ.removeFirst();
try {
inputObjectStream = new ObjectInputStream(clientSocket.getInputStream());
} catch (IOException e) {
e.printStackTrace();
return;
}
//Do something useful here
}
}
}
}
}
Client-Code
public class SendQueue extends Thread {
LinkedList<Message> requestQ;
Message sendRequest, requestMessage;
Socket clientSocket;
OutputStream outputStream;
ObjectOutputStream objectOutputStream;
public SendQueue(Socket newClientSocket) {
requestQ = new LinkedList<Message>();
clientSocket = newClientSocket;
}
public void run() {
while (true) {
synchronized (requestQ) {
while (requestQ.isEmpty()) {
try {
requestQ.wait();
} catch (InterruptedException ignored) {
ignored.printStackTrace();
}
}
sendRequest = requestQ.removeFirst();
}
try {
outputStream = clientSocket.getOutputStream();
objectOutputStream = new ObjectOutputStream(outputStream);
objectOutputStream.writeObject(sendRequest);
objectOutputStream.flush();
outputStream.flush();
} catch (IOException e) {
e.printStackTrace();
} catch (RuntimeException e) {
e.printStackTrace();
}
}
}
public int sendRequest(Message message) {
synchronized (requestQ) {
requestQ.addLast(message);
requestQ.notify();
}
return 0;
}
}
- Bitte formatieren Sie Ihren code mit
code
Taste auf dem Bedienfeld. - ersten timer, nur Festnetz. sieht jetzt besser denke ich
- Was genau ist dein problem? Sie sagen, dass accept() nicht zurück, aber es ist genau so wie es funktionieren soll. Es ist warten auf die nächste Verbindung. Haben Sie versucht, die Verbindung mehr als einmal? Es ist nicht klar, aus Ihrer Frage.
- Ok, habe ich versucht zu erstellen, die den clientSocket wieder, und es scheint zu funktionieren. <pre><code> try { clientSocket = new Socket(InetAddress.getByName("10.0.2.2"), 32123); } catch (IOException e) { e.printStackTrace(); return; }</code></pre>
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sehe ich nicht ein timeout gesetzt, auf die serverSocket.
ServerSocket.accept()
ist eine blockierende operation, so wird es blockiert, bis entweder ein Fehler Auftritt, wird ein timeout Auftritt, oder eine Verbindung akzeptiert wird.Versuchen
Du auch nicht zu sein scheinen, schließen Ihre streams, wenn Ihr fertig.
Sind Sie sicher, dass es klebt auf den Anruf entgegennehmen? Hast du einen stacktrace, der zeigt, dass es warten auf akzeptieren?
Vorausgesetzt, es ist immer stecken, Stelle ich wundere mich, wenn es ist nicht, weil clientConnQ gehalten wird, in einem Ihrer DA Instanzen. Der synchronisierte block umfasst die //etwas sinnvolles Tun hier Abschnitt.
Frage ich mich, ob es funktionieren könnte, wenn Sie geändert werden den code
Sobald Sie Ihre clientSocket aus clientConnQ dann keine andere Instanz verarbeiten kann, dass socket.
Ok, wenn ich einen Dollar für jedes mal, wenn ich fragte eine dumme Frage 🙂
Hier geht. Client socket verbindet und das ist, wenn ein server erhält einen Anruf entgegennehmen. Für einige dumme Grund wartete ich auf akzeptieren zum empfangen von Daten von dem client. Infact, ich sollte nur warten, bis etwas auf den "stream" und dann den stream. Ich sollte nicht warten auf das akzeptieren der für diese Verbindung.
Akzeptieren ist genannt zu werden, "connect", um die Buchse nicht zu erhalten kontinuierlich die Daten.
Vielen Dank für Ihre ganze Hilfe. Sie Zwang mich zu denken über die thread-Synchronisierung, das design, die Steckdosen im Allgemeinen und schließlich erreichen, dass sich die Lösung.
Fantastische Antworten Leute. Danke.
Siddharth