如何通过Socket TCP发送并接收一个文件?
一.小结
1.大包发小包收,只发一次。
2.发时把文件扩展名,文件长度也随同一起发送,方便接收端接收时另存为正确的文件类型,并判断是否已经接收完毕。
如果不一起发送,分为文件扩展名,文件长度,文件内容,发送三次,在接收端,也可能会一起收到,反而不利于解析。
二.客户发送端代码
private void btnSend_Click(object sender, EventArgs e)
{
//组合出远程终结点
IPAddress ipAddress = IPAddress.Parse(this.txtIP3.Text);
IPEndPoint hostEP = new IPEndPoint(ipAddress, Convert.ToInt32(this.txtPort3.Text));
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
try
{
socket.Connect(hostEP); //1.发送用户协议
string path1 = Environment.CurrentDirectory; //获取应用程序的当前工作目录。
string doc = "YourSendFile.pdf";
string path = Path.Combine(path1, doc);
FileStream fs = File.Open(path, FileMode.Open); //文件内容
byte[] bdata = new byte[fs.Length];
fs.Read(bdata, , bdata.Length);
fs.Close(); //文件扩展名,固定3字节
byte[] fileExtArray = Encoding.UTF8.GetBytes(string.Format("{0:D3}", currentDocExt)); //文件长度, 固定为20字节,前面会自动补零
byte[] fileLengthArray = Encoding.UTF8.GetBytes(bdata.Length.ToString("D20")); //合并byte数组
byte[] fileArray = CombomBinaryArray(fileExtArray, fileLengthArray); //合并byte数组
byte[] bdata1 = CombomBinaryArray(fileArray, bdata); //发文件长度+文件内容
socket.Send(bdata1, bdata1.Length, ); //2.接收
//声明接收返回内容的字符串
string recvStr = ""; //声明字节数组,一次接收数据的长度为 1024 字节
byte[] recvBytes = new byte[]; //返回实际接收内容的字节数
int bytes = ; //循环读取,直到接收完所有数据
while (true)
{
bytes = socket.Receive(recvBytes, recvBytes.Length, );
//读取完成后退出循环
if (bytes <= ) break; //将读取的字节数转换为字符串
recvStr += Encoding.UTF8.GetString(recvBytes, , bytes);
} //禁用 Socket
socket.Shutdown(SocketShutdown.Both); //关闭 Socket
socket.Close(); //... do some busness logic ... }
catch (Exception e1)
{
throw e1;
}
}
三.服务接收端代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.Sockets;
using System.Net;
using System.Xml;
using System.Configuration;
using System.Windows.Forms;
using System.IO; namespace ConsoleAppServer
{
class Program
{
[STAThread]
static void Main(string[] args)
{ bool Done = false;
IPAddress ipAddress = IPAddress.Parse(ConfigurationSettings.AppSettings["IP"].ToString());
IPEndPoint hostEP = new IPEndPoint(ipAddress, Convert.ToInt32(ConfigurationSettings.AppSettings["Port"]));
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
socket.Bind(hostEP);
socket.Listen();
while (!Done)
{
Console.WriteLine("waiting for client"); Socket client = socket.Accept(); Console.WriteLine("connected client"); //1.接收
//声明字节数组,一次接收数据的长度为 1024 字节
byte[] recvBytes = new byte[];
//返回实际接收内容的字节数
int bytes = ; int FileLength = ; // 900866;
int ReceivedLength = ; //1.0 接收文件扩展名
bytes = client.Receive(recvBytes, , );
string fileExt = Encoding.UTF8.GetString(recvBytes, , bytes); string vFilePath = Environment.CurrentDirectory;
string vFileName = vFilePath + "\\Tmp" + Guid.NewGuid().ToString() + "." + fileExt; //创建文件流,然后让文件流来根据路径创建一个文件
FileStream fs = new FileStream(vFileName, FileMode.Create); //1.1 接收文件长度
bytes = client.Receive(recvBytes, , );
//将读取的字节数转换为字符串
string fileLength = Encoding.UTF8.GetString(recvBytes, , bytes);
FileLength = Convert.ToInt32(fileLength); //1.2接收文件内容
while (ReceivedLength < FileLength)
{
bytes = client.Receive(recvBytes, recvBytes.Length, );
ReceivedLength += bytes;
fs.Write(recvBytes, , bytes);
} fs.Flush();
fs.Close(); //... do some business logic ...
string returnData = SomeBusinessLogic(); //2.发送
byte[] bdata = Encoding.UTF8.GetBytes(returnData);
client.Send(bdata, bdata.Length, ); client.Close();
} socket.Shutdown(SocketShutdown.Both);
socket.Close();
} }
}
如何通过Socket TCP发送并接收一个文件?的更多相关文章
- php发送 与接收流文件
PHP 发送与接收流文件 sendStreamFile.php 把文件以流的形式发送 receiveStreamFile.php 接收流文件并保存到本地 sendStreamFile.php < ...
- 代码实现:从键盘输入接收一个文件夹路径,打印出该文件夹下所有的.java文件名
package com.loaderman.test; import java.io.File; import java.io.FileReader; import java.util.Scanner ...
- Linux C Socket编程发送结构体、文件详解及实例
利用Socket发送文件.结构体.数字等,是在Socket编程中经常需要用到的.由于Socket只能发送字符串,所以可以使用发送字符串的方式发送文件.结构体.数字等等. 本文:http://www.c ...
- C# Socket TCP发送图片与接收图片
如果需要查看更多文章,请微信搜索公众号 csharp编程大全,需要进C#交流群群请加微信z438679770,备注进群, 我邀请你进群! ! ! --------------------------- ...
- Java TCP发送与接收
IP地址?端口号?主机名? 什么是Socket? 什么是UDP? 什么是TCP? UDP和TCP区别? 以上问题请自行百度,有标准解释,此处不再赘述,直接上干货! 实例: 发送端: public cl ...
- socket tcp使用recv接收数据时,返回errno错误代码88
原因:就是recv函数的第一个参数不是可用的,也就是第一个参数不是建立连接时返回的文件描述符. 解决方法:xxx
- PHP 发送与接收流文件
http://blog.csdn.net/fdipzone/article/details/40098169
- [Socket网络编程]由于套接字没有连接并且(当使用一个 sendto 调用发送数据报套接字时)没有提供地址,发送或接收数据的请求没有被接受。
原文地址:http://blog.sina.com.cn/s/blog_70bf579801017ylu.html,记录在此方便查看 解决办法: MSDN的说明: Close 方法可关闭远程主机连接, ...
- socket 错误之:OSError: [WinError 10057] 由于套接字没有连接并且(当使用一个 sendto 调用发送数据报套接字时)没有提供地址,发送或接收数据的请求没有被接受。
出错的代码 #server端 import socket import struct sk=socket.socket() sk.bind(('127.0.0.1',8080)) sk.listen( ...
随机推荐
- linq 多条件查询
Linq 进行多条件查询的时候使用PredicateBuilder帮助类可以很好的解决. 类的源码: public static class PredicateBuilder { /// <su ...
- 关于MySql数据库设计表与查询耗时分析
本地建一张表persons,使用脚本插入了1000万条数据 下面比较几种查询方法的耗时(查询9000000到9000005这中间5条数据) 查询结果: 1: SELECT * FROM test.pe ...
- iOS多线程编程之NSThread的使用(转)
本文由http://blog.csdn.net/totogo2010/原创 1.简介: 1.1 iOS有三种多线程编程的技术,分别是: 1..NSThread 2.Cocoa NSOperation ...
- Jquery DOM元素的方法
jQuery DOM 元素方法 函数 描述 .get() 获得由选择器指定的 DOM 元素. .index() 返回指定元素相对于其他指定元素的 index 位置. .size() 返回被 jQuer ...
- Python批量修改文件名
处理语料库时,有些文件名字很不规则,为了方便处理,同义按数字顺序修改名称,主要是用到os模块: import os def RenameFiles(srcdir): #将目录下所有的文件命名为数字开头 ...
- JSP标准标签库(JSTL)之核心标签(上)
在myeclipse中新建web项目时,会自动为我们安装JSTL库,如下图: 核心标签是我们最常用的JSTL标签.在JSP页面中引用核心标签库的语法如下: <%@ taglib uri=&quo ...
- Replication--复制延迟的诊断和解决
要解决复制延迟问题,需要首先定位复制延迟发生点,再找出复制延迟的原因,再做相应处理. 复制延迟发生点:1. 发布服务器2. 分发服务器3. 订阅服务器4. 发布服务器与分发服务器和分发服务器与订阅服务 ...
- SQLSERVER复制优化之一《改变包大小》
SQLSERVER复制优化之一<改变包大小> 自从搭了复制之后以为可以安枕无忧了,谁不知问题接踵而来 这次遇到的问题是丢包,不知道情况的读者可以先看一下我之前写的一篇<SQLSERV ...
- django rest_framework--入门教程3
rest_framwork 之post 与put rest_framwork可以接受post与put delete get请求,可以对资源进行刚CRUD,以一个DEMO为例, 1.先在VIEW里定义一 ...
- 理解 Soap
http://www.cnblogs.com/yhuang/archive/2012/04/04/share_storm.html 自己也写了下: using System; using System ...