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.2 双向通信综合实例 - 图1

图 25.6 双向通信服务器运行(1)

25.6.2 双向通信综合实例 - 图2

图 25.7 双向通信客户端运行(1)

25.6.2 双向通信综合实例 - 图3

图 25.8 双向通信客户端运行(2)

25.6.2 双向通信综合实例 - 图4

图 25.9 双向通信服务器运行(2)