25.6.2 双向通信综合实例
【实例25.5】上一节介绍了客户机向服务器发送数据的单向通信,本节将介绍服务器和客户机相互发送数据的双向通信,其程序代码在上一小节的代码基础上有所改变,读者可以比较两者的区别。
服务器程序代码如下:
01 import java.net.*;
02 import java.io.*;
03 public class serverrev1
04 {
05 private DataInputStream reader1;///输入流
06 private DataOutputStream writer1;///输出流
07 private ServerSocket server;///服务器套接字
08 private Socket socket1;///套接字
09 public serverrev1() ///启动的服务器
10 {}
11 void startserver()
12 {
13 try
14 {
15 server=new ServerSocket(6000);
16 System.out.println("服务器套接字创建完成了!");
17 while(true)
18 {
19 System.out.println("等待客户机的连接。");
20 socket1=server.accept();
21 System.out.println("完成与客户机的连接。");
22 reader1=new DataInputStream(socket1.getInputStream());
23 writer1=new DataOutputStream(socket1.getOutputStream());
24 getrev();///与客户机进行通信
25 }
26 27
}
28 catch(Exception e){}
29 }
30 void getrev()
31 {
32 try
33 {
34 while(true)
35 {
36 String filename=reader1.readUTF();
37 writer1.writeUTF(getfileinfo(filename));
38 writer1.flush();
39 System.out.println(filename+"的信息传送完毕。");
40 }
41 }
42 catch(Exception e){}
43 finally
44 {
45 System.out.println("客户机中断连接");
46 }
47 try
48 {
49 if(reader1!=null)
50 reader1.close();
51 if(writer1!=null)
52 writer1.close();
53 if(socket1!=null)
54 socket1.close();
55 }
56 catch(Exception e){}
57 }
58 String getfileinfo(String filename)
59 {
60 String fileinfo="";
61 try
62 {
63 FileReader fr=new FileReader(filename);
64 BufferedReader br=new BufferedReader(fr);
65 String temp;
66 while((temp=br.readLine())!=null)
67 fileinfo+=temp+"\n";
68 br.close();
69 }
70 catch(Exception e){}
71 return fileinfo;
72 }
73 public static void main(String[]args)
74 {
75 serverrev1 server=new serverrev1();
76 server.startserver();
77 }
78 }
客户机程序代码如下所示。
79 import java.io.*;
80 import java.net.*;
81 import java.awt.*;
82 import java.awt.event.*;
83 ///构建一个图形界面
84 ///界面中ta指文本区,用来显示聊天结果
85 ///tf是指文本框
86 public class clientrev1 extends Frame
87 {
88 Socket socket1;
89 private DataInputStream reader1;
90 private DataOutputStream writer1;
91 private TextArea ta=new TextArea();
92 private TextField tf=new TextField();
93 public clientrev1(String title)
94 {
95 super(title);
96 ta.setEditable(false);
97 add(ta,"North");
98 add(tf,"South");
99 ///通过按钮的动作,开始将输出流输送到屏幕中
100 tf.addActionListener(new ActionListener()
101 {
102 public void actionPerformed(ActionEvent ae)
103 {
104 try
105 {
106 writer1.writeUTF(tf.getText());
107 writer1.flush();
108 String fileinfo=reader1.readUTF();
109 ta.setText("<"+tf.getText()+"的内容>\n\n");
110 ta.append(fileinfo);
111 }
112 catch(Exception e){}
113 }
114 });
115 pack();
116 }
117 private void connect()
118 {
119 try
120 {
121 ta.append("尝试与服务器连接\n");
122 socket1=new Socket("127.0.0.1",6000);
123 ta.append("连接完毕。请输入文件名\n");
124 writer1=new DataOutputStream(socket1.getOutputStream());
125 reader1=new DataInputStream(socket1.getInputStream());
126 }
127 catch(Exception e)
128 {
129 System.out.println("连接失败");
130 }
131 }
132 public static void main(String[]args)
133 {
134 clientrev1 client1=new clientrev1("查看服务器系统文件。");
135 client1.setVisible(true);
136 client1.connect();
137 }
138 }
【代码说明】分析上面的程序段,在服务器程序代码中,主要是在上一小节服务器程序段的基础上,多了一个服务器收到后回复给客户机的代码。而客户机从服务器的回复数据流中提取出来,显示在客户机的屏幕上。
【运行效果】运行结果如图25.6~图25.9所示。图25.6代表是服务器运行结果。图25.7代表是客户端程序运行界面。图25.8代表是客户端输入数据后的运行界面。图25.9则是服务器接收数据的运行界面。
图 25.6 双向通信服务器运行(1)
图 25.7 双向通信客户端运行(1)
图 25.8 双向通信客户端运行(2)
图 25.9 双向通信服务器运行(2)