客户端程序通过TCP通信传送"小文件"到服务器
客户端程序通过TCP通信传送"小文件"到服务器
源码 (不包含通信框架源码,通信框架源码请另行下载)
上一篇文章写了如何通过TCP通信发送图片到客户端,有朋友问如何传送文件,本文将就如何发送文件进行探讨。
对于比较小的文件,可以把文件转化成字节形式,用契约类包装一下,服务器收到后,再把字节转化成文件即可,这也是本文中实现的方式,这种方式的优点是比较简单灵活,缺点是不适合大文件的发送,也不能显示文件发送的进度。
基于TCP的通信机制,对于比较大的文件,这种方式是不可行的,大文件采用分段发送再合成的方式比较好,以后有时间再对如何发送大文件单独探讨。
本程序基于开源的networkComms2.3.1通信框架

我们先开看一下实现的效果
服务器端:

客户端:


在服务器端,我们把收到的图片保存在D盘根目录下(您可以另外指定路径),打开D盘看到收到的图片如下:

下面看一下具体的过程
第一步,首先进行服务器端的设置
(1)监听端口:

//服务器开始监听客户端的请求
//开始监听某T端口
IPEndPoint thePoint = new IPEndPoint(IPAddress.Parse(txtIP.Text), int.Parse(txtPort.Text));
TCPConnection.StartListening(thePoint, false);
button1.Text = "监听中";
button1.Enabled = false; //此方法中包含服务器具体的处理方法。
StartListening();

(2) 针对文件上传写对应的处理方法:
NetworkComms.AppendGlobalIncomingPacketHandler<FileWrapper>("UploadFile", IncomingUploadFile);

//处理客户端发来的文件
private void IncomingUploadFile(PacketHeader header, Connection connection, FileWrapper wrapper)
{
try
{ writeFile(wrapper._fileData, @"D:\" + wrapper.FileName); ResMsgContract contract = new ResMsgContract();
contract.Message = "上传成功";
//发送回复信息给客户端
connection.SendObject("ResUploadFile", contract); }
catch (Exception ex)
{ }
}

|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
<span style="color: #008000;"> //此方法来自博客园</span> private bool writeFile(byte[] pReadByte, string fileName) { FileStream pFileStream = null; try { pFileStream = new FileStream(fileName, FileMode.OpenOrCreate); pFileStream.Write(pReadByte, 0, pReadByte.Length); } catch { return false; } finally { if (pFileStream != null) pFileStream.Close(); } return true; } |
第二步:客户端的设置
(1)连接服务器:

//给连接信息对象赋值
connInfo = new ConnectionInfo(txtIP.Text, int.Parse(txtPort.Text)); //如果不成功,会弹出异常信息
newTcpConnection = TCPConnection.GetConnection(connInfo); TCPConnection.StartListening(connInfo.LocalEndPoint); button1.Enabled = false;
button1.Text = "连接成功";

(2)从本地选择文件并上传:

private void button3_Click(object sender, EventArgs e)
{
openFileDialog2.Filter = "所有文件|*.*"; if (openFileDialog2.ShowDialog() == DialogResult.OK)
{ string shortFileName = System.IO.Path.GetFileName(openFileDialog2.FileName); FileWrapper fileWrapper = new FileWrapper(shortFileName, ReadFile(openFileDialog2.FileName)); //发送图片包装类到服务器,并获取返回信息
ResMsgContract resMessage = newTcpConnection.SendReceiveObject<ResMsgContract>("UploadFile", "ResUploadFile", 8000, fileWrapper); if (resMessage.Message == "上传成功")
{
MessageBox.Show("文件已经上传到服务器");
}
else
{
MessageBox.Show("文件没有发送成功");
} } }

(三)关于FileWrapper类
在客户端与服务器端通信的过程中,我们注意到上面的程序中使用了一个FileWrapper类,用来传递文件对象。
FileWrapper类,存放在MessageContract类库中,此类用来保存文件转化后的二级制数据

using System;
using System.Collections.Generic;
using System.Text;
using ProtoBuf;
using System.Drawing;
using System.IO;
using ProtoBuf; namespace MessageContract
{
[ProtoContract]
public class FileWrapper
{
/// <summary>
/// 把Image对象存储为私有的字节数组
/// </summary>
[ProtoMember(1)]
public byte[] _fileData; /// <summary>
/// 图片名称
/// </summary>
[ProtoMember(2)]
public string FileName { get; set; } /// <summary>
/// 私有的无参数构造函数 反序列化时需要使用
/// </summary>
private FileWrapper() { } /// <summary>
/// 创建一个新的 ImageWrapper类
/// </summary>
/// <param name="imageName"></param>
/// <param name="image"></param>
public FileWrapper(string fileName, byte[] file)
{
this.FileName = fileName;
this._fileData = file;
} }
}

工作到此完成,很少的代码量,就帮我们实现了传递客户端文件保存在服务器的功能。
注意:此种方式并不适合传递比较大的文件,如果文件比较大,最好以分段传送文件的形式发送.
客户端程序通过TCP通信传送"小文件"到服务器的更多相关文章
- JAVASE02-Unit011: TCP通信(小程序)
TCP通信(小程序) server端: package chat; import java.io.BufferedReader; import java.io.IOException; import ...
- c++下基于windows socket的单线程服务器客户端程序(基于TCP协议)
今天自己编写了一个简单的c++服务器客户端程序,注释较详细,在此做个笔记. windows下socket编程的主要流程可概括如下:初始化ws2_32.dll动态库-->创建套接字-->绑定 ...
- QT 简单 TCP 通信,发送数据到服务器
1.首先 添加头文件 #include <QtNetwork/QTcpSocket> 并且 在 xxx.pro(xxx指工程的名称) 中QT += core gui下面,添加 下面两句句话 ...
- [C语言]一个很实用的服务端和客户端进行TCP通信的实例
本文给出一个很实用的服务端和客户端进行TCP通信的小例子.具体实现上非常简单,只是平时编写类似程序,具体步骤经常忘记,还要总是查,暂且将其记下来,方便以后参考. (1)客户端程序,编写一个文件clie ...
- 【学习笔记】TCP通信的细节及TCP连接对HTTP事务处理性能影响
从三次握手的细节说起 刚开始尝试使用java等后端语言写IO流,或用套接字(socket)实现简单C/S通信的同学们,常常会接触到的一个概念:就是所谓的"三次握手",socket作 ...
- 【计算机网络】TCP通信的细节及TCP连接对HTTP事务处理性能影响
从三次握手的细节说起 刚开始尝试使用java等后端语言写IO流,或用套接字(socket)实现简单C/S通信的同学们,常常会接触到的一个概念:就是所谓的“三次握手”,socket作为一个API接口,封 ...
- TCP通信 - 服务器开启多线程与read()导致服务器阻塞问题
TCP通信的文件上传案例 本地流:客户端和服务器和本地硬盘进行读写,需要使用自己创建的字节流 网络流:客户端和服务器之间读写,必须使用Socket中提供的字节流对象 客户端工作:读取本地文件,上传到服 ...
- Hadoop处理大量小文件的问题和解决方法
小文件指的是那些size比HDFS的block size(默认64M)小的多的文件.如果在HDFS中存储小文件,那么在HDFS中肯定会含有许许多多这样的小文件(不然就不会用hadoop了).而HDFS ...
- 如何利用Hadoop存储小文件
**************************************************************************************************** ...
随机推荐
- Java线(一个):线程安全的和不安全
当我们看JDK API什么时候,总是找一些类描述说:,线程安全或线程安全,例如StringBuilder在,么一句,"将StringBuilder 的实例用于多个线程是不安全的.假设须要这种 ...
- Android 无法Bind Service
今天帮同学看一个bindService的样例,说是无法bind service(他接触android时间不长),那代码是从网上找的一个样例,结果看了半天,才终于找到问题所在了),这个问题真是令人挺无语 ...
- HDU 4896 Minimal Spanning Tree(矩阵高速功率)
意甲冠军: 给你一幅这样子生成的图,求最小生成树的边权和. 思路:对于i >= 6的点连回去的5条边,打表知907^53 mod 2333333 = 1,所以x的循环节长度为54,所以9个点为一 ...
- 简单实现Android平台多语言
这里,我们认识到两种语言.中国简体和繁体中国. 在res文件建议两个文件夹 values-zh-rCN values-zh-rTW 两个目录下都有一个strings.xml文件. 两个同名文件的字符串 ...
- Windows编译Nodejs时遇到 File "configure", line 313 SyntaxError: invalid syntax Failed to create vc project files. 时的解决方法
第一次编译的时候电脑上未安装python,遂下载了python最新版本3.3.3,但是报了下面这个错误. 把python降到2.7.*的版本即可. 我这里测试2.7.6和2.7.3版本可以正常编译.
- Install shipyard
2台机器,192.168.1.153,192.168.1.154 安装Shipyard 1. 154作为集群主节点,在154机器上执行命令 curl -sSL https://shipyard-pro ...
- asp.net学习之ado.net(无连接模式中的DataAdapter)
原文:asp.net学习之ado.net(无连接模式中的DataAdapter) 在非连接模式下,主要讨论以下对象:DataAdapter. DataAdpater的作用是在物理存储模式的数据 ...
- Eclipse扩展安装插件方式
Eclipse安装插件经常使用的是直接安装的方式,就是将插件中包含的plugins和features文件夹中的内容直接复制到了Eclipse的plugins和features文件夹内,这样很容易导致插 ...
- 我也来谈javascript高级编程之:javascript函数编译过程
前言 题目有点大,其实也就是手痒...跟大家来扯一下javascript编译过程. 那么到底什么是“编译”呢 这个...本人文笔太差,我还是直接举例子吧. 相信玩过js童鞋应该都看过下面这样一个面试题 ...
- polay定理总结
参考资料:url=YveSCnlx_dlXo4oGjE8w3_2QRObRXvXMbix81ppCxBGqBswxffwDN9frzY5xxaKf7GgEMY8K93JTPEhkBzY66XOaN0G ...