打赏

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("服务器接收到:\t"+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+"\r\n");
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+"\r\n");
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+"\r\n");
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+"\r\n");
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+"\r\n");
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+"\r\n");
95
            pw.println(info);
96
            jtf.setText("");
97
        }
98
    }
99
}
100





posted on 2018-12-01 00:33  XuCodeX  阅读(384)  评论(0编辑  收藏  举报

导航