当客户端断开连接时,服务器不会 remove/disconnect 套接字
Server does not remove/disconnect socket when Client disconnects
我一直在开发聊天室。
多线程服务器接受客户端
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);
}
}
});
按下连接按钮后,它将run 无限循环以接受客户端。对于它连接的每个客户端,它会将其广告到名为 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 中删除 user/socket 然后更新它以显示没有客户端连接。
您需要检查所有读取和扫描程序调用的流结束条件。你没有在任何地方这样做。 isConnected()
方法不会那样做。它只告诉你 你 是否连接过 这个套接字。。当对等方断开连接时,它不会神奇地变为假。 isClosed()
也没有在那个时候神奇地成为现实。
我一直在开发聊天室。
多线程服务器接受客户端
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);
}
}
});
按下连接按钮后,它将run 无限循环以接受客户端。对于它连接的每个客户端,它会将其广告到名为 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 中删除 user/socket 然后更新它以显示没有客户端连接。
您需要检查所有读取和扫描程序调用的流结束条件。你没有在任何地方这样做。 isConnected()
方法不会那样做。它只告诉你 你 是否连接过 这个套接字。。当对等方断开连接时,它不会神奇地变为假。 isClosed()
也没有在那个时候神奇地成为现实。