Code Bye

JAVA HTTPClient程序转C#(求帮助,分不是问题)

背景是这样,现有一个JAVA的程序,运行正常能够得到返回值
代码如下
package Demo;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.zip.GZIPInputStream;
import java.util.zip.GZIPOutputStream;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.params.HttpClientParams;
import com.google.gson.Gson;
public class Demo
{
	public void login()
	{
		String url = "http://116.228.73.38:2227/receive//plogin.action";
		String js = "000367{"tid":"LYSTO2760000001","trace":"","mty":"0851","opOrgCode":"900000","deviceType":"PDA","opTerminal":"LYSTO2760000001","empCode":"9000000615","pdaPassword":"1234","verifyDate":"2016-06-20 09:40:08","connectionType":"2","os":"01","osVersion":"0.0.0.0","softVersion":"0.0.0.0","pdaType":"LYSTO"}";
		doPostClient(js, url);
	}
	public static String doPostClient(String json, String url)
	{
		HttpClient httpClient = new HttpClient();
		String rval = "";
		PostMethod postMethod = new PostMethod(url);
		try
		{
			Gson gson = new Gson();
			InputStream in = new ByteArrayInputStream(objectToByte(json));
			postMethod.setRequestBody(in);
			HttpClientParams params = new HttpClientParams();
			httpClient.setParams(params);
			httpClient.executeMethod(postMethod);
			byte[] b = postMethod.getResponseBody();
			System.out.println(b.length);
			String rtnData = (String) byteToObject(b);
			rval = gson.toJson(rtnData);
			System.out.println(rtnData);
		} catch (Exception e)
		{
			System.out.println(e.getMessage() + "," + e.getStackTrace());
		} finally
		{
			postMethod.releaseConnection();
		}
		return rval;
	}
	public static byte[] objectToByte(java.lang.Object obj)
	{
		byte[] bytes = null;
		ObjectOutputStream oo = null;
		try
		{
			ByteArrayOutputStream out = new ByteArrayOutputStream();
			GZIPOutputStream gzip = new GZIPOutputStream(out);
			gzip.write(obj.toString().getBytes("utf-8"));
			gzip.close();
			bytes = out.toByteArray();
		} catch (Exception e)
		{
			System.out.println("translation" + e.getMessage());
			e.printStackTrace();
		} finally
		{
			if (oo != null)
			{
				try
				{
					oo.close();
				} catch (IOException e)
				{
					e.printStackTrace();
				}
			}
		}
		return bytes;
	}
	private static java.lang.Object byteToObject(byte[] bytes)
	{
		java.lang.Object obj = null;
		ObjectInputStream oi = null;
		try
		{
			ByteArrayInputStream bi = new ByteArrayInputStream(bytes);
			GZIPInputStream gzipi = new GZIPInputStream(bi);
			BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(gzipi, "UTF-8"));
			String line;
			while ((line = bufferedReader.readLine()) != null)
			{
				System.out.println(line);
			}
		} catch (Exception e)
		{
			System.out.println("translation" + e.getMessage());
			e.printStackTrace();
		} finally
		{
			if (oi != null)
			{
				try
				{
					oi.close();
				} catch (IOException e)
				{
					e.printStackTrace();
				}
			}
		}
		return obj;
	}
	public static void main(String[] args)
	{
		Demo client = new Demo();
		client.login();
	}
}

本人转换成的C#程序

        public static void LogIN()
        {
            String url = "http://116.228.73.38:2227/receive/plogin.action";
            String js = "000367{"tid":"LYSTO2760000001","trace":"","mty":"0851","opOrgCode":"900000","deviceType":"PDA","opTerminal":"LYSTO2760000001","empCode":"9000000615","pdaPassword":"1234","verifyDate":"2016-06-20 09:40:08","connectionType":"2","os":"01","osVersion":"0.0.0.0","softVersion":"0.0.0.0","pdaType":"LYSTO"}";
            DoPostClient(js, url);
        }
        public static string DoPostClient(string json, string url)
        {
            HttpWebRequest req = null;
            HttpWebResponse rsp = null;
            System.IO.Stream reqStream = null;
            try
            {
                req = (HttpWebRequest)WebRequest.Create(url);
                req.Method = "POST";
                req.ContentType = "application/x-www-form-urlencoded";
                byte[] postData = Compress(json);         
                req.Proxy = null;
                req.ContentLength = postData.Length;
                reqStream = req.GetRequestStream();
                reqStream.Write(postData, 0, postData.Length);
                rsp = (HttpWebResponse)req.GetResponse();
                string resut = "";
                return resut;
            }
            catch (Exception ex)
            {
                return ex.Message;
            }
            finally
            {
                if (reqStream != null) reqStream.Close();
                if (rsp != null) rsp.Close();
            }           
        }
        /// <summary>
        /// 压缩字符串
        /// </summary>
        /// <param name="text"></param>
        /// <returns></returns>
        public static byte[] Compress(string text)
        {         
           byte[] buffer = Encoding.UTF8.GetBytes(text);
           using (MemoryStream ms = new MemoryStream())
           {
               GZipStream compressedzipStream = new GZipStream(ms, CompressionMode.Compress, false);
               compressedzipStream.Write(buffer, 0, buffer.Length);
               compressedzipStream.Close();
               buffer = ms.ToArray();
           }
           int[] test = new int[buffer.Length];
            for(int i=0;i<buffer.Length;i++)
            {
                if(buffer[i]>127)
                    test[i] = buffer[i] - 256;
                else
                    test[i] = buffer[i];
            }
           return buffer; ;
        }

原因是C#和JAVA的Byte不一样,java的可以,而C#的不成功,求高手帮解答,C#返回404,JAVA程序传入的参数假如不进行 GZIP压缩服务器也会无应答, 大家有什么方法让本人C#端把 那个Java的程序调通吗,本人试了转化JAVA为c#的DLL,也没成功,HttpClient初始化总失败,看看谁能在C#中把那段Java程序运行起来

解决方案

10

 byte[] rawData = System.Text.Encoding.UTF8.GetBytes(text);
  MemoryStream ms = new MemoryStream();
            GZipStream compressedzipStream = new GZipStream(ms, CompressionMode.Compress, true);
            compressedzipStream.Write(rawData, 0, rawData.Length);
            compressedzipStream.Close();
           buffer =ms.ToArray();

试试。 或换下编码格式。

30

引用 2 楼 kaoleba126com 的回复:

地址是没有问题的,对方服务器也能收到报文,只是不能解码。你没看到JAVA和C#的地址一摸一样吗,这个地方的难点是java的压缩后的byte[]和c#压缩后的byte[]值不一样,服务器解压缩失败就会无应答,本人这边就得到了404

本人写的测试代码:

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            var bytes = Compress("TEST");
            Console.WriteLine(Convert.ToBase64String(bytes));       //H4sIAAAAAAAEAAtxDQ4BALiT6u4EAAAA
        }
        public static byte[] Compress(string text)
        {
            byte[] buffer = Encoding.UTF8.GetBytes(text);
            using (MemoryStream ms = new MemoryStream())
            {
                GZipStream compressedzipStream = new GZipStream(ms, CompressionMode.Compress, false);
                compressedzipStream.Write(buffer, 0, buffer.Length);
                compressedzipStream.Close();
                buffer = ms.ToArray();
            }
            int[] test = new int[buffer.Length];
            for (int i = 0; i < buffer.Length; i++)
            {
                if (buffer[i] > 127)
                    test[i] = buffer[i] - 256;
                else
                    test[i] = buffer[i];
            }
            return buffer; ;
        }
    }
public class Main {
    public static void main(String[] args) {
        byte[] bytes = objectToByte("TEST");
        String str = (new sun.misc.BASE64Encoder()).encode(bytes);
        System.out.println(str);        //H4sIAAAAAAAAAAtxDQ4BALiT6u4EAAAA
    }
    public static byte[] objectToByte(java.lang.Object obj)
    {
        byte[] bytes = null;
        ObjectOutputStream oo = null;
        try
        {
            ByteArrayOutputStream out = new ByteArrayOutputStream();
            GZIPOutputStream gzip = new GZIPOutputStream(out);
            gzip.write(obj.toString().getBytes("utf-8"));
            gzip.close();
            bytes = out.toByteArray();
        } catch (Exception e)
        {
            System.out.println("translation" + e.getMessage());
            e.printStackTrace();
        } finally
        {
            if (oo != null)
            {
                try
                {
                    oo.close();
                } catch (IOException e)
                {
                    e.printStackTrace();
                }
            }
        }
        return bytes;
    }
}

你确定有对比过C# Gzip压缩和java Gzip压缩后的字节数组能否一致?

60

你本人吧java里的gzip方法编译成jar包,甚至把整段代码都封装到jar里,提供给C#就可以了

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明JAVA HTTPClient程序转C#(求帮助,分不是问题)