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.2 单向通信服务器运行(一)
图 25.3 单向通信服务器运行(二)
图 25.4 单向通信客户端运行(一)
图 25.5 单向通信客户端运行(二)
说明
因为一个代表服务器端,一个代表客户端,所以需要打开两个DOS窗口,一个运行服务端程序,一个运行客户端程序。