首页 新闻 会员 周边

利用 socket 获取 tcp 包并解析的问题。

0
悬赏园豆:5 [已关闭问题] 关闭于 2008-06-05 17:23
<P>服务器端代码如下:(Java Servlet 实现)<BR>protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {<BR>&nbsp;OutputStream out = response.getOutputStream();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; response.setContentType("image/png");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ChartUtilities.writeChartAsPNG(out, chart, 400, 300);&nbsp; // 将图片写入out中<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; response.flushBuffer();&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch (Exception e) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.err.println(e.toString());<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; finally {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out.close();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>} </P> <P><BR>////////////////////////////////////////////////////////////////////////////////////<BR>// 以下是客户端代码,通过socket取出TCP包,并解析<BR>////////////////////////////////////////////////////////////////////////////////////<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string request = "GET /PDAChart/ChartServlet?Chart=PieChart HTTP/1.1\r\n" +&nbsp; // 请求消息<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Host: " + server + ":" + port.ToString() + "\r\n" +&nbsp; // 主机和端口<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Connection: Close\r\n" +&nbsp;&nbsp; // 连接状态<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "\r\n";<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Byte[] bytesSent = Encoding.ASCII.GetBytes(request);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Byte[] bytesReceived = new Byte[256];</P> <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 创建Socket对象<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Socket s = ConnectSocket(server, port);</P> <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (s == null)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return ("Connection failed");</P> <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 向服务器发送请求<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; s.Send(bytesSen
问题补充: // 向服务器发送请求 s.Send(bytesSent, bytesSent.Length, 0); // 接收服务器页面内容 int bytes = 0; string page = "Default HTML page on " + server + ":\r\n"; // 安装一定的块接收数据 do { bytes = s.Receive(bytesReceived, bytesReceived.Length, 0); page = page + Encoding.ASCII.GetString(bytesReceived, 0, bytes); // 将数据转换为字符串 } while (bytes > 0); ///////////////////////////////////////////////////////////////////////////////////// // 解析 tcp包 查找\r\n\r\n int index = page.IndexOf("\r\n\r\n"); Console.WriteLine(page.Substring(0,index)); // 取出TCP包头 // 当TCP包体的内容也是文本的时候,没有问题 Console.WriteLine(page.Substring(index + 4)); // 输出包体 // 问题是当包体是图片的时候,该怎么处理呢???? // 我是这样考虑的:scoket接收的时候,已经将byte安装ASCII转换成string,这里将string转换为byte,然后存成文件。 // 问题是最后存成的文件用图片查看器打开以后是空的,什么都看不到。不过文件的大小是有的13k。 Byte[] byteArray = Encoding.ASCII.GetBytes(page.Substring(index + 4)); // page.Substring(index + 4)为包体内容 using (BinaryWriter binWriter = new BinaryWriter(File.Open("c:\\map.png", FileMode.Create))) { binWriter.Write(byteArray); } 问题: 为什么我保存的图片不能显示呢?既然通过IE就可以看到图片,就说明服务器端生成的内容是没有问题的。希望大家多给指点。
mjgforever的主页 mjgforever | 菜鸟二级 | 园豆:335
提问于:2008-02-25 22:06
< >
分享
所有回答(1)
0
把服务器端生成的数据保存为文件,把客户端接收到的数据也保存为文件,找个二进制编辑器(例如UltraEdit),同时打开两个文件,看看到底哪些地方不一样,能不能找到一些线索。
deerchao | 园豆:8367 (大侠五级) | 2008-04-05 21:33
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册