Java'da soketli bir sohbet uygulaması programlıyorum. Sunucuya bağlı istemciler olduğu için birçok kez çağrılan bu yönteme sahibim.Yuvalar - Sunucu bağlantıyı kestiğinde bir istemcinin bağlantısını keser
public class ClientInfo implements Serializable
{
public ObjectOutputStream writer;
public ObjectInputStream reader;
public String user_name;
public ClientInfo(ObjectOutputStream writer, ObjectInputStream reader, String name)
{
this.reader = reader;
this.writer = writer;
this.user_name = name;
}
}//end class
istemci tarafında
/*Client side code*/
void remove_online_user(ClientInfo client_to_remove)
{
try
{
client_to_remove.reader.close(); //this should trigger server handler in client
client_to_remove.writer.close();
}
catch (IOException e)
{
e.printStackTrace();
}
}//end remove_online_users()
, bu
client = new ClientInfo(
new ObjectOutputStream(client_socket.getOutputStream()),
new ObjectInputStream(client_socket.getInputStream()),
user_name);
new ServerHandler(client, this);
0 gibi
ClientInfo
nesne oluşturmak
Ve nihayet, ServerHandler (bütün kodunuzu yapıştırmak için üzgünüm, ben elimden geleni çalışıyorum bunu mümkün olduğunca yoğunlaşmasına)
class ServerHandler implements Runnable
{
private ClientInfo server;
private ClientBackEnd client_back_end;
public ServerHandler(ClientInfo server, ClientBackEnd client_back_end)
{
this.server = server;
this.client_back_end = client_back_end;
}//end constructor
/*method invoked by start() call in constructor, manages communication between client and server*/
public void run()
{
try
{
MessageInfo message;
while ((message = (MessageInfo) server.reader.readObject()) != null)
{
if (message.clients != null)
{
for (ClientInfo cd : message.clients)
{
if (client_back_end.listModel.contains(cd)) continue;
client_back_end.listModel.addElement(cd);
}
for (Object cd : client_back_end.listModel.toArray())
{
if (message.clients.contains(cd)) continue;
client_back_end.listModel.removeElement(cd);
}
}
else
{
System.out.println("\n" + message.message_contents);
}
}
}
catch (ClassNotFoundException | IOException e)
{
//This should trigger during the execution of remove_online_user();
client_back_end.disconnect_from_server();
}
}//end run()
Amacım ::
kullanıcı sunucuyu durdurur, tüm istemciler kesilmelidir. Remove_online_user() sırasında, ObjectInputStream/ObjectOutputStream öğesinin kapatılması, istemcilerde sunucu İşleyicisi'nde bir istisna tetiklemelidir. Ama şu anda değil. Neyi yanlış yapıyorum?
(Yeterince bilgi göndermek olmasaydı ben şimdiden özür dilerim;. Daha fazla bilgi gerekiyorsa bana bildirin ben 4 tüm .java dosyaları ile kimseyi flabbergast istemiyorum) will soket Kapanış
Hm, EOFException'ın bir IOException alt sınıfı olduğunu ve bu özel durumu tetikleyeceğini biliyorum. ReadObject() akışının sonunda null döndürmediğini söylerken ne demek istediğini anlamıyorum? Açıklayabilir misin? – user3487243
Bana tamamen açık bir ifade gibi görünüyor. Hangi kısmını anlamıyorsun? – EJP
"Akışın sonunda" anlamadığım şeydir. Hangi sebeple boşa dönmez? Bu benim soruma nasıl cevap veriyor? – user3487243