--服务器端
//先接收客户端发来的信息
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]服务端源代码
/**
* 功能:是一个服务器端,在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