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
* 这是一个客户端程序,可以连接服务器端口99993
*/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
@Override92
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表示服务器的ip67
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
@Override91
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

浙公网安备 33010602011771号