服务器端代码如下:(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就可以看到图片,就说明服务器端生成的内容是没有问题的。希望大家多给指点。

转载于:https://www.cnblogs.com/mjgforever/archive/2008/02/26/1082038.html

利用 socket 获取 tcp 包并解析的问题。相关推荐

  1. 利用socket raw抓包

    RAW SOCKET能够对较低层次的协议直接访问,网络监听技术很大程度上依赖于它.该文介绍了利用RAW SOCKET捕获网络底层数据包的步骤和方法 [原理]网卡对数据帧进行硬过滤(根据网卡的模式不同采 ...

  2. Socket通用TCP通信协议设计及实现(防止粘包,可移植,可靠)

    Socket通用TCP通信协议设计及实现(防止粘包,可移植,可靠) 引文 我们接收Socket字节流数据一般都会定义一个数据包协议.我们每次开发一个软件的通信模块时,尽管具体的数据内容是不尽相同的,但 ...

  3. java socket编程心跳_Java Socket编程心跳包创建实例解析

    1.什么是心跳包? 心跳包就是在客户端和服务器间定时通知对方自己状态的一个自己定义的命令字,按照一定的时间间隔发送,类似于心跳,所以叫做心跳包. 用来判断对方(设备,进程或其它网元)是否正常运行,采用 ...

  4. python串口数据分包_python TCP Socket的粘包和分包的处理详解

    概述 在进行TCP Socket开发时,都需要处理数据包粘包和分包的情况.本文详细讲解解决该问题的步骤.使用的语言是Python.实际上解决该问题很简单,在应用层下,定义一个协议:消息头部+消息长度+ ...

  5. 利用百度APIStoreSDK获取Json数据并解析加载到ListView上

    效果图(这里只是截取了List中的一项): 一.:登录百度ApiStore,获取移动sdk Android版(同时有使用文档和示例),将jar包导入到项目中 Android Studio请在放入lib ...

  6. socket编程 TCP 粘包和半包 的问题及解决办法

    socket编程 TCP 粘包和半包 的问题及解决办法 参考文章: (1)socket编程 TCP 粘包和半包 的问题及解决办法 (2)https://www.cnblogs.com/panchang ...

  7. udp协议没有粘包问题、基于socketserver实现并发的socket(基于tcp、udp协议)、基于udp协议的套接字、操作系统原理以及进程知识

    基于udp协议的套接字通信服务端 from socket import *server=socket(AF_INET,SOCK_DGRAM) #数据报协议->udp server.bind((' ...

  8. TCP:利用Socket编程技术实现客户端向服务端上传一个图片。

    问题: 利用Socket编程技术实现客户端向服务端上传一个图片的程序. 客户端: import java.io.*; import java.net.Socket;public class clien ...

  9. java 中的网络编程(Socket、TCP三次握手四次挥手、TCP/UDP/URL)

    文章目录 前言 一.网络编程概述 二.网络通信要素概述 1.如何实现网络中的主机互相通信 2.网络通信协议 3.IP和端口号 4.InetAddress类 5.网络协议 6.TCP/IP协议簇 7.T ...

最新文章

  1. Logback 配置文件这么写,TPS 提高 10 倍!
  2. jQuery和MooTools的真正区别
  3. java 快速读文件_java快速读取文件
  4. ArcCatalog中将SQLServer中的空间数据导入到Oracle库中
  5. Windows中使用包管理器(类似于apt/yum的) - Chocolatey
  6. cmd cd 无法切换目录_如何获取用户主目录?os/user 就可以了,为什么要 gohomedir...
  7. 微博java版_新浪微博JAVA通用版
  8. 软考高级,信息系统项目管理师(高项)经验分享
  9. html自动选择省市,jQuery中国省市区地址三级联动插件Distpicker
  10. 浅析ERP系统--研发
  11. OpenCV笔记_20(1)基于dlib进行人脸识别( 图片检测 )
  12. Devops 05 Jenkins
  13. 《2016-2017年全球竞争力报告》述评
  14. bigquery json处理函数json_extract和json_extract_scalar的区别
  15. 海湾crt显示与服务器连接断开,secureCRT自动断开的解决方法
  16. CPU 进化论:复杂指令集 CISC
  17. tcp 与udp 的区别
  18. tif文件转为shp文件_ArcGIS栅格数据与矢量数据的转换
  19. UML软件工程--类图
  20. Redis(学习笔记)

热门文章

  1. Go语言的错误异常处理机制及其应用
  2. 后端怎么防止重复提交?(常用的做法)
  3. mybatis ResultMap
  4. AI框架精要:设计思想
  5. 深度学习框架集成平台C++ Guide指南
  6. 2021年大数据Spark(三十五):SparkStreaming数据抽象 DStream
  7. MySql数据库Update批量更新与批量更新多条记录的不同值实现方法
  8. Django Response对象3.4
  9. 【hexo】搭建个人bolg日志 day1
  10. (14)某工业生产部门根据国家计划的安排, 拟将某种高效率的5台机器,分配给所属的3个工厂A,B,C,各工厂在获得这种机器后,可以为国家盈利的情况如表4-10所示。