开发目的:服务器端只能接收一个客户端,当连接的客户端断开后,其他客户端才能再连接服务器。但是现在很奇怪,当已经有一个客户端连接上服务器后,其他的客户端clientSocket调用connect()后,服务器端对这个连接没有反应,但是clientSocket.isConnect()竟然是true,我很纳闷,大家帮我分析一下。服务器端代码如下:
public class Server {

    private Socket socket = null;
    private ServerSocket serversocket = null;
    private InetAddress inetAddress=null;
    private int clientCnt = 0;    
public Server()
{
try {
serversocket = new ServerSocket(6000);
System.out.println("listen...");
} catch (IOException e) {

e.printStackTrace();
}
while(true)//监听客户端连接
 {
if(clientCnt == 0)
{
try {
socket = serversocket.accept();
} catch (IOException e) {

e.printStackTrace();
}
                           clientCnt++;//如果发现客户端断开,clientCnt--(这里没有给出代码)
inetAddress=socket.getInetAddress();
System.out.println(inetAddress.getHostAddress() + "发来连接");
try {
OutputStream output = socket.getOutputStream();
Thread thread = new Thread(new SendMessage(output,socket));
thread.start();
} catch (IOException e) {

e.printStackTrace();
}
}
 } 
}


public static void main(String[] args) {

new Server();
}
       class SendMessage implements Runnable
{
private Socket socket;
private OutputStream output = null;
private Boolean isConnect = true;
public SendMessage(OutputStream output,Socket socket) 
{
this.output = output;
this.socket = socket;
}
public synchronized void run()
{
final String record = "abcd";
Timer timer = new Timer(2000,new ActionListener()
{
public void actionPerformed(ActionEvent e) {

PrintWriter out=new PrintWriter(output,true);
out.println(record);
try {
Thread.sleep(100);
} catch (InterruptedException e1) {

e1.printStackTrace();
}
}
});
timer.start();
while(isConnect)
{
try {  
socket.sendUrgentData(0);  
} catch (IOException e) { 

System.out.println("客户端断开了");
clientCnt--;
isConnect = false;
timer.stop();
}  

    try {
Thread.sleep(1000);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
}

}

}

解决方案 »

  1.   

    PrintWriter out=new PrintWriter(output,true);
    自动flush
      

  2.   


    while(true)//监听客户端连接
    {
    if(clientCnt == 0)
    {
    try {
    socket = serversocket.accept();
    } catch (IOException e) {e.printStackTrace();
    }
    clientCnt++;accept一个client后, clientCnt++,
    循环回来, clientCnt!=0 if为假 怎么还会执行下面的accept呢??
      

  3.   

    Client端肯定显示已连接啊,你服务器只是没有accept那个连接而已,但是serversocket是与client端socket建立了连接的啊!
      

  4.   

    支持一楼意见,写入数据后,未能Flush。
    2楼的AutoFlush,指的是当缓冲区写满时自动清空缓冲区。
    但,楼主写入的数据,未能将缓冲区写满,所以,要手动Flush将数据推送至接收方。另外,
    既然服务端只响应一个客户端的请求,if(clientCnt == 0)就是一个败笔,因为,响应完第一个客户的请求后,后面的客户无法得到响应。AND,
    Thread thread = new Thread(new SendMessage(output,socket));这条语句,可以省略创建新线程来处理响应过程,因为,一个主线程完全可以搞定一个客户端的响应过程,同时不用处理其他事情。