socket深入篇

接上一篇

上一篇的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小时的心跳,用处不是很大,或者改配置时间;

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值