上一节中还有很多需要优化
.accept()方法是阻塞执行的,阻塞,然后等待连接,一旦有客户端过来连接,那么这句代码就可以接着向下执行
如果没有客户端连接,那么会一直阻塞
现在,我想让一个人连完之后再执行accept接着连接第二个人,可以在外边加一个while(true)来一直执行,下面继续昨天的栗子
/**
* 服务端
*/
public class Server {
public static void main(String[] args) {
try {
ServerSocket ss = new ServerSocket(8888);
//阻塞执行 接受客户端的连接请求
System.out.println("服务端已启动...");
while(true){
Socket socket = ss.accept();
......
socket.close();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
运行Server
运行Client
此时Server的日志是
现在再运行第二个Client
这时结束第一个Client
这时第二个Client的日志是
这时Server的日志
按照以上思路修改Server.java
/**
* 服务端
*/
public class Server {
public static void main(String[] args) {
try {
ServerSocket ss = new ServerSocket(8888);
//阻塞执行 接受客户端的连接请求
System.out.println("服务端已启动...");
while(true){
Socket socket = ss.accept();
System.out.println("客户端进来了"+socket.getInetAddress());
//启动工作线程
new WorkThread(socket).start();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 处理客户端交互的工作线程
*/
static class WorkThread extends Thread{
private Socket socket;
public WorkThread(Socket socket){
this.socket = socket;
}
@Override
public void run(){
//获取输出流
try {
OutputStream os = socket.getOutputStream();
......
socket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
运行Server
运行Client
运行第二个Client
此时Server输出日志
现在有3个线程