接上一篇
上一篇的demo是这样的
//服务端
public class SocketServer {
public static void main(String[] args) throws IOException {
try{
ServerSocket server = new ServerSocket(7777);
System.out.println("开始对端口7777进行监听");
while(true){
Socket sc=server.accept();
DataInputStream din=new DataInputStream(sc.getInputStream());
DataOutputStream dout=new DataOutputStream(sc.getOutputStream());
System.out.println("客户端ip地址是:"+sc.getInetAddress());
System.out.println("客户端端口号是:"+sc.getPort());
System.out.println("本地端口号是:"+sc.getLocalPort());
System.out.println("客户端消息是:"+din.readUTF());
dout.writeUTF("已收到你发来的消息!!");
/**
* PS:用完一次就关闭,再用再开,用完再关,这就是短链接!
* 用完不关,一直挂着,再用,还连这里,这就是长链接!
* 如下,注释掉下面的几个.close();就是长连接!
* @Author qinzy
*/
din.close();//可以注释掉
dout.close();//可以注释掉
sc.close();//可以注释掉
server.close();//可以注释掉
}
}catch(Exception e){
e.printStackTrace();
}
}
}
思路:
这里不说短链接,短链接没问题,用完就关了;
既然是长链接,就不能一直new客户端来链接服务端,应该是new一个,然后心跳检查、链接保持,然后一直用这一个链接的流来做自己想做的事情!
问题来了
上面的demo不支持上面的思路,server.accept()阻塞在那里只接受new出来的客户端,其他骚操作根本进不来,咋办?
思路:
循环套循环,你外面循环接收new的client,我里面循环做自己的骚操作,做完骚操作退出,互不影响!
上菜
//服务端
public class SocketServer {
public static void main(String[] args) throws IOException {
try{
ServerSocket server = new ServerSocket(7777);
System.out.println("开始对端口7777进行监听");
while(true){
Socket sc=server.accept();
while(true){
DataInputStream din=new DataInputStream(sc.getInputStream());
DataOutputStream dout=new DataOutputStream(sc.getOutputStream());
System.out.println("客户端ip地址是:"+sc.getInetAddress());
System.out.println("客户端端口号是:"+sc.getPort());
System.out.println("本地端口号是:"+sc.getLocalPort());
System.out.println("客户端消息是:"+din.readUTF());
dout.writeUTF("已收到你发来的消息!!");
/**
* PS:用完一次就关闭,再用再开,用完再关,这就是短链接!
* 用完不关,一直挂着,再用,还连这里,这就是长链接!
* 如下,注释掉下面的几个.close();就是长连接!
* @Author qinzy
*/
din.close();//可以注释掉
dout.close();//可以注释掉
sc.close();//可以注释掉
server.close();//可以注释掉
if(达到条件){
break;
}
}
}
}catch(Exception e){
e.printStackTrace();
}
}
}
思路:
这样貌似可以了,但是谁也不知道你的骚操作有多骚,骚不完咋办?这样所有的client都进不来了,只能等你骚完;但是这样不合适啊,你骚,你不让大家骚,这样很容易出问题的,那咋整?大家一起骚撒!
菜不够硬,继续上
public void run(String... args) throws Exception {
try{
ServerSocket server = new ServerSocket(7777);
System.out.println("开始对端口7777进行监听");
while(true){
Socket sc=server.accept();
// task开多线程
new Thread(new Task(sc)).start();
}
}catch(Exception e){
e.printStackTrace();
}
}
class Task implements Runnable{
private Socket sc;
public Task(Socket sc) {
this.sc = sc;
}
@Override
public void run() {
try {
handleClient(sc);
} catch (IOException e) {
e.printStackTrace();
}
}
}
private void handleClient(Socket sc) throws IOException {
while(true){
DataInputStream din=new DataInputStream(sc.getInputStream());
DataOutputStream dout=new DataOutputStream(sc.getOutputStream());
System.out.println("客户端ip地址是:"+sc.getInetAddress());
System.out.println("客户端端口号是:"+sc.getPort());
System.out.println("本地端口号是:"+sc.getLocalPort());
System.out.println("客户端消息是:"+din.readUTF());
dout.writeUTF("已收到你发来的消息!!");
}
}
这样每个client进来都开一个task去单独维护自己的业务,新的client过来不用等,直接再开一个,去做自己想做的,啥时候骚完,自己定,完美,结束!
没了
哦对了,心跳要自己做,要不然2小时的心跳,用处不是很大,或者改配置时间;