2
我一直在聊天室工作。客户端断开连接时,服务器不会移除/断开套接字
多线程服务器接受客户
btnConnect.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
try{
int port = 2345;
ServerSocket server = new ServerSocket(port);
System.out.println("Waiting for clients");
Thread thread = new Thread(){
public void run(){
while(true){
Socket socket;
try {
socket = server.accept();
gui.AddUserToList(socket);
ConnectionArray.add(socket);
ChatClient chat = new ChatClient(socket,gui);
Thread x = new Thread(chat);
x.start();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
};
thread.start();
}
catch(IOException error){
System.out.println(error);
}
}
});
当按下连接按钮,它将运行一个无限循环,接受客户。对于它连接的每个客户端,它将其广告到名为AddUserToList的ListArray。
创建一个ChatClient,并在Thread构造函数中传递该对象。
public void isConnected(){
if(!socket.isConnected()){
for(int i = 1; i <= GUI.ConnectionArray.size(); i++){
if(GUI.ConnectionArray.get(i) == socket){
GUI.ConnectionArray.remove(i);
gui.updateList();
}
}
}
}
@Override
public void run() {
try
{
try
{
input = new Scanner(socket.getInputStream());
out = new PrintWriter(socket.getOutputStream());
while(true)
{
isConnected();
if(!input.hasNext())
return;
message = input.nextLine();
for(int i = 1; i <= GUI.ConnectionArray.size(); i++){
Socket tmpSocket = (Socket) GUI.ConnectionArray.get(i-1);
PrintWriter tmpOut = new PrintWriter(tmpSocket.getOutputStream());
tmpOut.println(message);
tmpOut.flush();
//System.out.println("Sent");
}
}
}
finally
{
socket.close();
}
}
catch(IOException io){
System.out.println(io);
}
}
如果没有消息,则应检查连接。当我断开我的客户端。
while(true)
{
isConnected();
if(!input.hasNext())
return;
由于没有发送任何内容,因此该行应该返回,那么为什么程序会卡住试图收听消息?
真的没有办法关闭套接字吗?因为我需要从ArrayList中删除用户/套接字,然后更新它以显示没有客户端连接。
嘿,对不起,我是一个插座编程的新手。我搜索了“流条件Java”并找不到任何资源来扩展您的答案。 你是对的,我也谷歌isConnected()方法和其他人说你说的同样的事情。 我只是在“流条件”,“扫描仪调用”和“DLL”丢失。 对不起,如果我听起来很天真 – Moynul
'read()'在流结束时返回-1; 'hasNext()'和'hasNextLine()'返回false; 'readLine()返回null。 – EJP
非常感谢!我做了if(message == null),它工作,因为它返回false!感谢:D – Moynul