zoukankan      html  css  js  c++  java
  • JAVA入门到精通-第86讲-半双工/全双工


    --服务器端
    //先接收客户端发来的信息
     Reader
     BufferedReader
    --------------------------
    InputStreamReader isr=
    new InputStreamReader(s.getInputStream());
    BufferedReader  br=new BufferedReader(isr);
    -------------------------
    br 用来读取socket连接;读的流;
    pw 用来向socket连接写东西;写的流;
    ----------------------------

    服务器从客户端br2读好以后,通过pw写给客户端
    --------------------------------------
    加个:先监听
    服务器正在监听......

    --客户端
    网络往往和IO流紧密结合在一起的;
    靠PrinWriter来输入对服务器说的话;
    从控制台输入信息借助PW把信息写给服务器;
    从控制台来接收的system.in;
    ------------------------------
    isr / br  -------pw.println( )把接收到的信息发给服务器

    ------------------------
    isr2/br2 ------ 接收从服务器发来的信息

    一回车,相当于控制台的信息输入到客户端,被传到服务器上

    ---------------------------

     服务器和客户端之间的信息交互;
    -----------------------------------
    MyClient:
    接收从服务器端发来的信息byebye,关闭退出;

    MyServer:
    接收从客户端发来的信息byebye,关闭退出,对话结束;
    --------------------------
    半双工通信,必须要先接收再发送;
    其实就是,你一句,我一句,顺序严格;
    ------------------------------

    --全双工通信
    public class MyServer3


    -客户端/服务器端界面:
    InputStreamReader

    服务器端通过br.readLine()读取信息;
    读到的信息显示在jta里面;

    对按钮做一个监听;
    如果用户按下发送信息按钮

    PrintWriter 发送流
    pw.println(info)
    jtf.setText("");           清空内容
    --------------------------------------------
    --客户端
    首先,不停的读;
    服务器不发信息过来,阻塞,也不浪费CPU;

    --对按钮监听
    监听按钮,jtf 输入信息,通过 pw发送给客户端;

    把客户端发送的信息显示到jta
    jta.append(info);       //append追加

    Enteripse  Workbench 6.5


    追加append的方式放进去;



    --------------------
    --按回车键,把内容发过去
    监听Enter键
    对jtf做个监听;
    -----------------------

    不是真正意义上的QQ,服务器、客户端之间
    只能在一个局域网里面互发信息;类似于对讲机;
    -----------------------

    数据通过 服务器做个中转;
    只要有公网、服务器就能聊天;y真正意义上的QQ

    半双工,客户端与服务端进行控制台输入交流

    [MyServer2.java]服务端源代码

    x
    68
    68
    68
     
    1
    /**
    2
     * 功能:是一个服务器端,在9999端口上监听
    3
     * 可以通过控制台,输入回送给客户端的信息
    4
     */
    5
    package com.net.server2;
    6
    import java.io.BufferedReader;
    7
    import java.io.IOException;
    8
    import java.io.InputStream;
    9
    import java.io.InputStreamReader;
    10
    import java.io.PrintWriter;
    11
    import java.net.*;
    12
     
    13
    public class MyServer2 {
    14
        InputStreamReader isr,isr2;
    15
        BufferedReader br,br2;
    16
        PrintWriter pw;
    17
       
    18
        public static void main(String[] args) {
    19
            new MyServer2();
    20
        }
    21
     
    22
        //构造函数
    23
        public MyServer2(){
    24
            try {
    25
                //在9999号端口上监听
    26
                ServerSocket ss=new ServerSocket(9999);
    27
                //等待客户端连接,该函数会返回一个Socket连接
    28
                Socket s=ss.accept();
    29
                //要读取s中传递的数据
    30
                isr=new InputStreamReader(s.getInputStream());
    31
                br=new BufferedReader(isr);
    32
               
    33
                pw=new PrintWriter(s.getOutputStream(),true);
    34
               
    35
                //接收从控制台输入的信息
    36
                isr2=new InputStreamReader(System.in);
    37
                br2=new BufferedReader(isr2);
    38
                while(true){
    39
                    //接收客户端信息
    40
                    String infoFromClient=br.readLine();
    41
                    System.out.println("服务器接收到:	"+infoFromClient);
    42
                    //接收从控制台输入的信息
    43
                    System.out.println("请输入要发送到客户端的信息:");
    44
                    String response=br2.readLine();
    45
                    //服务器从控制台上接收bye服务器端退出
    46
                    if(response.equals("bye")){
    47
                        System.out.println("退出对话");
    48
                        s.close();
    49
                        break;
    50
                    }
    51
                    //把从控制台输入的信息,回送给客户端
    52
                    pw.println(response);
    53
                }
    54
            } catch (IOException e) {
    55
                e.printStackTrace();
    56
            }finally{
    57
                try {
    58
                    if(br2!=null) br2.close();
    59
                    if(isr2!=null) isr2.close();
    60
                    if(pw!=null) pw.close();
    61
                    if(br!=null) br.close();
    62
                    if(isr!=null) isr.close();
    63
                } catch (IOException e) {
    64
                    e.printStackTrace();
    65
                }
    66
            }
    67
        }
    68
    }

     

    *******************************************************************************

    [MyClient2.java]客户端源代码

    1
    75
     
    1
    /**
    2
     * 这是一个客户端程序,可以连接服务器端口9999
    3
     */
    4
    package com.net.client2;
    5
     
    6
    import java.io.BufferedReader;
    7
    import java.io.IOException;
    8
    import java.io.InputStreamReader;
    9
    import java.io.PrintWriter;
    10
    import java.net.*;
    11
     
    12
    public class MyClient2 {
    13
        InputStreamReader isr,isr2;
    14
        BufferedReader br,br2;
    15
        PrintWriter pw;
    16
       
    17
        public static void main(String[] args) {
    18
            new MyClient2();
    19
        }
    20
       
    21
        public MyClient2(){
    22
            try {
    23
                //连接服务器端
    24
                Socket s=new Socket("127.0.0.1",9999);
    25
               
    26
                pw=new PrintWriter(s.getOutputStream(),true);
    27
                //控制台接收信息
    28
                isr=new InputStreamReader(System.in);
    29
                br=new BufferedReader(isr);
    30
               
    31
                //从服务器接收信息
    32
                isr2=new InputStreamReader(s.getInputStream());
    33
                br2=new BufferedReader(isr2);
    34
               
    35
                while(true){
    36
                    //客户端先从控制台接收
    37
                    String info=br.readLine();
    38
                    //然后发送给服务器
    39
                    pw.println(info);
    40
                    //客户端从控制台上输入byebye信息,客户端退出
    41
                    if(info.equals("byebye")){
    42
                        System.out.println("客户端退出对话");
    43
                        s.close();
    44
                        break;
    45
                    }
    46
                   
    47
                    //接收从服务器发来的信息
    48
                    String res=br2.readLine();
    49
                    System.out.println("客户端接收到的信息:"+res);
    50
                    //客户端接收服务端发送来的byebye信息,客户端退出
    51
                    if(res.equals("byebye")){
    52
                        System.out.println("服务器端强制客户端退出对话");
    53
                        s.close();
    54
                        break;
    55
                    }
    56
                }
    57
            } catch (Exception e) {
    58
                e.printStackTrace();
    59
            }finally{
    60
                try {
    61
                    if(br2!=null) br2.close();
    62
                    if(isr2!=null) isr2.close();
    63
                    if(pw!=null) pw.close();
    64
                    if(br!=null) br.close();
    65
                    if(isr!=null) isr.close();
    66
                } catch (IOException e) {
    67
                    e.printStackTrace();
    68
                }
    69
            }
    70
        }
    71
    }
    72
    ===============================

    全双工客户端与服务器进行简易界面聊天

    [MyServer3.java]服务器端源代码

    /**

     * 全双工服务器端,让它在9999端口监听

     * 可以接收客户端发来的数据

     */

    1
    104
     
    1
    package com.net.server3;
    2
    import java.awt.event.ActionEvent;
    3
    import java.awt.event.ActionListener;
    4
    import java.awt.event.KeyEvent;
    5
    import java.io.BufferedReader;
    6
    import java.io.IOException;
    7
    import java.io.InputStream;
    8
    import java.io.InputStreamReader;
    9
    import java.io.PrintWriter;
    10
    import java.net.*;
    11
    import javax.swing.AbstractAction;
    12
    import javax.swing.JButton;
    13
    import javax.swing.JComponent;
    14
    import javax.swing.JFrame;
    15
    import javax.swing.JPanel;
    16
    import javax.swing.JScrollPane;
    17
    import javax.swing.JTextArea;
    18
    import javax.swing.JTextField;
    19
    import javax.swing.KeyStroke;
    20
     
    21
    public class MyServer3 extends JFrame implements ActionListener{
    22
        JTextArea jta;
    23
        JTextField jtf;
    24
        JButton jb;
    25
        JPanel jp1;
    26
        JScrollPane jsp;
    27
       
    28
        InputStreamReader isr;
    29
        BufferedReader br;
    30
        PrintWriter pw;
    31
       
    32
        public static void main(String[] args) {
    33
            new MyServer3();
    34
        }
    35
       
    36
        //构造函数
    37
        public MyServer3(){
    38
            jta=new JTextArea();
    39
            jtf=new JTextField(20);
    40
            jb=new JButton("发送");
    41
            jb.addActionListener(this);
    42
            //给jb发送按钮添加快捷键(回车)事件
    43
            jb.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0), "fasong");
    44
            jb.getActionMap().put("fasong", new AbstractAction() {
    45
                public void actionPerformed(ActionEvent e) {
    46
                    String info=jtf.getText();
    47
                    jta.append("客户端 对 服务端说:"+info+"
    ");
    48
                    pw.println(info);
    49
                    jtf.setText("");
    50
                }
    51
            });
    52
           
    53
            jp1=new JPanel();
    54
            jp1.add(jtf);
    55
            jp1.add(jb);
    56
            jsp=new JScrollPane(jta);
    57
            this.add(jsp,"Center");
    58
            this.add(jp1,"South");
    59
            this.setTitle("qq简易聊天--服务端");
    60
            this.setSize(350, 250);
    61
            this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    62
            this.setVisible(true);
    63
           
    64
            try {
    65
                //在9999号端口上监听
    66
                ServerSocket ss=new ServerSocket(9999);
    67
                //等待客户端连接
    68
                Socket s=ss.accept();
    69
                //读取从客户端发来的信息
    70
                isr=new InputStreamReader(s.getInputStream());
    71
                br=new BufferedReader(isr);
    72
                pw=new PrintWriter(s.getOutputStream(),true);
    73
                while(true){
    74
                    //读取从客户端发来的信息
    75
                    String info=br.readLine();
    76
                    jta.append("客户端 对 服务端说:"+info+"
    ");
    77
                }
    78
            } catch (IOException e) {
    79
                e.printStackTrace();
    80
            }finally{
    81
                try {
    82
                    if(pw!=null) pw.close();
    83
                    if(br!=null) br.close();
    84
                    if(isr!=null) isr.close();
    85
                } catch (Exception e2) {
    86
                    e2.printStackTrace();
    87
                }
    88
            }
    89
        }
    90
     
    91
        @Override
    92
        public void actionPerformed(ActionEvent e) {
    93
            //如果用户按下发送信息的按钮
    94
            if(e.getSource()==jb){
    95
                //把服务器在jtf写的 内容发送给客户端
    96
                String info=jtf.getText();
    97
                //向jta中不断追加内容
    98
                jta.append("服务端 对 客户端说:"+info+"
    ");
    99
                pw.println(info);
    100
                //清空jtf内容
    101
                jtf.setText("");
    102
            }
    103
        }
    104
    }

    *******************************************************************************

    [MyClient3.java]客户端源代码

    /**

     * 这是一个客户端程序,可以连接服务器端口9999

     */

    1
    106
     
    1
    package com.net.client3;
    2
     
    3
    import java.awt.event.ActionEvent;
    4
    import java.awt.event.ActionListener;
    5
    import java.awt.event.KeyEvent;
    6
    import java.io.BufferedReader;
    7
    import java.io.IOException;
    8
    import java.io.InputStreamReader;
    9
    import java.io.PrintWriter;
    10
    import java.net.*;
    11
    import javax.swing.AbstractAction;
    12
    import javax.swing.JButton;
    13
    import javax.swing.JComponent;
    14
    import javax.swing.JFrame;
    15
    import javax.swing.JPanel;
    16
    import javax.swing.JScrollPane;
    17
    import javax.swing.JTextArea;
    18
    import javax.swing.JTextField;
    19
    import javax.swing.KeyStroke;
    20
     
    21
    public class MyClient3 extends JFrame implements ActionListener{
    22
        JTextArea jta;
    23
        JTextField jtf;
    24
        JButton jb;
    25
        JPanel jp1;
    26
        JScrollPane jsp;
    27
       
    28
        InputStreamReader isr;
    29
        BufferedReader br;
    30
        PrintWriter pw;
    31
       
    32
        public static void main(String[] args) {
    33
            new MyClient3();
    34
        }
    35
       
    36
        public MyClient3(){
    37
            jta=new JTextArea();
    38
            jtf=new JTextField(20);
    39
            jtf.setFocusable(true);
    40
            jb=new JButton("发送");
    41
            jb.addActionListener(this);
    42
            //给jb发送按钮添加快捷键(回车)事件
    43
        jb.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0), "fasong");
    44
            jb.getActionMap().put("fasong", new AbstractAction() {
    45
                public void actionPerformed(ActionEvent e) {
    46
                    String info=jtf.getText();
    47
                    jta.append("客户端 对 服务端说:"+info+"
    ");
    48
                    pw.println(info);
    49
                    jtf.setText("");
    50
                }
    51
            });
    52
           
    53
            jp1=new JPanel();
    54
            jp1.add(jtf);
    55
            jp1.add(jb);
    56
            jsp=new JScrollPane(jta);
    57
            this.add(jsp,"Center");
    58
            this.add(jp1,"South");
    59
           
    60
            this.setTitle("qq简易聊天--客户端");
    61
            this.setSize(350, 250);
    62
            this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    63
            this.setVisible(true);
    64
           
    65
            try {
    66
                //Socket()就是去连接某个服务器端 127.0.0.1表示服务器的ip
    67
                Socket s=new Socket("127.0.0.1",9999);
    68
     
    69
                InputStreamReader isr=new InputStreamReader(s.getInputStream());
    70
                BufferedReader br=new BufferedReader(isr);
    71
                pw=new PrintWriter(s.getOutputStream(),true);
    72
                while(true){
    73
                    //读取服务器端发来的信息
    74
                    String info=br.readLine();
    75
                    jta.append("服务端 对 客户端说:"+info+"
    ");
    76
                }
    77
            } catch (Exception e) {
    78
                e.printStackTrace();
    79
            }finally{
    80
                try {
    81
                    if(pw!=null) pw.close();
    82
                    if(br!=null) br.close();
    83
                    if(isr!=null) isr.close();
    84
                } catch (Exception e2) {
    85
                    e2.printStackTrace();
    86
                }
    87
            }
    88
        }
    89
     
    90
        @Override
    91
        public void actionPerformed(ActionEvent e) {
    92
            if(e.getSource()==jb){
    93
                String info=jtf.getText();
    94
                jta.append("客户端 对 服务端说:"+info+"
    ");
    95
                pw.println(info);
    96
                jtf.setText("");
    97
            }
    98
        }
    99
    }
    100





  • 相关阅读:
    JS 弹窗“是否删除”
    input file 保存图片
    Form之action提交不刷新不跳转
    checkbox实现单选
    最近的项目系之2——core3.0整合Autofac
    最近的项目系列1——core整合SPA
    最近的项目之开篇
    短信验证码“最佳实践”
    Asp.net core使用MediatR进程内发布/订阅
    记一次带层级结构列表数据计算性能优化
  • 原文地址:https://www.cnblogs.com/xuxaut-558/p/10047893.html
Copyright © 2011-2022 走看看