Problemer med klienterne, på multithreaded server.
Kære eksperter.Jeg kan simpelthen ikke gennemskue, hvorfor det ikke virker efter hensigten.
- Den compiler fint, kører fint, men når 2 klienter logger på, på samme tid, så vil den kun modtage/give respons til 1 af klienterne (den første), og hvis alle klienterne logger af, modtager den pludselig hele skidtet fra alle sammen, med det samme. Det er som om, at det hele står i kø, indtil de logger af.
Har følgende 3 filer:
//////////// main.java
package main;
public class main {
public static void main(String[] args) {
network net = new network();
net.startnet(8888, 6000000);
}
}
//////////// network.java
package main;
import java.net.*;
import java.io.*;
import java.util.*;
public class network {
public network() {
}
public void startnet(int port, int timeout) {
List list = new ArrayList();
ServerSocket server = null;
Socket socket = null;
//Trying to listen at port
try{
System.out.println("[server] : starting network.");
server = new ServerSocket(port);
}catch(BindException e){
System.out.println(" * Could not listen at: "+port+".");
e.printStackTrace();
}catch(IOException e){
System.out.println(" * Could not open server-socket.");
e.printStackTrace();
}finally{
System.out.println(" * Listening at port: "+port+".");
System.out.println(" * ServerSocket made: "+server+".");
System.out.println(" * server started ...");
}
//Trying to accept clients
while(true){
try{
socket = server.accept();
socket.setSoTimeout(600000);
//Start new thread
client client = new client(socket, list);
client.start();
}catch(IOException e){
System.out.println("[server] : Could not accept socket.");
e.printStackTrace();
}
}
}
}
/////////////// client.java
package main;
import java.net.*;
import java.io.*;
import java.util.*;
public class client extends Thread {
private BufferedReader read;
private PrintWriter write;
private List list;
private Socket sd;
public client(Socket socket, List list){
try{
this.sd = socket;
this.list = list;
read = new BufferedReader(new InputStreamReader(sd.getInputStream()));
write = new PrintWriter(sd.getOutputStream(), true);
}catch(IOException e){
e.printStackTrace();
}
connected();
}
public void run() {
connected();
}
public void connected(){
String buffer = "empty";
list.add(this);
while(buffer!=null){
buffer = recv();
System.out.println("Echo: "+buffer);
send("Echo: "+buffer);
}
destroy();
}
public void destroy() {
try{
read.close();
write.close();
sd.close();
}catch (NumberFormatException e){
e.printStackTrace();
}catch (UnknownHostException e){
e.printStackTrace();
}catch (IOException e) {
e.printStackTrace();
}finally{
System.out.println("disconnected.");
list.remove(this);
this.stop();
}
}
public String send(String msg){
write.println(msg);
write.flush();
return "#Write succesfully";
}
public String recv(){
String buffer = null;
try{
buffer=read.readLine();
}catch(IOException e){
return buffer;
}finally{
return buffer;
}
}
}
