• Java网络编程之终端聊天菜鸟版


    之前学习的一直都是javaweb,什么前端框架、SSM、nginx、数据库之类的,对于网络编程方面,我的了解可以说几乎为0。最近在工作中需要使用netty来实现一些内网通信的功能,这就比较尴尬了,瞬间感觉到这个世间充满了恶意,这不是专挑我的软肋下死手么?

    上网找了一些netty的讲解和示例,理论部分半懂不懂,实际上手也是参照着示例写代码,这还真是“网络编程”呢,我笑了。

    为了能学好这一块知识盲区,我决定从socket开始摸索,简单看了几篇文档,发现基础操作的话,似乎也不难,就想着先搞个极简版终端聊天练练手吧,为什么要搞终端聊天呢?(当然是因为不想学java的界面开发的知识),结果光速打脸了,这不应该呀?我这设想很美好,一个客户端、一个服务端,一边搞两个线程,一个线程负责发送数据,一个线程负责接收数据,至于接收数据的这个线程,怎么监听数据我不会搞,那就来个朴实无华又简单基础的循环加判断吧。然而,就是不能正常通信?

    最终在查阅了几篇文档之后,找到了问题所在,由于我的io流方面的知识知之甚少,所以就很尴尬了,貌似是数据没过去... ...

    代码如下(简单易懂且很菜,算是我自己备忘一下):

    public class SendHandler implements Runnable {
        PrintWriter writer = null;
        public SendHandler(PrintWriter writer) {
            this.writer = writer;
        }
        @Override
        public void run() {
            Scanner scanner = new Scanner(System.in);
            while (true) {
                writer.println(scanner.nextLine());
            }
        }
    }

    以上是发送数据的处理器

    public class ReciveHandler implements Runnable {
        BufferedReader reader = null;
        public ReciveHandler(BufferedReader reader) {
            this.reader = reader;
        }
        @Override
        public void run() {
            while (true) {
                try {
                    System.out.println("RE:" + reader.readLine());
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    以上是接收数据的处理器

    public class Client {
        public static ExecutorService pool = Executors.newFixedThreadPool(2);
        public static void main(String[] args) throws IOException {
            Socket socket = new Socket("0.0.0.0", 8089);
            BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            PrintWriter writer = new PrintWriter(socket.getOutputStream(), true);
            send(writer);
            recive(reader);
        }
    
        public static void send(PrintWriter writer) {
            pool.execute(new SendHandler(writer));
        }
    
        public static void recive(BufferedReader reader) {
            pool.execute(new ReciveHandler(reader));
        }
    }

    以上是客户端

    public class Server {
        public static ExecutorService pool = Executors.newFixedThreadPool(2);
        public static void main(String[] args) throws IOException {
            ServerSocket serverSocket = new ServerSocket(8089);
            Socket socket = serverSocket.accept();
            BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            PrintWriter writer = new PrintWriter(socket.getOutputStream(), true);
            send(writer);
            recive(reader);
        }
    
        public static void send(PrintWriter writer) {
            pool.execute(new SendHandler(writer));
        }
    
        public static void recive(BufferedReader reader) {
            pool.execute(new ReciveHandler(reader));
        }
    }

    以上是服务端

    然后,就没有然后了...

    如果有和我同样刚刚接触到这方面的小伙伴们觉得看不大懂(这几率应该比较小吧),那可以了解一下,线程池、io流、socket。

    溜了溜了,菜鸟式离场... ...

  • 相关阅读:
    二维数组中的查找
    浅析Java的Object类
    Alan Turing的纪录片观后感
    近期学习docker遇到的一些问题
    eclipse(STS)安装jd-eclipse插件实现查看API源代码功能
    deepin配置Oracle JDK
    两个有序链表的合并
    Maven 项目中各包单独打成jar包
    一次性密码 && 身份认证三要素
    HTTPS工作流程
  • 原文地址:https://www.cnblogs.com/wxdmw/p/13457553.html
Copyright © 2020-2023  润新知