开发目的:服务器端只能接收一个客户端,当连接的客户端断开后,其他客户端才能再连接服务器。但是现在很奇怪,当已经有一个客户端连接上服务器后,其他的客户端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();
}
}
}
}
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();
}
}
}
}
自动flush
while(true)//监听客户端连接
{
if(clientCnt == 0)
{
try {
socket = serversocket.accept();
} catch (IOException e) {e.printStackTrace();
}
clientCnt++;accept一个client后, clientCnt++,
循环回来, clientCnt!=0 if为假 怎么还会执行下面的accept呢??
2楼的AutoFlush,指的是当缓冲区写满时自动清空缓冲区。
但,楼主写入的数据,未能将缓冲区写满,所以,要手动Flush将数据推送至接收方。另外,
既然服务端只响应一个客户端的请求,if(clientCnt == 0)就是一个败笔,因为,响应完第一个客户的请求后,后面的客户无法得到响应。AND,
Thread thread = new Thread(new SendMessage(output,socket));这条语句,可以省略创建新线程来处理响应过程,因为,一个主线程完全可以搞定一个客户端的响应过程,同时不用处理其他事情。