1. 程式人生 > >伺服器和客戶端的json資料互動(http/socket兩種方式)

伺服器和客戶端的json資料互動(http/socket兩種方式)

一、首先是Http方式
伺服器端:

@WebServlet("/service")
public class ServiceServlet extends HttpServlet {
    private static final long serialVersionUID=1L;

    public void doGet(HttpServletRequest request,HttpServletResponse response) 
            throws IOException {
        this.doPost(request, response);
    }
    public
void doPost(HttpServletRequest request,HttpServletResponse response) throws IOException { System.out.println("doPost方法進來"); response.setContentType("text/html");//解決中文亂碼 response.setCharacterEncoding("UTF-8"); DataInputStream inputStream = null; //資料輸入流 String strInputstream =""
; inputStream =new DataInputStream(request.getInputStream()); ByteArrayOutputStream baos = new ByteArrayOutputStream(); // 可以捕獲記憶體緩衝區的資料,轉換成位元組陣列 byte[] by = new byte[2048]; int n; while((n=inputStream.read(by))!=-1){ //將流中的資料緩衝到位元組陣列中去,如果沒到末尾返回的是真實個數,到末尾時,返回的是-1;
baos.write(by,0,n); //readline將會把json格式破壞掉 } strInputstream = new String(baos.toByteArray()); inputStream.close(); baos.close(); JSONObject jsonObject=JSONObject.fromObject(strInputstream); System.out.printf("客戶端請求的資料:"+jsonObject.toString()); System.out.println(""); @SuppressWarnings("unchecked") Map<String,Object> map=jsonObject; Object value=0; for(Entry<String, Object> entry:map.entrySet() ) { value=entry.getValue(); System.out.println(entry.getKey()+"="+entry.getValue()); } System.out.println(""); //連線資料庫 Connection connection=DBUtils.getConnection(); String sql="select software_type,software_version from soft_version_info"; try { PreparedStatement pstm=connection.prepareStatement(sql); ResultSet rs=pstm.executeQuery(); // 獲取表結構 ResultSetMetaData md = rs.getMetaData(); // 得到行的總數 int num = md.getColumnCount(); JSONArray jsonArray = new JSONArray(); while(rs.next()) { String version = rs.getString("software_version"); JSONObject mapOfColValues = new JSONObject(); for (int i = 1; i <= num; i++) { // 新增鍵值對 if((Object)rs.getObject(i)==value) { mapOfColValues.put("server", "version"); mapOfColValues.put(md.getColumnName(i), rs.getObject(i)); mapOfColValues.put("software_version", version); PrintWriter out=response.getWriter(); out.write(mapOfColValues.toString()); System.out.println("伺服器響應的資料:"+mapOfColValues.toString()); out.flush(); out.close(); } } jsonArray.add(mapOfColValues); } } catch (SQLException e) { e.printStackTrace(); } } }

客戶端:

public class ClientServlet{


    private static String urlPath="http://localhost:8080/JsonUse/service";




    public static void main(String[] args) throws IOException {
        URL db=new URL(ClientServlet.urlPath);
        HttpURLConnection link=(HttpURLConnection) db.openConnection();
        link.setDoInput(true);
        link.setDoOutput(true);
        link.setRequestMethod("POST");
        link.setRequestProperty("Charset", "UTF-8");
        //請求
        DataOutputStream dos=new DataOutputStream(link.getOutputStream());
        JSONObject jsonObject=new JSONObject();
        //填充json資料內容
        jsonObject.put("server", "getversion");
        jsonObject.put("softtype", 4);
        //json轉化成字串
        String string=jsonObject.toString();
        //字串轉化byte陣列
        byte[] bytes=string.getBytes();
        //傳送json資料
        //pWriter.write(bytes);
        dos.write(bytes);
        dos.flush();//重新整理,向伺服器傳送資訊;
        dos.close();
        //響應
        //列出原始資料
        StringBuilder json=new StringBuilder();
        BufferedReader in=new BufferedReader(new InputStreamReader(link.getInputStream(),"UTF-8"));
        String inputLine=null;
        while((inputLine=in.readLine())!=null) {
            json.append(inputLine);
        }
        in.close();
        String Strjson=json.toString();
        System.out.println("伺服器返回的資料:");
        System.out.println(Strjson.toString());
    }
}

執行後伺服器控制檯輸出:

doPost方法進來
客戶端請求的資料:{"server":"getversion","softtype":4}
server=getversion
softtype=4

伺服器響應的資料:{"server":"version","software_type":4,"software_version":"v1.0"}

客戶端控制檯輸出:

伺服器返回的資料:
{"server":"version","software_type":4,"software_version":"v1.0"}

二、用socket方式
伺服器端:

public class Service {
    public static void main(String[] args) {
        try {
             @SuppressWarnings("resource")
            ServerSocket serverSocket=new ServerSocket(8888);//繫結埠號
             System.out.println("***伺服器已經開啟***");//提示資訊
             Socket socket=null;//
             //Integer count=0;
             socket=serverSocket.accept();//這個socket用來讀取接受的資料

             DataInputStream inputStream = null;  //資料輸入流
            // DataOutputStream outputStream = null;  //資料輸出流
             String strInputstream =""; 

             inputStream =new DataInputStream(socket.getInputStream());                   
             ByteArrayOutputStream baos = new ByteArrayOutputStream();  // 可以捕獲記憶體緩衝區的資料,轉換成位元組陣列
             byte[] by = new byte[2048];  
             int n;  
             while((n=inputStream.read(by))!=-1){  //將流中的資料緩衝到位元組陣列中去,如果沒到末尾返回的是真實個數,到末尾時,返回的是-1;
                 baos.write(by,0,n);    //readline將會把json格式破壞掉       
             }  
             strInputstream = new String(baos.toByteArray()); 
             socket.shutdownInput();  
             baos.close();  

             JSONObject jsonObject=JSONObject.fromObject(strInputstream);
             //String software_version=jsonObject.optString("server");
             //String software_type=jsonObject.optString("softtype");
             System.out.printf("客戶端請求的資料:"+jsonObject.toString());
             System.out.println("");
             @SuppressWarnings("unchecked")
            Map<String,Object> map=jsonObject;
             Object value=0;
             for(Entry<String, Object> entry:map.entrySet() ) {
                 value=entry.getValue();
                 System.out.println(entry.getKey()+"="+entry.getValue());
             }
//             System.out.println(value);
             System.out.println("");

            //連線資料庫
            Connection connection=DBUtils.getConnection();
            String sql="select software_type,software_version from soft_version_info";

            PreparedStatement ptmt=connection.prepareStatement(sql);
            ResultSet rs = ptmt.executeQuery();
            // 獲取表結構
            ResultSetMetaData md = rs.getMetaData();
            // 得到行的總數
            int num = md.getColumnCount();
            JSONArray jsonArray = new JSONArray();
            while( rs.next() ){                  //下移一條
                //int softtype = rs.getInt("software_type");  //rs.getString( 列索引 );
                String version = rs.getString("software_version"); 
                 JSONObject mapOfColValues = new JSONObject();
                  for (int i = 1; i <= num; i++) {
                    // 新增鍵值對
                    if((Object)rs.getObject(i)==value) {
                        mapOfColValues.put("server", "version");
                        mapOfColValues.put(md.getColumnName(i), rs.getObject(i));
                        mapOfColValues.put("software_version", version);
                        System.out.println("伺服器響應的資料:"+mapOfColValues.toString());
                      }                 
                  }              
                  jsonArray.add(mapOfColValues);
//              System.out.printf( "%d, %s\r", softtype, version);
            } 
            //伺服器響應客戶端
            int port =socket.getPort();
            System.out.printf("客戶端埠號:"+port);

//            Socket socket1=new Socket("localhost",port);
//            OutputStream os = socket1.getOutputStream();
//            PrintWriter pw =new PrintWriter(os);
//      
//            pw.flush();
//            socket1.shutdownOutput();
//            pw.close();
//            os.close();
//            socket1.close();
        } catch (SQLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

客戶端:

public class Client {

    public static void main(String[] args) throws UnknownHostException, IOException {
        Socket socket=new Socket("localhost",8888);//客戶端socket,用來發送資料。
        OutputStream outputStream=socket.getOutputStream();
        //PrintWriter pWriter=new PrintWriter(outputStream);
        //建立json格式資料
        JSONObject jsonObject=new JSONObject();
        //填充json資料內容
        jsonObject.put("server", "getversion");
        jsonObject.put("softtype", 4);
        //json轉化成字串
        String string=jsonObject.toString();
        //字串轉化byte陣列
        byte[] bytes=string.getBytes();
        //傳送json資料
        //pWriter.write(bytes);
        outputStream.write(bytes);
        outputStream.flush();//重新整理,向伺服器傳送資訊;
        //pWriter.
        //pWriter.flush();
        socket.shutdownOutput();

        //pWriter.close();
        outputStream.close();
        socket.close();


        int port =socket.getLocalPort();
        System.out.println("客戶端傳送的請求資料埠:"+port);
        System.out.println();

//      @SuppressWarnings("resource")
//      ServerSocket serverSocket=new ServerSocket(port);
//
//      Socket socket1=serverSocket.accept();
//      
//      
//      InputStream is=socket1.getInputStream();
//      InputStreamReader inr =new InputStreamReader(is);
//      BufferedReader bReader=new BufferedReader(inr);
//      System.out.println(bReader);
//      String data = bReader.readLine();
//      System.out.println(data);
//      while(data!=null)
//      {
//          System.out.println("資料是:"+data);
//          data=bReader.readLine();
//      }
//
//      socket1.shutdownInput();
//      bReader.close();
//      inr.close();
//      is.close();
//      socket1.close();
    }

 }

執行後,客戶端控制檯輸出:

客戶端傳送的請求資料埠:55328

伺服器控制檯輸出:

***伺服器已經開啟***
客戶端請求的資料:{"server":"getversion","softtype":4}
server=getversion
softtype=4

伺服器響應的資料:{"server":"version","software_type":4,"software_version":"v1.0"}
客戶端埠號:55328

json資料塊的轉化:

//建立json格式資料
        JSONObject jsonObject=new JSONObject();
        //填充json資料內容
        jsonObject.put("server", "getversion");
        jsonObject.put("softtype", 4);
        //json轉化成字串
        String string=jsonObject.toString();
        //字串轉化byte陣列
        byte[] bytes=string.getBytes();

用JSONObject,需要匯入幾個jar包,如下:

json-lib-2.4-jdk15.jar
commons-lang-2.5.jar
commons-beanutils-1.7.0.jar
ezmorph-1.0.3.jar
commons-collections-3.1.jar
commons-logging-1.1.1.jar

需要匯入到WebContent/WEB-INF/lib目錄下