毛毛的小窝 — 关注技术交流、让我们一起成长

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

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

服务器端代码如下:(Java Servlet 实现)
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
 OutputStream out = response.getOutputStream();
        try {
                response.setContentType("image/png");
                ChartUtilities.writeChartAsPNG(out, chart, 400, 300);  // 将图片写入out中
                response.flushBuffer(); 
        }
        catch (Exception e) {
            System.err.println(e.toString());
        }
        finally {
            out.close();
        }
}


////////////////////////////////////////////////////////////////////////////////////
// 以下是客户端代码,通过socket取出TCP包,并解析
////////////////////////////////////////////////////////////////////////////////////
        string request = "GET /PDAChart/ChartServlet?Chart=PieChart HTTP/1.1\r\n" +  // 请求消息
                         "Host: " + server + ":" + port.ToString() + "\r\n" +  // 主机和端口
                         "Connection: Close\r\n" +   // 连接状态
                         "\r\n";
        Byte[] bytesSent = Encoding.ASCII.GetBytes(request);
        Byte[] bytesReceived = new Byte[256];

        // 创建Socket对象
        Socket s = ConnectSocket(server, port);

        if (s == null)
            return ("Connection failed");

// 向服务器发送请求
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就可以看到图片,就说明服务器端生成的内容是没有问题的。希望大家多给指点。

posted on   mjgforever  阅读(1617)  评论(0编辑  收藏  举报

编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· [AI/GPT/综述] AI Agent的设计模式综述
点击右上角即可分享
微信分享提示