Eğitim amaçlı olarak, sunucunun birden çok istemciden veri aldığı ve her bir iletiyi yankıladığı bir sunucu ve istemci yapmaya çalıştım. Sorun, sunucunun ekoyu aynı anda tüm istemcilere göndermeye çalıştığı zamandır.Tür kapama örneği yok ...
public class SocketServer {
ArrayList<MyRunnable> ts = new ArrayList<MyRunnable>();
ServerSocket serv;
static MainServerThread mst = new MainServerThread();
// ^IDE(eclipse) underlines this as the problem
SocketServer() {
EventQueue.invokeLater(mst);
}
public static void main(String[] args) {
Thread tr = new Thread(mst);
tr.start();
}
void send(String s) {
for (int i = 0; i < ts.size(); i++) {
MyRunnable tmp = ts.get(i);
tmp.sendToClient(s);
}
}
class MainServerThread implements Runnable {
public void run() {
try {
serv = new ServerSocket(13131);
boolean done = false;
while (!done) {
Socket s = serv.accept();
MyRunnable r = new MyRunnable(s);
Thread t = new Thread(r);
ts.add(r);
t.start();
}
} catch(Exception e) {
e.printStackTrace();
}
}
}
class MyRunnable implements Runnable {
Socket sock;
PrintWriter out;
Scanner in;
MyRunnable(Socket soc) {
sock = soc;
}
public void run() {
try {
try {
out = new PrintWriter(sock.getOutputStream(), true);
in = new Scanner(sock.getInputStream());
boolean done = false;
while (!done) {
String line = in.nextLine();
send("Echo: " + line);
System.out.println("Echo: " + line);
if (line.trim().equals("BYE")) done = true;
}
} finally {
sock.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
public void sendToClient(String s) {
out.println(s);
}
}
}
Aradım ve cevap verdim ve benzer birçok soru gördüm, ancak bunların hiçbiri bana yardımcı olmadı. Umarım benim hatamı gösterebilirsin. Şimdiden teşekkürler.
Olası kopyası [Java - Foo türünde kapalı örnek yok erişilebilir] (http://stackoverflow.com/questions/9560600/java-no-enclosing-instance-of-type-foo-is-accessible) – Raedwald