伺服器和客戶端的json資料互動(http/socket兩種方式)
阿新 • • 發佈:2019-01-01
一、首先是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目錄下