我一直在聊天室工作。
Multi Threaded Server接受客户端
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中删除用户/套接字,然后更新它以显示没有连接客户端。
答案 0 :(得分:2)
您需要检查所有读取和扫描程序调用的流结束条件。你不是在任何地方都这样做。 isConnected()
方法不会这样做。它只会告诉您你是否曾连接此套接字。。当对等设备断开连接时,它不会神奇地变为错误。那时isClosed()
也没有神奇地成为现实。