服务器的写入和读取

来源:互联网 发布:淘宝大鼻子俄罗斯代购 编辑:程序博客网 时间:2024/05/28 17:07

设置服务器监听

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
  }
  
 }

}


 

0 0
原创粉丝点击