The Summer Server Application
  1 // In file network/ex1/SummerServer.java
  2 import java.net.*;
  3 import java.io.*;
  4 import java.util.StringTokenizer;
  5
  6 public class SummerServer {
  7
  8     public static final int PORT = 2000;
  9
 10     private static class InvalidLongException
 11         extends Exception {
 12
 13         private String message;
 14
 15         InvalidLongException(String s) {
 16             message = s;
 17         }
 18
 19         public String getMessage() {
 20             return message;
 21         }
 22     }
 23
 24     public static void main(String[] args)
 25         throws IOException {
 26
 27         ServerSocket listener =
 28             new ServerSocket(PORT);
 29
 30         try {
 31
 32             for (;;) {
 33
 34                 Socket sock = listener.accept();
 35
 36                 try {
 37
 38                     serveClient(sock);
 39                 }
 40                 finally {
 41                     sock.close();
 42                 }
 43             }
 44         }
 45         finally {
 46             listener.close();
 47         }
 48     }
 49
 50     private static void serveClient(Socket sock)
 51         throws IOException {
 52
 53         BufferedReader reader = new BufferedReader(
 54             new InputStreamReader(
 55                 sock.getInputStream()));
 56
 57         BufferedWriter writer = new BufferedWriter(
 58             new OutputStreamWriter(
 59                 sock.getOutputStream()));
 60
 61         for (;;) {
 62
 63             String s = reader.readLine();
 64
 65             if (s == null) {
 66                 break;
 67             }
 68
 69             String outString;
 70             try {
 71                 outString =
 72                     Long.toString(sumString(s));
 73             }
 74             catch(InvalidLongException e) {
 75                 outString = e.getMessage();
 76             }
 77             writer.write(outString);
 78             writer.newLine();
 79             writer.flush();
 80         }
 81     }
 82
 83     private static long sumString(String s)
 84         throws InvalidLongException {
 85
 86         long sum = 0;
 87
 88         StringTokenizer st = new StringTokenizer(s);
 89         String token;
 90         while (st.hasMoreTokens()) {
 91             token = st.nextToken();
 92             try {
 93                 sum += Long.parseLong(token);
 94             }
 95             catch (NumberFormatException e) {
 96                 throw new InvalidLongException(
 97                     "Invalid number: " + token);
 98             }
 99         }
100
101         return sum;
102     }
103 }
104 1 // In file network/ex1/SummerClient.java
 2 import java.net.*;
 3 import java.io.*;
 4
 5 public class SummerClient {
 6
 7     public static void main(String[] args)
 8         throws IOException {
 9
10         InetAddress ia = InetAddress.getByName(null);
11
12         Socket sock = new Socket(ia, SummerServer.PORT);
13
14         try {
15
16             BufferedReader serverReader =
17                 new BufferedReader(
18                     new InputStreamReader(
19                         sock.getInputStream()));
20
21             BufferedWriter serverWriter =
22                 new BufferedWriter(
23                     new OutputStreamWriter(
24                         sock.getOutputStream()));
25
26             LineNumberReader stdinReader =
27                 new LineNumberReader(
28                     new BufferedReader(
29                         new InputStreamReader(
30                             System.in)));
31
32             for (;;) {
33
34                 String userLine = stdinReader.readLine();
35
36                 if (userLine == null ||
37                     userLine.length() == 0) {
38
39                     break;
40                 }
41
42                 serverWriter.write(userLine);
43                 serverWriter.newLine();
44                 serverWriter.flush();
45
46                 String serverLine = serverReader.readLine();
47                 System.out.println(serverLine);
48             }
49         }
50         finally {
51             sock.close();
52         }
53     }
54 }
55
--------------------------------------------------------------------------------Handling Multiple Clients Concurrently
  1 // In file network/ex2/SummerServer.java
  2 import java.net.*;
  3 import java.io.*;
  4 import java.util.StringTokenizer;
  5
  6 public class SummerServer {
  7
  8     public static final int PORT = 2000;
  9
 10     private static class InvalidLongException
 11         extends Exception {
 12
 13         private String message;
 14
 15         InvalidLongException(String s) {
 16             message = s;
 17         }
 18
 19         public String getMessage() {
 20             return message;
 21         }
 22     }
 23
 24     private static class SummerService
 25         extends Thread {
 26
 27         private Socket sock;
 28
 29         public SummerService(Socket sock) {
 30             this.sock = sock;
 31         }
 32
 33         public void run() {
 34
 35             try {
 36
 37                 BufferedReader reader =
 38                     new BufferedReader(
 39                         new InputStreamReader(
 40                             sock.getInputStream()));
 41
 42                 BufferedWriter writer =
 43                     new BufferedWriter(
 44                         new OutputStreamWriter(
 45                             sock.getOutputStream()));
 46
 47                 for (;;) {
 48
 49                     String s = reader.readLine();
 50
 51                     if (s == null) {
 52                         break;
 53                     }
 54
 55                     String outString;
 56                     try {
 57                         outString =
 58                             Long.toString(sumString(s));
 59                     }
 60                     catch(InvalidLongException e) {
 61                         outString = e.getMessage();
 62                     }
 63                     writer.write(outString);
 64                     writer.newLine();
 65                     writer.flush();
 66                 }
 67             }
 68             catch (IOException e) {
 69             }
 70             finally {
 71                 try {
 72                     sock.close();
 73                 }
 74                 catch (IOException e) {
 75                 }
 76             }
 77         }
 78     }
 79
 80     public static void main(String[] args)
 81         throws IOException {
 82
 83         ServerSocket listener = new ServerSocket(PORT);
 84
 85         try {
 86
 87             for (;;) {
 88
 89                 Socket sock = listener.accept();
 90
 91                 SummerService ss =
 92                     new SummerService(sock);
 93                 ss.start();
 94             }
 95         }
 96         finally {
 97             listener.close();
 98         }
 99     }
100
101     private static long sumString(String s)
102         throws InvalidLongException {
103
104         long sum = 0;
105
106         StringTokenizer st = new StringTokenizer(s);
107         String token;
108         while (st.hasMoreTokens()) {
109             token = st.nextToken();
110             try {
111                 sum += Long.parseLong(token);
112             }
113             catch (NumberFormatException e) {
114                 throw new InvalidLongException(
115                     "Invalid number: " + token);
116             }
117         }
118
119         return sum;
120     }
121 }
122 1 // In file network/ex2/SummerClient.java
 2 import java.net.*;
 3 import java.io.*;
 4
 5 public class SummerClient {
 6
 7     public static void main(String[] args)
 8         throws IOException {
 9
10         InetAddress ia = InetAddress.getByName(null);
11
12         Socket sock = new Socket(ia,
13             SummerServer.PORT);
14
15         try {
16
17             BufferedReader serverReader =
18                 new BufferedReader(
19                     new InputStreamReader(
20                         sock.getInputStream()));
21
22             BufferedWriter serverWriter =
23                 new BufferedWriter(
24                     new OutputStreamWriter(
25                         sock.getOutputStream()));
26
27             LineNumberReader stdinReader =
28                 new LineNumberReader(
29                     new BufferedReader(
30                         new InputStreamReader(
31                             System.in)));
32
33             for (;;) {
34
35                 String userLine =
36                     stdinReader.readLine();
37
38                 if (userLine == null ||
39                     userLine.length() == 0) {
40
41                     break;
42                 }
43
44                 serverWriter.write(userLine);
45                 serverWriter.newLine();
46                 serverWriter.flush();
47
48                 String serverLine =
49                     serverReader.readLine();
50                 System.out.println(serverLine);
51             }
52         }
53         finally {
54             sock.close();
55         }
56     }
57 }
58

解决方案 »

  1.   

    路人甲,谢谢指点了
    但是我不能用readline的
    数据生成是通过JDBC从数据库里得到
    如取得两个字段name和age
    就生成一个串:格式*(以*1开始)name^age*3(以*3结束)
    而串里还有中文字符,比如name,在缓冲区里可能有若干个这样的串,如
    *1sam^25*3*1路人甲^25*3*1路人乙^25*3.......
    IO该怎么处理,谢谢
      

  2.   

    继承BufferedReader创建读数据库记录的类。
    public class BufferedDBReader extends BufferReader {
      BufferedDBReader(InputStreamReader isr){
        super(isr);
      }
      public String readRecordString (){
        //根据输入流的格式读取一条记录  
      }
    }然后在以上程序中使用readRecordString()代替readLine()
    代码如下:.......17            BufferedDBReader serverReader =
    18                new BufferedDBReader(
    19                    new InputStreamReader(
    20                        sock.getInputStream()));.......35                String userLine =
    36                    serverReader.readRecordString();
    37
    .......