25.6 如何设计网络程序

上一节中讲述了如何设计TCP程序和UDP程序,本节主要讲述如何将网络编程应用到实际工作的开发中去。

25.6.1 单向通信综合实例

【实例25.4】下面举一个单向通信的实例。这个实例用来实现客户机向服务器发送字符串功能。由于只要求客户机向服务器发送消息,不用服务器向客户机发送消息,所以称为单向通信。客户机套接字和服务器套接字连接成功后,客户机会通过输出流发送数据,而服务器会使用输入流接收数据,下面是具体的实例代码。

服务器程序代码如下所示。


01 import java.net.*;

02 import java.io.*;

03 public class serverrev

04 {

05 private BufferedReader reader1;

06 private ServerSocket server;

07 private Socket socket1;

08 public serverrev()

09 {}

10 ///创建服务器套接字server,并且其端口为6000

11 void startserver()

12 {

13 try

14 {

15 server=new ServerSocket(6000);

16 System.out.println("服务器套接字创建完成了!");

17 ///若客户机提出请求,则与其套接字连接

18 while(true)

19 {

20 System.out.println("等待客户机的连接。");

21 socket1=server.accept();

22 System.out.println("完成与客户机的连接。");

23 reader1=new BufferedReader(new InputStreamReader(socket1.getInputStream()));

24 getMessage();

25 }

26 27

}

28 catch(Exception e){}

29 }

30 ///读取来自套接字的输入输出流,从而将其输出到屏幕上

31 void getMessage()

32 {

33 try

34 {

35 while(true)

36 {

37 System.out.println("客户机:"+reader1.readLine());

38 }

39 }

40 catch(Exception e){}

41 finally

42 {

43 System.out.println("客户机中断连接");

44 }

45 try

46 {

47 if(reader1!=null)

48 reader1.close();

49 if(socket1!=null)

50 socket1.close();

51 }

52 catch(Exception e){}

53 }

54 public static void main(String[]args)

55 {

56 serverrev server=new serverrev();

57 server.startserver();

58 }

59 }


客户机的程序代码如下所示。


60 import java.io.*;

61 import java.net.*;

62 import java.awt.*;

63 import java.awt.event.*;

64 public class clientrev extends Frame

65 {

66 private PrintWriter writer1;

67 Socket socket1;

68 private TextArea ta=new TextArea();

69 private TextField tf=new TextField();

70 public clientrev(String title)

71 {

72 super(title);

73 ta.setEditable(false);

74 add(ta,"North");

75 add(tf,"South");

76 tf.addActionListener(new ActionListener()

77 {

78 public void actionPerformed(ActionEvent ae)

79 {

80 writer1.println(tf.getText());

81 ta.append(tf.getText()+"\n");

82 tf.setText("");

83 }

84 });

85 pack();

86 }

87 ///实现与服务器的连接

88 private void connect()

89 {

90 try

91 {

92 ta.append("尝试与服务器连接\n");

93 94

socket1=new Socket("127.0.0.1",6000);

95 writer1=new PrintWriter(socket1.getOutputStream(),true);

96 ta.append("完成连接,清除待传字符串\n");

97 98

}

99 catch(Exception e)

100 {

101 System.out.println("连接失败");

102 }

103 }

104 105

public static void main(String[]args)

106 {

107 clientrev client1=new clientrev("向服务器发送数据。");

108 client1.setVisible(true);

109 client1.connect();

110 }

111 }


【代码说明】分析上面的程序,在服务器程序中,主要是建立服务器套接字,然后等待客户连接。如果有客户机连接,就从客户机中传输过来的数据流中读取数据。

而在客户机程序中,主要是建立一个客户机套接字,然后连接到服务器套接字,最后通过输出流程序将数据发送给服务器。

【运行效果】运行结果如图25.2所示,这是服务器运行的界面,服务器执行在等待,等待客户机的连接。当有客户机连上的时候,会出现如图25.3所示的效果。客户端运行效果如图25.4所示,可在客户界面上输入数据,如图25.5所示。

25.6 如何设计网络程序 - 图1

图 25.2 单向通信服务器运行(一)

25.6 如何设计网络程序 - 图2

图 25.3 单向通信服务器运行(二)

25.6 如何设计网络程序 - 图3

图 25.4 单向通信客户端运行(一)

25.6 如何设计网络程序 - 图4

图 25.5 单向通信客户端运行(二)

说明

因为一个代表服务器端,一个代表客户端,所以需要打开两个DOS窗口,一个运行服务端程序,一个运行客户端程序。