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