java 非阻塞io模型(按照自己的想法实现 很low的一个模型)

突然想写个代码,一个线程处理多个tcp通讯。

包结构

--base

--cache

--cli

--server

package com.self.socket.base;

import java.io.*;
import java.net.Socket;

/**
 */
public class BaseSocket {
    public static  String ip="localhost";
    public static  int port =10086;
    protected  Socket socket=null;
    protected  OutputStream outputStream=null;
    protected  PrintWriter printWriter=null;
    protected InputStream inputStream=null;
    protected BufferedReader bufferedReader=null;

    protected  void ioStream() {
        try {
            inputStream = socket.getInputStream();
            bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
            printWriter=new PrintWriter(socket.getOutputStream());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    protected  void write(String str){
        printWriter.println(str);
        printWriter.flush();
    }
    protected   void close(){
        try {
            printWriter.close();
            outputStream.close();
            socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

public class SocketCache {
    //存放socket  一直遍历循环 检测是否有数据过来
    public  static ConcurrentHashMap<Integer,ServerWork> cacheSocket=new ConcurrentHashMap<Integer, ServerWork>();
}


package com.self.socket.cli;
import com.self.socket.base.BaseSocket;
import java.io.*;
import java.net.Socket;
import java.util.Scanner;

/**
 */
public class MySocketCli extends BaseSocket implements Runnable{

    public static void main(String[] args) {
        MySocketCli mySocketCli=new MySocketCli();
        mySocketCli.run();
    }
    public void run() {
        try {
            socket = new Socket(ip, port);
            ioStream();
            Scanner scanner = new Scanner(System.in);
            String print = "";
            do {
                System.out.print("请输入:");
                print = scanner.nextLine();
                write(print);
                String result=bufferedReader.readLine();
                System.out.println("server response:"+result);
            } while (!print.equals("quit"));
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            close();
        }

    }
}

package com.self.socket.server;
import com.self.socket.base.BaseSocket;
import com.self.socket.cache.SocketCache;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.*;

/**
 */
public class RegisterSocket extends BaseSocket{
    //存放socket任务
    static LinkedBlockingQueue queue=new LinkedBlockingQueue();
    public static void main(String[] args) {
        ServerSocket serverSocket= null;
        try {
            serverSocket = new ServerSocket(port);
            work();
           for(;;){
               Socket  socket=serverSocket.accept();
               System.out.println("一个新客户端进来了!");
               ServerWork serverWork =new ServerWork(socket);
               SocketCache.cacheSocket.put(serverWork.hashCode(), serverWork);
           }
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            try {
                serverSocket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    private static void work(){
        new Thread(new Runnable() {
            public void run() {
                ExecutorService executorService= Executors.newFixedThreadPool(1);

                executorService.execute(new Runnable() {
                    @Override
                    public void run() {
                        try {
                            for(;;){
                                ServerWork serverWork = (ServerWork)queue.take();
                                serverWork.doGet();
                            }
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                });
                for (;;) {
                    for (ServerWork serverWork:SocketCache.cacheSocket.values()) {
                        if(serverWork.isAvailable()){
                            try {
                                System.out.println("name:"+serverWork.hashCode());
                                queue.put(serverWork);
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                        }
                    }

                }
            }
        }).start();

    }

}

package com.self.socket.server;
import com.self.socket.base.BaseSocket;
import com.self.socket.cache.SocketCache;
import java.io.*;
import java.net.Socket;

/**
 */
public class ServerWork extends BaseSocket{
    private StringBuffer sb=new StringBuffer();
    public ServerWork(Socket socket) {
        this.socket=socket;
        ioStream();
    }
    public synchronized boolean isAvailable(){
        try {
            if(inputStream.available()>0){
                sb.append(bufferedReader.readLine());
                return true;
            }
            return false;
        } catch (IOException e) {
            e.printStackTrace();
            close();
            SocketCache.cacheSocket.remove(this.hashCode());
            return false;
        }
    }
    public synchronized void doGet() {
        System.out.println(Thread.currentThread().getName()+" server is running");
        String result=sb.toString();
        sb.setLength(0);
        System.out.println("结果:"+result);
        write("ok");
    }
}


启动:运行 RegisterSocket 和 MySocketCli  main方法;




评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值