【发布时间】:2015-01-06 11:20:04
【问题描述】:
我一直在开发聊天室。
多线程服务器接受客户端
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 multithreading sockets tcp