java Socket 使用通用json包 发送 json对象

在使用json进行socket进行通信中,由于服务器使用的json 和 客户端使用的json版本不同,因此改用通用的json包来通信。

引入的包为 org.json,jar   

可以通用,而且不必使用其他的一些需要引入的其他json依赖包


文章中的例子是将一张图片发送到服务器端,服务器端收到信息之后返回给客户端是否接受成功的信息


这里贴出客户端与服务器端的代码

客户端:

  1. package service;  
  2. import java.io.ByteArrayOutputStream;  
  3. import java.io.DataInputStream;  
  4. import java.io.DataOutputStream;  
  5. import java.io.IOException;  
  6. import java.net.Socket;  
  7. import java.util.HashMap;  
  8. import java.util.Map;  
  9. import org.json.JSONArray;  
  10. import org.json.JSONException;  
  11. import org.json.JSONObject;  
  12. import java.io.BufferedInputStream;  
  13. import cn.edu.thu.cv.util.Base64Image;  
  14.   
  15. public class Client {  
  16.     public static final String IP_ADDR = "***.***.***.***";//服务器地址  这里要改成服务器的ip  
  17.     public static final int PORT = 12345;//服务器端口号    
  18.       
  19.       
  20.     public static int register(String name,String imgPath,int opNum){  
  21.         String imgStr = Base64Image.GetImageStr(imgPath);//是将图片的信息转化为base64编码  
  22.         int isRegSuccess = 0;  
  23.          while (true) {    
  24.                 Socket socket = null;  
  25.                 try {  
  26.                     //创建一个流套接字并将其连接到指定主机上的指定端口号  
  27.                     socket = new Socket(IP_ADDR, PORT);    
  28.                     System.out.println("连接已经建立");          
  29.                     //向服务器端发送数据    
  30.                     Map<String, String> map = new HashMap<String, String>();  
  31.                     map.put("name",name);  
  32.                     map.put("img",imgStr);  
  33.                     map.put("op",opNum+"");  
  34.                     //将json转化为String类型    
  35.                     JSONObject json = new JSONObject(map);  
  36.                     String jsonString = "";  
  37.                         jsonString = json.toString();  
  38.                     //将String转化为byte[]  
  39.                     //byte[] jsonByte = new byte[jsonString.length()+1];  
  40.                     byte[] jsonByte = jsonString.getBytes();  
  41.                     DataOutputStream outputStream = null;  
  42.                     outputStream = new DataOutputStream(socket.getOutputStream());  
  43.                         System.out.println("发的数据长度为:"+jsonByte.length);  
  44.                     outputStream.write(jsonByte);  
  45.                     outputStream.flush();  
  46.                         System.out.println("传输数据完毕");  
  47.                         socket.shutdownOutput();  
  48.                       
  49.                     //读取服务器端数据    
  50.                     DataInputStream inputStream = null;  
  51.                     String strInputstream ="";  
  52.                     inputStream = new DataInputStream(new BufferedInputStream(socket.getInputStream()));   
  53.                     strInputstream=inputStream.readUTF();  
  54.                     System.out.println("输入信息为:"+strInputstream);  
  55.                     JSONObject js = new JSONObject(strInputstream);  
  56.                     System.out.println(js.get("isSuccess"));  
  57.                     isRegSuccess=Integer.parseInt((String) js.get("isSuccess"));   
  58.                     // 如接收到 "OK" 则断开连接    
  59.                     if (js != null) {    
  60.                         System.out.println("客户端将关闭连接");    
  61.                         Thread.sleep(500);    
  62.                         break;    
  63.                     }    
  64.                       
  65.                 } catch (Exception e) {  
  66.                     System.out.println("客户端异常:" + e.getMessage());   
  67.                     break;  
  68.                 } finally {  
  69.                     if (socket != null) {  
  70.                         try {  
  71.                             socket.close();  
  72.                         } catch (IOException e) {  
  73.                             socket = null;   
  74.                             System.out.println("客户端 finally 异常:" + e.getMessage());   
  75.                         }  
  76.                     }  
  77.                 }  
  78.             }  
  79.          return isRegSuccess;     
  80.     }  
  81.       
  82.     public static void main(String[] args) {    
  83.           register("gongyunfei","D:/test1.jpg",1);//第三个参数为操作类型 服务器能够知道你在进行什么操作  
  84.    }    
  85. }   

服务器端的代码:

  1. package service;  
  2. import java.net.ServerSocket;  
  3. import java.net.Socket;  
  4. import java.util.ArrayList;  
  5. import java.util.HashMap;  
  6. import java.util.Map;  
  7. import java.util.Date;  
  8. import java.text.SimpleDateFormat;  
  9. import java.io.BufferedOutputStream;  
  10. import java.io.ByteArrayOutputStream;  
  11. import java.io.DataInputStream;  
  12. import java.io.DataOutputStream;  
  13. import org.json.JSONArray;  
  14. import org.json.JSONException;  
  15. import org.json.JSONObject;  
  16. import cn.edu.thu.cv.util.Base64Image;  
  17.   
  18.   
  19. public class Server {  
  20.     public static final int PORT = 12345;//监听的端口号     
  21.           
  22.     public static void main(String[] args) {    
  23.         System.out.println("服务器启动...\n");    
  24.       //  System.loadLibrary(Core.NATIVE_LIBRARY_NAME);  
  25.         Server server = new Server();    
  26.         server.init();    
  27.     }    
  28.     
  29.     public void init() {    
  30.         try {    
  31.             ServerSocket serverSocket = new ServerSocket(PORT);    
  32.             while (true) {    
  33.                 // 一旦有堵塞, 则表示服务器与客户端获得了连接    
  34.                 Socket client = serverSocket.accept();    
  35.                 // 处理这次连接    
  36.                 new HandlerThread(client);    
  37.             }    
  38.         } catch (Exception e) {    
  39.             System.out.println("服务器异常: " + e.getMessage());    
  40.         }    
  41.     }    
  42.     
  43.     private class HandlerThread implements Runnable {    
  44.         private Socket socket;    
  45.         public HandlerThread(Socket client) {    
  46.             socket = client;    
  47.             new Thread(this).start();    
  48.         }    
  49.     
  50.         public void run() {    
  51.                
  52.             try {    
  53.                 // 读取客户端数据    
  54.                 System.out.println("客户端数据已经连接");  
  55.                 DataInputStream inputStream = null;  
  56.                 DataOutputStream outputStream = null;  
  57.                 String strInputstream ="";           
  58.                 inputStream =new DataInputStream(socket.getInputStream());                   
  59.                 ByteArrayOutputStream baos = new ByteArrayOutputStream();  
  60.                 byte[] by = new byte[2048];  
  61.                 int n;  
  62.                 while((n=inputStream.read(by))!=-1){  
  63.                     baos.write(by,0,n);           
  64.                 }  
  65.                 strInputstream = new String(baos.toByteArray());  
  66. //                System.out.println("接受到的数据长度为:"+strInputstream);  
  67.                 socket.shutdownInput();  
  68. //                inputStream.close();  
  69.                 baos.close();  
  70.                   
  71.                   
  72.                 // 处理客户端数据    
  73.                 //将socket接受到的数据还原为JSONObject  
  74.                 JSONObject json = new JSONObject(strInputstream);         
  75.                 int op =Integer.parseInt((String)json.get("op"));    
  76.                 System.out.println(op);  
  77.                 switch(op){  
  78.                   
  79.                 //op为1 表示收到的客户端的数据为注册信息     op为2表示收到客户端的数据为检索信息       
  80.                   
  81.                 //当用户进行的操作是注册时  
  82.                 case 1: String imgStr = json.getString("img");  
  83.                         String name   = json.getString("name");  
  84.                        //isSuccess 表示是否注册成功  
  85.                         String isSuccess="1";  
  86.                        // System.out.println("imgStr:"+imgStr);  
  87.                         //用系统时间作为生成图片的名字   格式为yyyy-MM-dd-HH-mm-ss  
  88.                         SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss");  
  89.                         String imgName = df.format(new Date());  
  90.                         Base64Image.GenerateImage(imgStr,"D:\\fromjia\\imageDB\\primary\\"+imgName+".jpg");  
  91.                         //do something to process this image                        
  92.                         //if success, return set isSuccess "1"  
  93.                         //else set "0"    
  94.                         System.out.println(name);                   
  95.                         System.out.println("服务器接受数据完毕");  
  96.                           
  97.                         // 向客户端回复信息  --json对象//to be continued;  
  98.                         Map<String, String> map = new HashMap<String, String>();  
  99.                         map.put("isSuccess", isSuccess);  
  100.                         json = new JSONObject(map);  
  101.                     String jsonString = json.toString();                        
  102.                     outputStream = new DataOutputStream(new BufferedOutputStream (socket.getOutputStream()));     
  103.                     outputStream.writeUTF(jsonString);  
  104.                     outputStream.flush();  
  105.                     outputStream.close();  
  106.                     System.out.println("注册完成");  
  107.                         break;                                                                                         
  108.                 }   
  109.                   
  110.                 outputStream.close();  
  111.             } catch (Exception e) {    
  112.                 System.out.println("服务器 run 异常: " + e.getMessage());    
  113.             } finally {    
  114.                 if (socket != null) {    
  115.                     try {    
  116.                         socket.close();    
  117.                     } catch (Exception e) {    
  118.                         socket = null;    
  119.                         System.out.println("服务端 finally 异常:" + e.getMessage());    
  120.                     }    
  121.                 }    
  122.             }   
  123.         }    
  124.     }    
  125. }    


文中所要引用的import cn.edu.thu.cv.util.Base64Image代码为:

  1. package cn.edu.thu.cv.util;  
  2.   
  3. import java.io.FileInputStream;  
  4. import java.io.FileOutputStream;  
  5. import java.io.IOException;  
  6. import java.io.InputStream;  
  7. import java.io.OutputStream;  
  8.   
  9. import sun.misc.BASE64Decoder;  
  10. import sun.misc.BASE64Encoder;  
  11.   
  12. public class Base64Image   
  13. {  
  14.     public static String GetImageStr(String imapath)  
  15.     {//将图片文件转化为字节数组字符串,并对其进行Base64编码处理  
  16.         InputStream in = null;  
  17.         byte[] data = null;  
  18.         //读取图片字节数组  
  19.         try   
  20.         {  
  21.             in = new FileInputStream(imapath);          
  22.             data = new byte[in.available()];  
  23.             in.read(data);  
  24.             in.close();  
  25.         }   
  26.         catch (IOException e)   
  27.         {  
  28.             e.printStackTrace();  
  29.         }  
  30.         //对字节数组Base64编码  
  31.         BASE64Encoder encoder = new BASE64Encoder();  
  32.         return encoder.encode(data);//返回Base64编码过的字节数组字符串  
  33.     }  
  34.     public static boolean GenerateImage(String imgStr, String output)  
  35.     {//对字节数组字符串进行Base64解码并生成图片  
  36.         if (imgStr == null//图像数据为空  
  37.             return false;  
  38.         BASE64Decoder decoder = new BASE64Decoder();  
  39.         try   
  40.         {  
  41.             //Base64解码  
  42.             byte[] b = decoder.decodeBuffer(imgStr);  
  43.             for(int i=0;i<b.length;++i)  
  44.             {  
  45.                 if(b[i]<0)  
  46.                 {//调整异常数据  
  47.                     b[i]+=256;  
  48.                 }  
  49.             }  
  50.             //生成jpeg图片  
  51.             OutputStream out = new FileOutputStream(output);      
  52.             out.write(b);  
  53.             out.flush();  
  54.             out.close();  
  55.             return true;  
  56.         }   
  57.         catch (Exception e)   
  58.         {  
  59.             return false;  
  60.         }  
  61.     }  
  62. }  
之前认为写的时候还是很简单的,不过写的过程中遇到了一些问题,将这些问题总结一下如下:

1.传输文件过程中,要将文件转换成base64编码。

2.要统一好编程的工具、配置环境,包括使用的具体包的形式,我这次遇到的情况是:甲写服务器端,使用的是json2.4的包,并且测试没有问题。乙写的客户端引用了一个j2E,里面包含了json2.1,而且json2.1无法删除替换,这样通信方式就会改变,服务器与客户端无法完成通信。只能使用通用json包,增加了不少工作量。

3.在使用org.json 中,传输比较小的字符串,可以使用outputStream.writeUTF(String);这个函数来写,但是当传输比较大的文件的时候就必须将String转化为byte[]来进行传输,不然会报出异常说是编码太大无法传输。

4.在发送完数据之后要记得flush();

5.在使用outputStream.close();或者inputStream.close();来关闭服务器的输入流和输出流的过程中,socket也会同时关闭,如果想只关闭输入流或者输出流而不关闭socket就可以使用socket.shutdownInput();

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值