美文网首页
Sockert通讯方式小结

Sockert通讯方式小结

作者: JTaylor | 来源:发表于2018-07-27 18:19 被阅读0次

同步阻塞模式

利用长轮询实现持续监听,利用socketserver.accept()进行阻塞。
在一个由volatile变量控制的while循环中,不断尝试serversocket.accept()方法,当没有socket进行连接时,程序会阻塞在该方法>上,当有socket连接时,则获得这个socket,传递给工作线程池,并继续等待。这种方式在处理高并发情况下会创建过多的socket连接,导致消耗大量内存。

服务端代码


public class ServerStarterextends Thread {
    private static volatile boolean flag =true;
    private ServerSocketserverSocket =null;
    private ExecutorServiceserverThreadPool;
    ServerStarter( int port) {
        ThreadFactory threadFactory =new ThreadFactoryBuilder()
.setNameFormat("server-pool-%d").build();
        serverThreadPool =new ThreadPoolExecutor(10, 10,
                1000, TimeUnit.MILLISECONDS,
                new LinkedBlockingQueue(1024), threadFactory, new ThreadPoolExecutor.AbortPolicy());
        try {
serverSocket =new ServerSocket(port);
        }catch (IOException e) {
e.printStackTrace();
        }
}

@Override
    public void run() {
while (flag) {
try {
Socket sock =serverSocket.accept();
                SocketTask s =new SocketTask(sock);
                serverThreadPool.submit(s);
            }catch (IOException e) {
System.out.println("system shutdown");
            }
}
}

在创建线程池时,推荐使用阿里编程规约中推荐的利用线程池构造器来进行构造,这种方式可以对线程池的线程进行命名,便于日后的调试与维护。
这里这我们创建了一个线程池来独立处理每一个socket连接,从而实现了对多客户端同时访问的支持,下面是任务线程类示范

 public void client() {
        try {
            Socket socket = new Socket(serverhost, serverport);
            dojob();
            writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
            writer.write(msg);
            writer.newLine();
            writer.flush();
            try {
                /**获取一个输入流,接收服务端的信息*/
                InputStream inputStream = socket.getInputStream();
                /**包装成字符流,提高效率*/
                InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
                /**缓冲区*/
                BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
                String t = bufferedReader.readLine();
                dosomething();
            } catch (Exception e) {
                System.out.println("server send wrong data");
            }
            socket.close();
        } catch (UnknownHostException e) {
            System.out.println("host not found");
        } catch (IOException e) {
            System.out.println("server holding");
        }
    }

相关文章

  • Sockert通讯方式小结

    同步阻塞模式 利用长轮询实现持续监听,利用socketserver.accept()进行阻塞。在一个由volati...

  • 通讯方式

    父传子:props 子传父:props传一个回调函数 触发父组件的方法并把参数传过去 兄弟组件通信:消息订阅(Ev...

  • Android 即时通讯开发小结(二)

    《Android 即时通讯开发小结》基于IM Andriod 开发的各种常见问题,结合网易云信即时通讯技术的实践,...

  • Android 即时通讯开发小结(一)

    《Android 即时通讯开发小结》基于IM Andriod 开发的各种常见问题,结合网易云信即时通讯技术的实践,...

  • 话说通讯——原始的通讯方式

    击鼓传令 音响通信,古已有之。 约在3000多年前,我们中华民族的祖先就用铜做成直径约为2~3米的金鼓,击鼓为令,...

  • 命题_第十四章_选择题

    计算机常用的通讯方式有() A.同步通讯B.异步通讯C.串行通讯D.并行通讯 解析:C;D

  • iOS基础--即时通讯的简单总结

    即时通讯是目前最为流行的通讯方式. 即时通讯的多种实现方式: XMPP,环信,融云. XMPP基于XML的点对点的...

  • 【王兴国营养特训班】第5期第11课7组虞文施

    细胞通讯和分化、干细胞、细胞衰老和死亡、癌细胞 细胞通讯 细胞通讯的方式:直接通讯:间隙连接、膜表面分子接触通讯、...

  • [转]进程通讯方式

    进程间通信(IPC,InterProcess Communication)是指在不同进程之间传播或交换信息。IPC...

  • 组件间通讯方式

      组件化,在工程组成结构角度讲,也可称为模块化。最终目的是为了解藕。  本文总结了组件间交互方式及原理,不涉及到...

网友评论

      本文标题:Sockert通讯方式小结

      本文链接:https://www.haomeiwen.com/subject/yjigmftx.html