java 半双工_JAVA入门到精通-第86讲-半双工/全双工

44319374d7f53e55bf0c2b3508fc069a.png

15fbe208ef461d3d5858ed3886aaa9a6.png

--服务器端

//先接收客户端发来的信息

Reader

BufferedReader--------------------------

InputStreamReader isr=

new InputStreamReader(s.getInputStream());

BufferedReader  br=new BufferedReader(isr);

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

br 用来读取socket连接;读的流;

pw 用来向socket连接写东西;写的流;

d0f63fcb3e5fe91a253e16d899dc24b8.png

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

c15d3a79d7701c1e23f98abad2e2f346.png

dcc7c61ea55951ee845226b116123aa6.png

服务器从客户端br2读好以后,通过pw写给客户端

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

加个:先监听

服务器正在监听......

7c08c53aa40dff794443fb8490cf6804.png

--客户端

a1db645e58c569229aa61c60b4ffea09.png

网络往往和IO流紧密结合在一起的;

da3946c66aaeaa58534e40e488dcd2e4.png

靠PrinWriter来输入对服务器说的话;

从控制台输入信息借助PW把信息写给服务器;

从控制台来接收的system.in;

26510a1219356ee1d6d3ab3ed74030d2.png

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

bb83b3a9628c477d11470593cd427bf5.png

isr / br  -------pw.println( )把接收到的信息发给服务器

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

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

944a2303b60fcfa2dee42903ff2cadf9.png

fa42c1e2ff9b920d557d6b7922dd0058.png

79db279ff38c5c090e9bf8964ef7a808.png

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

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

20b69327a6e64f6c440c6aa21e72ce35.png

7cbf0f77587f7f17cb360745f6f83e0f.png

服务器和客户端之间的信息交互;

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

MyClient:

f5d6f3620a9ce25a7c7d12c9db2ec7fa.png

接收从服务器端发来的信息byebye,关闭退出;

MyServer:

ed3ec5a8d67fb5798733ed417b38fe8e.png

接收从客户端发来的信息byebye,关闭退出,对话结束;

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

半双工通信,必须要先接收再发送;

其实就是,你一句,我一句,顺序严格;

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

--全双工通信

be60ebbdf37c14bb0501e42d5afd4460.png

public class MyServer3

286e22b53026e9e9fc7b0867e8ffd71f.png

60ad36abaa59235788fd56e6e94d7113.png

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

61a93767d96a012e71d45cac93a36d24.png

InputStreamReader

服务器端通过br.readLine()读取信息;

读到的信息显示在jta里面;

26b1d8804583a80b38fee03165f09b0d.png

对按钮做一个监听;

如果用户按下发送信息按钮

4bfa6385f2882608cd9424452418110b.png

PrintWriter 发送流

pw.println(info)

2d6ca6200481f839f03d595011764e01.png

jtf.setText("");           清空内容

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

--客户端

首先,不停的读;

16f4b16e3a7d171cc077331285a53243.png

服务器不发信息过来,阻塞,也不浪费CPU;

--对按钮监听

532cd6caabb153ed5ae4ec25c718e219.png

6891ae03da5524ea08132b9ba767dd44.png

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

e0c18a3157326684926d0926c8ca9036.png

把客户端发送的信息显示到jta

jta.append(info);       //append追加

Enteripse  Workbench 6.5

4d5cb1e42e092097990da90b67fc2d77.png

941f5c1071e42bb4b8b5dc9cc3a6715f.png

以追加append的方式放进去;

eb68b199477abcc56d71e708919ee090.png

899770f7f099be484289ca3e0b4f5652.png

448feadca6131374d90011d1ee7ae4a1.png

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

--按回车键,把内容发过去

监听Enter键

对jtf做个监听;

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

88089ee06674ddfd1e633ad2fd141edc.png

不是真正意义上的QQ,服务器、客户端之间

只能在一个局域网里面互发信息;类似于对讲机;

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

a3ef08e876d1ca36e71b02deb3087213.png

数据通过 服务器做个中转;

只要有公网、服务器就能聊天;y真正意义上的QQ

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

[MyServer2.java]服务端源代码

/**

* 功能:是一个服务器端,在9999端口上监听

* 可以通过控制台,输入回送给客户端的信息

*/

package com.net.server2;

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStream;

import java.io.InputStreamReader;

import java.io.PrintWriter;

import java.net.*;

public class MyServer2 {

InputStreamReader isr,isr2;

BufferedReader br,br2;

PrintWriter pw;

public static void main(String[] args) {

new MyServer2();

}

//构造函数

public MyServer2(){

try {

//在9999号端口上监听

ServerSocket ss=new ServerSocket(9999);

//等待客户端连接,该函数会返回一个Socket连接

Socket s=ss.accept();

//要读取s中传递的数据

isr=new InputStreamReader(s.getInputStream());

br=new BufferedReader(isr);

pw=new PrintWriter(s.getOutputStream(),true);

//接收从控制台输入的信息

isr2=new InputStreamReader(System.in);

br2=new BufferedReader(isr2);

while(true){

//接收客户端信息

String infoFromClient=br.readLine();

System.out.println("服务器接收到:\t"+infoFromClient);

//接收从控制台输入的信息

System.out.println("请输入要发送到客户端的信息:");

String response=br2.readLine();

//服务器从控制台上接收bye服务器端退出

if(response.equals("bye")){

System.out.println("退出对话");

s.close();

break;

}

//把从控制台输入的信息,回送给客户端

pw.println(response);

}

} catch (IOException e) {

e.printStackTrace();

}finally{

try {

if(br2!=null) br2.close();

if(isr2!=null) isr2.close();

if(pw!=null) pw.close();

if(br!=null) br.close();

if(isr!=null) isr.close();

} catch (IOException e) {

e.printStackTrace();

}

}

}

}

x

68

68

68

1/**

2* 功能:是一个服务器端,在9999端口上监听

3* 可以通过控制台,输入回送给客户端的信息

4*/

5package com.net.server2;

6import java.io.BufferedReader;

7import java.io.IOException;

8import java.io.InputStream;

9import java.io.InputStreamReader;

10import java.io.PrintWriter;

11import java.net.*;

12

13public class MyServer2 {

14InputStreamReader isr,isr2;

15BufferedReader br,br2;

16PrintWriter pw;

17

18public static void main(String[] args) {

19new MyServer2();

20}

21

22//构造函数

23public MyServer2(){

24try {

25//在9999号端口上监听

26ServerSocket ss=new ServerSocket(9999);

27//等待客户端连接,该函数会返回一个Socket连接

28Socket s=ss.accept();

29//要读取s中传递的数据

30isr=new InputStreamReader(s.getInputStream());

31br=new BufferedReader(isr);

32

33pw=new PrintWriter(s.getOutputStream(),true);

34

35//接收从控制台输入的信息

36isr2=new InputStreamReader(System.in);

37br2=new BufferedReader(isr2);

38while(true){

39//接收客户端信息

40String infoFromClient=br.readLine();

41System.out.println("服务器接收到:\t"+infoFromClient);

42//接收从控制台输入的信息

43System.out.println("请输入要发送到客户端的信息:");

44String response=br2.readLine();

45//服务器从控制台上接收bye服务器端退出

46if(response.equals("bye")){

47System.out.println("退出对话");

48s.close();

49break;

50}

51//把从控制台输入的信息,回送给客户端

52pw.println(response);

53}

54} catch (IOException e) {

55e.printStackTrace();

56}finally{

57try {

58if(br2!=null) br2.close();

59if(isr2!=null) isr2.close();

60if(pw!=null) pw.close();

61if(br!=null) br.close();

62if(isr!=null) isr.close();

63} catch (IOException e) {

64e.printStackTrace();

65}

66}

67}

68}

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

[MyClient2.java]客户端源代码

/**

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

*/

package com.net.client2;

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStreamReader;

import java.io.PrintWriter;

import java.net.*;

public class MyClient2 {

InputStreamReader isr,isr2;

BufferedReader br,br2;

PrintWriter pw;

public static void main(String[] args) {

new MyClient2();

}

public MyClient2(){

try {

//连接服务器端

Socket s=new Socket("127.0.0.1",9999);

pw=new PrintWriter(s.getOutputStream(),true);

//控制台接收信息

isr=new InputStreamReader(System.in);

br=new BufferedReader(isr);

//从服务器接收信息

isr2=new InputStreamReader(s.getInputStream());

br2=new BufferedReader(isr2);

while(true){

//客户端先从控制台接收

String info=br.readLine();

//然后发送给服务器

pw.println(info);

//客户端从控制台上输入byebye信息,客户端退出

if(info.equals("byebye")){

System.out.println("客户端退出对话");

s.close();

break;

}

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

String res=br2.readLine();

System.out.println("客户端接收到的信息:"+res);

//客户端接收服务端发送来的byebye信息,客户端退出

if(res.equals("byebye")){

System.out.println("服务器端强制客户端退出对话");

s.close();

break;

}

}

} catch (Exception e) {

e.printStackTrace();

}finally{

try {

if(br2!=null) br2.close();

if(isr2!=null) isr2.close();

if(pw!=null) pw.close();

if(br!=null) br.close();

if(isr!=null) isr.close();

} catch (IOException e) {

e.printStackTrace();

}

}

}

}

1

75

1/**

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

3*/

4package com.net.client2;

5

6import java.io.BufferedReader;

7import java.io.IOException;

8import java.io.InputStreamReader;

9import java.io.PrintWriter;

10import java.net.*;

11

12public class MyClient2 {

13InputStreamReader isr,isr2;

14BufferedReader br,br2;

15PrintWriter pw;

16

17public static void main(String[] args) {

18new MyClient2();

19}

20

21public MyClient2(){

22try {

23//连接服务器端

24Socket s=new Socket("127.0.0.1",9999);

25

26pw=new PrintWriter(s.getOutputStream(),true);

27//控制台接收信息

28isr=new InputStreamReader(System.in);

29br=new BufferedReader(isr);

30

31//从服务器接收信息

32isr2=new InputStreamReader(s.getInputStream());

33br2=new BufferedReader(isr2);

34

35while(true){

36//客户端先从控制台接收

37String info=br.readLine();

38//然后发送给服务器

39pw.println(info);

40//客户端从控制台上输入byebye信息,客户端退出

41if(info.equals("byebye")){

42System.out.println("客户端退出对话");

43s.close();

44break;

45}

46

47//接收从服务器发来的信息

48String res=br2.readLine();

49System.out.println("客户端接收到的信息:"+res);

50//客户端接收服务端发送来的byebye信息,客户端退出

51if(res.equals("byebye")){

52System.out.println("服务器端强制客户端退出对话");

53s.close();

54break;

55}

56}

57} catch (Exception e) {

58e.printStackTrace();

59}finally{

60try {

61if(br2!=null) br2.close();

62if(isr2!=null) isr2.close();

63if(pw!=null) pw.close();

64if(br!=null) br.close();

65if(isr!=null) isr.close();

66} catch (IOException e) {

67e.printStackTrace();

68}

69}

70}

71}

72

===============================

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

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

/**

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

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

*/

package com.net.server3;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import java.awt.event.KeyEvent;

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStream;

import java.io.InputStreamReader;

import java.io.PrintWriter;

import java.net.*;

import javax.swing.AbstractAction;

import javax.swing.JButton;

import javax.swing.JComponent;

import javax.swing.JFrame;

import javax.swing.JPanel;

import javax.swing.JScrollPane;

import javax.swing.JTextArea;

import javax.swing.JTextField;

import javax.swing.KeyStroke;

public class MyServer3 extends JFrame implements ActionListener{

JTextArea jta;

JTextField jtf;

JButton jb;

JPanel jp1;

JScrollPane jsp;

InputStreamReader isr;

BufferedReader br;

PrintWriter pw;

public static void main(String[] args) {

new MyServer3();

}

//构造函数

public MyServer3(){

jta=new JTextArea();

jtf=new JTextField(20);

jb=new JButton("发送");

jb.addActionListener(this);

//给jb发送按钮添加快捷键(回车)事件

jb.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0), "fasong");

jb.getActionMap().put("fasong", new AbstractAction() {

public void actionPerformed(ActionEvent e) {

String info=jtf.getText();

jta.append("客户端 对 服务端说:"+info+"\r\n");

pw.println(info);

jtf.setText("");

}

});

jp1=new JPanel();

jp1.add(jtf);

jp1.add(jb);

jsp=new JScrollPane(jta);

this.add(jsp,"Center");

this.add(jp1,"South");

this.setTitle("qq简易聊天--服务端");

this.setSize(350, 250);

this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

this.setVisible(true);

try {

//在9999号端口上监听

ServerSocket ss=new ServerSocket(9999);

//等待客户端连接

Socket s=ss.accept();

//读取从客户端发来的信息

isr=new InputStreamReader(s.getInputStream());

br=new BufferedReader(isr);

pw=new PrintWriter(s.getOutputStream(),true);

while(true){

//读取从客户端发来的信息

String info=br.readLine();

jta.append("客户端 对 服务端说:"+info+"\r\n");

}

} catch (IOException e) {

e.printStackTrace();

}finally{

try {

if(pw!=null) pw.close();

if(br!=null) br.close();

if(isr!=null) isr.close();

} catch (Exception e2) {

e2.printStackTrace();

}

}

}

@Override

public void actionPerformed(ActionEvent e) {

//如果用户按下发送信息的按钮

if(e.getSource()==jb){

//把服务器在jtf写的 内容发送给客户端

String info=jtf.getText();

//向jta中不断追加内容

jta.append("服务端 对 客户端说:"+info+"\r\n");

pw.println(info);

//清空jtf内容

jtf.setText("");

}

}

}

1

104

1package com.net.server3;

2import java.awt.event.ActionEvent;

3import java.awt.event.ActionListener;

4import java.awt.event.KeyEvent;

5import java.io.BufferedReader;

6import java.io.IOException;

7import java.io.InputStream;

8import java.io.InputStreamReader;

9import java.io.PrintWriter;

10import java.net.*;

11import javax.swing.AbstractAction;

12import javax.swing.JButton;

13import javax.swing.JComponent;

14import javax.swing.JFrame;

15import javax.swing.JPanel;

16import javax.swing.JScrollPane;

17import javax.swing.JTextArea;

18import javax.swing.JTextField;

19import javax.swing.KeyStroke;

20

21public class MyServer3 extends JFrame implements ActionListener{

22JTextArea jta;

23JTextField jtf;

24JButton jb;

25JPanel jp1;

26JScrollPane jsp;

27

28InputStreamReader isr;

29BufferedReader br;

30PrintWriter pw;

31

32public static void main(String[] args) {

33new MyServer3();

34}

35

36//构造函数

37public MyServer3(){

38jta=new JTextArea();

39jtf=new JTextField(20);

40jb=new JButton("发送");

41jb.addActionListener(this);

42//给jb发送按钮添加快捷键(回车)事件

43jb.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0), "fasong");

44jb.getActionMap().put("fasong", new AbstractAction() {

45public void actionPerformed(ActionEvent e) {

46String info=jtf.getText();

47jta.append("客户端 对 服务端说:"+info+"\r\n");

48pw.println(info);

49jtf.setText("");

50}

51});

52

53jp1=new JPanel();

54jp1.add(jtf);

55jp1.add(jb);

56jsp=new JScrollPane(jta);

57this.add(jsp,"Center");

58this.add(jp1,"South");

59this.setTitle("qq简易聊天--服务端");

60this.setSize(350, 250);

61this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

62this.setVisible(true);

63

64try {

65//在9999号端口上监听

66ServerSocket ss=new ServerSocket(9999);

67//等待客户端连接

68Socket s=ss.accept();

69//读取从客户端发来的信息

70isr=new InputStreamReader(s.getInputStream());

71br=new BufferedReader(isr);

72pw=new PrintWriter(s.getOutputStream(),true);

73while(true){

74//读取从客户端发来的信息

75String info=br.readLine();

76jta.append("客户端 对 服务端说:"+info+"\r\n");

77}

78} catch (IOException e) {

79e.printStackTrace();

80}finally{

81try {

82if(pw!=null) pw.close();

83if(br!=null) br.close();

84if(isr!=null) isr.close();

85} catch (Exception e2) {

86e2.printStackTrace();

87}

88}

89}

90

91@Override

92public void actionPerformed(ActionEvent e) {

93//如果用户按下发送信息的按钮

94if(e.getSource()==jb){

95//把服务器在jtf写的 内容发送给客户端

96String info=jtf.getText();

97//向jta中不断追加内容

98jta.append("服务端 对 客户端说:"+info+"\r\n");

99pw.println(info);

100//清空jtf内容

101jtf.setText("");

102}

103}

104}

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

[MyClient3.java]客户端源代码

/**

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

*/

package com.net.client3;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import java.awt.event.KeyEvent;

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStreamReader;

import java.io.PrintWriter;

import java.net.*;

import javax.swing.AbstractAction;

import javax.swing.JButton;

import javax.swing.JComponent;

import javax.swing.JFrame;

import javax.swing.JPanel;

import javax.swing.JScrollPane;

import javax.swing.JTextArea;

import javax.swing.JTextField;

import javax.swing.KeyStroke;

public class MyClient3 extends JFrame implements ActionListener{

JTextArea jta;

JTextField jtf;

JButton jb;

JPanel jp1;

JScrollPane jsp;

InputStreamReader isr;

BufferedReader br;

PrintWriter pw;

public static void main(String[] args) {

new MyClient3();

}

public MyClient3(){

jta=new JTextArea();

jtf=new JTextField(20);

jtf.setFocusable(true);

jb=new JButton("发送");

jb.addActionListener(this);

//给jb发送按钮添加快捷键(回车)事件

jb.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0), "fasong");

jb.getActionMap().put("fasong", new AbstractAction() {

public void actionPerformed(ActionEvent e) {

String info=jtf.getText();

jta.append("客户端 对 服务端说:"+info+"\r\n");

pw.println(info);

jtf.setText("");

}

});

jp1=new JPanel();

jp1.add(jtf);

jp1.add(jb);

jsp=new JScrollPane(jta);

this.add(jsp,"Center");

this.add(jp1,"South");

this.setTitle("qq简易聊天--客户端");

this.setSize(350, 250);

this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

this.setVisible(true);

try {

//Socket()就是去连接某个服务器端 127.0.0.1表示服务器的ip

Socket s=new Socket("127.0.0.1",9999);

InputStreamReader isr=new InputStreamReader(s.getInputStream());

BufferedReader br=new BufferedReader(isr);

pw=new PrintWriter(s.getOutputStream(),true);

while(true){

//读取服务器端发来的信息

String info=br.readLine();

jta.append("服务端 对 客户端说:"+info+"\r\n");

}

} catch (Exception e) {

e.printStackTrace();

}finally{

try {

if(pw!=null) pw.close();

if(br!=null) br.close();

if(isr!=null) isr.close();

} catch (Exception e2) {

e2.printStackTrace();

}

}

}

@Override

public void actionPerformed(ActionEvent e) {

if(e.getSource()==jb){

String info=jtf.getText();

jta.append("客户端 对 服务端说:"+info+"\r\n");

pw.println(info);

jtf.setText("");

}

}

}

1

106

1package com.net.client3;

2

3import java.awt.event.ActionEvent;

4import java.awt.event.ActionListener;

5import java.awt.event.KeyEvent;

6import java.io.BufferedReader;

7import java.io.IOException;

8import java.io.InputStreamReader;

9import java.io.PrintWriter;

10import java.net.*;

11import javax.swing.AbstractAction;

12import javax.swing.JButton;

13import javax.swing.JComponent;

14import javax.swing.JFrame;

15import javax.swing.JPanel;

16import javax.swing.JScrollPane;

17import javax.swing.JTextArea;

18import javax.swing.JTextField;

19import javax.swing.KeyStroke;

20

21public class MyClient3 extends JFrame implements ActionListener{

22JTextArea jta;

23JTextField jtf;

24JButton jb;

25JPanel jp1;

26JScrollPane jsp;

27

28InputStreamReader isr;

29BufferedReader br;

30PrintWriter pw;

31

32public static void main(String[] args) {

33new MyClient3();

34}

35

36public MyClient3(){

37jta=new JTextArea();

38jtf=new JTextField(20);

39jtf.setFocusable(true);

40jb=new JButton("发送");

41jb.addActionListener(this);

42//给jb发送按钮添加快捷键(回车)事件

43jb.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0), "fasong");

44jb.getActionMap().put("fasong", new AbstractAction() {

45public void actionPerformed(ActionEvent e) {

46String info=jtf.getText();

47jta.append("客户端 对 服务端说:"+info+"\r\n");

48pw.println(info);

49jtf.setText("");

50}

51});

52

53jp1=new JPanel();

54jp1.add(jtf);

55jp1.add(jb);

56jsp=new JScrollPane(jta);

57this.add(jsp,"Center");

58this.add(jp1,"South");

59

60this.setTitle("qq简易聊天--客户端");

61this.setSize(350, 250);

62this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

63this.setVisible(true);

64

65try {

66//Socket()就是去连接某个服务器端 127.0.0.1表示服务器的ip

67Socket s=new Socket("127.0.0.1",9999);

68

69InputStreamReader isr=new InputStreamReader(s.getInputStream());

70BufferedReader br=new BufferedReader(isr);

71pw=new PrintWriter(s.getOutputStream(),true);

72while(true){

73//读取服务器端发来的信息

74String info=br.readLine();

75jta.append("服务端 对 客户端说:"+info+"\r\n");

76}

77} catch (Exception e) {

78e.printStackTrace();

79}finally{

80try {

81if(pw!=null) pw.close();

82if(br!=null) br.close();

83if(isr!=null) isr.close();

84} catch (Exception e2) {

85e2.printStackTrace();

86}

87}

88}

89

90@Override

91public void actionPerformed(ActionEvent e) {

92if(e.getSource()==jb){

93String info=jtf.getText();

94jta.append("客户端 对 服务端说:"+info+"\r\n");

95pw.println(info);

96jtf.setText("");

97}

98}

99}

100

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值