为了复习JAVA的网络编程,我们编写了一个例子TimeServer,在此样例中,客户端可以给服务端发送一个时间查询请求,然后服务端服务端返回当前的时间。服务端代码结构如下:
TimeServer类负责监听端口,待TCP请求到来时,启动一个新的线程TimeServerHandler来处理该请求。如下图所示。
TimeServer 代码如下:
package bio.sample;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
public class TimeServer {
public static void main(String[] args) {
int port = 8070;//默认端口
if(args != null && args.length > 0)
{
port = Integer.valueOf(args[0]);
}
ServerSocket server = null;
try{
server = new ServerSocket(port);
System.out.println("The time Server is start in port :"+ port);
Socket socket = null;
while(true)
{
socket = server.accept();
new Thread(new TimeServerHandler(socket)).start();
}
}
catch(Exception e)
{
e.printStackTrace();
}
try {
server.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
TimeServerHandle 代码如下:
package bio.sample;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Date;
public class TimeServerHandler implements Runnable {
private Socket socket;
public TimeServerHandler(Socket socket)
{
this.socket = socket;
}
@Override
public void run() {
BufferedReader in = null;
PrintWriter out = null;
try {
in = new BufferedReader(new InputStreamReader(this.socket.getInputStream()));
//PrintWriter构造方法的第二个参数,如果为 true,则 println、printf 或 format 方法将刷新输出缓冲区
out = new PrintWriter(this.socket.getOutputStream(),true);
String currentTime = null;
String body = null;
while(true)
{
body = in.readLine();
if(body != null && body.length() != 0)
break;
}
System.out.println("the time server receive order:"+body);
currentTime = "QUERY TIME ORDER".equalsIgnoreCase(body) ?
new Date(System.currentTimeMillis()).toString():"BAD ORDER";
out.println(currentTime);
} catch (IOException e) {
e.printStackTrace();
}
try {
in.close();
out.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}