设置服务器监听
package com.lovo.server;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketAddress;
public class ListenServer {
public ListenServer(){
try {
//开启服务器,并开放8080端口
ServerSocket serverSocket = new ServerSocket(8080);
while(true){
//监听端口,如果有客户端连接到服务器,那么将信息封装成socket对象
Socket socket = serverSocket.accept();
SocketThread sThread = new SocketThread(socket);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
new ListenServer();
}
}
处理读取流
package com.lovo.server;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
/**
* Date : 2016年6月29日
* @description : 处理读取流的请求对象
*/
public class Request {
private InputStream inputStream;
/**获取键*/
private String url;
/**请求参数封装的Map集合*/
private Map<String, String> paramMap = new HashMap<String,String>();
public Request(InputStream inputStream){
this.inputStream = inputStream;
try {
byte[] by = new byte[1024];
//将读取的数据读取到字节数组
inputStream.read(by);
//将字节数组封装成字符串
String string = new String(by).trim();
if(string.startsWith("GET")){
pressGET(string);
}
else if(string.startsWith("POST")){
pressPOST(string);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//对于post做解析
private void pressPOST(String string) {
// TODO Auto-generated method stub
String[] sarray = string.split("\\s+");
this.url = sarray[1].substring(1);
this.pressMap(sarray[sarray.length -1]);
}
//对get做解析
private void pressGET(String string) {
// TODO Auto-generated method stub
String[] sarray = string.split("\\s+");
if(sarray[1].indexOf("?") != -1){//请求的是业务组件
String[] arr = sarray[1].split("[?]");
this.url = arr[0].substring(1);
this.pressMap(arr[1]);
}else{//请求是文件
this.url = sarray[1].substring(1);
}
}
//将a=1&b=2封装成map
private void pressMap(String string) {
// TODO Auto-generated method stub
String[] sarray = string.split("&");
for(String s:sarray){
String[] temparray = s.split("=");
if(temparray.length == 2){
this.paramMap.put(temparray[0],temparray[1]);
}else {
this.paramMap.put(temparray[0], "");
}
}
}
public String getUrl(){
return this.url;
}
/**
* @Title : getParameter
* @Description : 得到请求的参数,根据参数名,得到参数值
* @param : @param key 参数名
* @param : @return 参数值,如果参数名不存在,则返回null
* @return : String
* @throws
*/
public String getParameter(String key){
return this.paramMap.get(key);
}
@Override
public String toString() {
return "Request [inputStream=" + inputStream + ", url=" + url + ", paramMap=" + paramMap + "]";
}
}
处理写入流
package com.lovo.server;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
/**
* Date : 2016年6月29日
* @description : 处理写入流的响应对象
*/
public class Response {
private OutputStream outputStream;
public Response(OutputStream outputStream){
this.outputStream = outputStream;
}
//发送文本数据给客户端
public void sendMessage(String string){
try {
outputStream.write(string.getBytes());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//发送文件数据给客户端,filePath文件路径
public void sendFile(String filePath){
File file = new File(filePath);
//判断路径是否存在
if(file.exists() == false){
return;
}
//读取流
InputStream inputStream = null;
try {
//建立流
inputStream = new FileInputStream(filePath);
byte[] by = new byte[1024];
int lenth = 0;
//一次读取1024字节到数组,返回当前读取的字节数,如果返回-1,表示读取完毕
while((lenth = inputStream.read(by)) != -1){
outputStream.write(by,0,lenth);
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
if(inputStream != null){
try {
inputStream.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (outputStream != null) {
try {
outputStream.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
针对流的处理线程
package com.lovo.server;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import javax.imageio.spi.RegisterableService;
import com.lovo.service.Factory;
import com.lovo.service.LoginService;
import com.lovo.service.RegisterService;
import com.lovo.service.Servlet;
public class SocketThread implements Runnable{
private Socket socket;
public SocketThread(Socket socket){
this.socket = socket;
Thread thread = new Thread(this);
thread.start();
}
@Override
public void run() {
try {
//从socket中得到读取流,用于接受数据
InputStream inputStream= socket.getInputStream();
//从socket中得到写入流,用于发送数据
OutputStream outputStream = socket.getOutputStream();
//将写入流封装成响应对象
Response response = new Response(outputStream);
//将读取流封装成请求对象
Request request = new Request(inputStream);
System.out.println(request);
//得到客户端返回资源的路径
String url = request.getUrl();
//得到业务组件
Servlet object = (Servlet)Factory.getService(url);
if(object != null){//请求的是业务组件
object.service(request, response);
}else {// 请求的是文件
//发送数据给客户端
response.sendFile(url);
}
outputStream.flush();
inputStream.close();
outputStream.close();
socket.close();
} catch (Exception e) {
// TODO: handle exception
}
}
}