C# TCP传输文件示例代码
using System;
using System.Collections.Generic;
using System.Linq; using System.Text;
using System.Threading.Tasks; namespace CA.TCP
{
using System.Net;
using System.Net.Sockets;
using System.Threading;
using System.Configuration;
class Program
{
static void Main(string[] args)
{ var ttt = new byte[100]; Console.WriteLine("1.client");
Console.WriteLine("2.server");
var c = Console.ReadKey(); if (c.KeyChar == '1')
{
Client(); }
else
{
Server();
} Console.WriteLine("结束");
Console.ReadKey();
}
private static void Server()
{
var port = ConfigurationManager.AppSettings["localIPPoint"];
Console.WriteLine($"监听端口:" + port);
var end = new IPEndPoint(IPAddress.Parse("0.0.0.0"), int.Parse(port));
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
socket.Bind(end);
socket.Listen(10);
Console.WriteLine("服务器开始监听");
socket.Blocking = true; Thread thread = new Thread(AcceptInfo);
thread.IsBackground = true;
thread.Start(socket); while (true)
{
Thread.Sleep(200);
if (Console.KeyAvailable)
{
var k = Console.ReadKey();
if (k.Key == ConsoleKey.Enter)
{
Console.WriteLine("发送");
byte[] buffer = Encoding.Default.GetBytes(Console.ReadLine());
// client.Send(buffer);
if (dic.Any())
{
dic.FirstOrDefault().Value.Send(buffer);
}
}
}
} }
//记录通信用的Socket
static Dictionary<string, Socket> dic = new Dictionary<string, Socket>(); static void AcceptInfo(object o)
{
Socket socket = o as Socket;
while (true)
{
//通信用socket
try
{
Console.WriteLine("等待接收");
//创建通信用的Socket
Socket tSocket = socket.Accept();
Console.WriteLine("收到连接");
string point = tSocket.RemoteEndPoint.ToString();
//IPEndPoint endPoint = (IPEndPoint)client.RemoteEndPoint;
//string me = Dns.GetHostName();//得到本机名称
//MessageBox.Show(me);
Console.WriteLine(point + "连接成功!");
//Console.WriteLine(point);
dic.Add(point, tSocket);
//接收消息
Thread th = new Thread(ReceiveMsg);
th.IsBackground = true;
th.Start(tSocket);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
break;
}
}
} //接收消息
static void ReceiveMsg(object o)
{
Socket client = o as Socket;
while (true)
{
//接收客户端发送过来的数据
try
{
//定义byte数组存放从客户端接收过来的数据
byte[] buffer = new byte[1024 * 100];
//将接收过来的数据放到buffer中,并返回实际接受数据的长度
int n = client.Receive(buffer);
//将字节转换成字符串
string words = Encoding.Default.GetString(buffer, 0, n).Trim(); if (words.StartsWith("##101."))
{
Console.WriteLine("收到文件上传请求"); var path = AppDomain.CurrentDomain.BaseDirectory + words.Substring(words.IndexOf(".") + 1); if (System.IO.File.Exists(path) == false)
{
dic.FirstOrDefault().Value.Send(Encoding.Default.GetBytes("ok"));
Thread.Sleep(100);
dic.FirstOrDefault().Value.Send(Encoding.Default.GetBytes("ok"));
Console.WriteLine("已同意"); int size = 1024 * 1024; using (var fs = System.IO.File.Create(path))
{
int i = 1;
while (true)
{
var oneSendBuffer = new byte[size];
int length = client.Receive(oneSendBuffer); if (Encoding.Default.GetString(oneSendBuffer).Trim('\0') == "end")
{
break;
} fs.Write(oneSendBuffer, 0, length);
fs.Flush(); Console.WriteLine(i++);
} dic.FirstOrDefault().Value.Send(Encoding.Default.GetBytes("上传完成"));
Console.WriteLine("上传完成");
}
}
else
{
dic.FirstOrDefault().Value.Send(Encoding.Default.GetBytes("文件已存在"));
Console.WriteLine("文件已存在,拒绝上传");
}
}
Console.WriteLine(client.RemoteEndPoint.ToString() + ":" + words);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
break;
}
}
}
private static void Client()
{
Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); var ipStr = ConfigurationManager.AppSettings["targetIP"];
Console.WriteLine($"目标IP:{ipStr}");
IPAddress ip = IPAddress.Parse(ipStr); var port = ConfigurationManager.AppSettings["targetIPPoint"];
Console.WriteLine($"目标端口:{port}");
IPEndPoint endPoint = new IPEndPoint(ip, int.Parse(port)); try
{
while (client.Connected == false)
{
Thread.Sleep(200);
client.Connect(endPoint);
} byte[] tmp = new byte[1]; client.Blocking = false;
client.Send(tmp, 0, 0);
Console.WriteLine("Connected!"); Console.WriteLine("本地:" + client.LocalEndPoint.ToString());
Console.WriteLine("连接到:" + client.RemoteEndPoint.ToString());
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
} client.Blocking = true; bool autoReceiving = true; Thread th = new Thread((s) =>
{
while (true)
{
Thread.Sleep(500); if (!autoReceiving)
{
continue;
}
try
{
byte[] buff = new byte[1024 * 100];
int n = (s as Socket).Receive(buff); string str = Encoding.Default.GetString(buff).Trim('\0'); Console.WriteLine("回复:" + str);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
break;
} }
});
th.IsBackground = true;
th.Start(client); while (true)
{
Thread.Sleep(100);
if (Console.KeyAvailable)
{ var k = Console.ReadKey();
if (k.Key == ConsoleKey.Enter)
{
Console.WriteLine("发送");
var str = Console.ReadLine();
if (str.Contains(".") && System.IO.File.Exists(str))
{
var fs = new System.IO.FileInfo(str); Console.WriteLine("请求发送文件……");
Console.WriteLine($"文件大小:{(fs.Length / 1024.0 / 1024.0).ToString("f2")} MB"); //每次发送大小
int size = 1024 * 1024;
var oneSendBuffer = new byte[size]; Console.WriteLine($"每次发送大小{1}MB"); //需要发送多少次
int sendNum = fs.Length > size ? (int)Math.Ceiling(fs.Length / ((double)size)) : 1;
Console.WriteLine($"需要发送{sendNum}次");
Console.WriteLine(); //停止自动接收消息
autoReceiving = false; //发送文件请求指令
client.Send(Encoding.Default.GetBytes("##101." + System.IO.Path.GetFileName(str))); //获取回复
byte[] resultBuffer = new byte[1024];
client.Receive(resultBuffer);
var resultStr = Encoding.Default.GetString(resultBuffer).Trim('\0'); //同意发送
if (resultStr == "ok")
{
Console.WriteLine($"开始发送文件:{DateTime.Now.ToString("yyyy/MM/dd hh:mm:ss")}");
int offset = 0;
using (var stream = fs.OpenRead())
{
//stream.Seek(0, System.IO.SeekOrigin.Begin);
var top = Console.CursorTop + 1;
for (int i = 1; i <= sendNum; i++)
{ offset = stream.Read(oneSendBuffer, 0, oneSendBuffer.Length); if (offset < size)
{
var temp = new byte[offset];
for (int j = 0; j < offset; j++)
{
temp[j] = oneSendBuffer[j];
}
client.Send(temp);
}
else
{
client.Send(oneSendBuffer);
} Array.Clear(oneSendBuffer, 0, oneSendBuffer.Length); Console.SetCursorPosition(0, top);
Console.WriteLine($"{((float)i / sendNum * 100).ToString("f4")}%");
}
}
//避免粘包
Thread.Sleep(500);
client.Send(Encoding.Default.GetBytes("end"));
Console.WriteLine($"发送完成:{DateTime.Now.ToString("yyyy/MM/dd hh:mm:ss")}");
autoReceiving = true;
}
else
{
Console.WriteLine("被拒绝" + resultStr); }
autoReceiving = true;
}
else
{
byte[] buffer = Encoding.Default.GetBytes(str);
client.Send(buffer);
} }
}
}
}
}
}
C# TCP传输文件示例代码的更多相关文章
- jQuery中读取json文件示例代码
json文件是一种轻量级的数据交互格式.一般在jquery中使用getJSON()方法读取,具体示例代码如下,感兴趣的朋友可以参考下哈,希望可以帮助到你 json文件是一种轻量级的数据交互格式.一 ...
- IE下JS读取xml文件示例代码
JS读取xml文件具体步骤为:创建DOM对象.加载xml文件(仅适用于IE)附示例代码,感兴趣的朋友可以参考下,希望对大家有所帮助使用javascript脚本读取xml文件,这里暂只考虑IE浏览器st ...
- WCF使用net.tcp传输文件
摘要:今天看了一些官方的资料和配置,简单写了一个WCF服务来传递一个文件,借此看看WCF传输大文件的能力,这里采用的是NetTcp绑定,之所以没有采用 basicHttpBinding是因为考虑这种方 ...
- SkylineGlobe TEPro 6.6.1 二次开发导出KML或者KMZ文件示例代码
其实Skyline的fly文件跟kml文件很像很像,只不过一个是编码加密的,另一个早已经成为OGC的通用标准: 喜欢Skyline的小伙伴们试试下面的代码吧,细心的人能发现彩蛋哦. <!DOCT ...
- Qt PC 安卓 tcp传输文件
废话不多说,如题,上代码 qt PC端 头文件 //网络部分 #include <QTcpSocket> #include <QFile> #include <QFile ...
- Java实验五报告——TCP传输及加解密
一.实验内容 1.运行教材上TCP代码,结对进行,一人服务器,一人客户端: 2.利用加解密代码包,编译运行代码,一人加密,一人解密: 3.集成代码,一人加密后通过TCP发送: 注:加密使用AES或者D ...
- JAVA之旅(三十三)——TCP传输,互相(伤害)传输,复制文件,上传图片,多并发上传,多并发登录
JAVA之旅(三十三)--TCP传输,互相(伤害)传输,复制文件,上传图片,多并发上传,多并发登录 我们继续网络编程 一.TCP 说完UDP,我们就来说下我们应该重点掌握的TCP了 TCP传输 Soc ...
- 网络传输 buf 封装 示例代码
网络传输 buf 封装 示例代码 使用boost库 asio // BufferWrapTest.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h&quo ...
- java实现两台电脑间TCP协议文件传输
记录下之前所做的客户端向服务端发送文件的小项目,总结下学习到的一些方法与思路. 注:本文参考自<黑马程序员>视频. 首先明确需求,在同一局域网下的机器人A想给喜欢了很久的机器人B发送情书, ...
随机推荐
- 如何高效地把Spring boot学到能干活的程度
Spring boot要学什么?要学到什么程度?以及相关的学习方法是什么?这些很难量化,但极好形容:需要学到能帮你找到一份工作的程度. 任何脱离工作脱离实际的学习,都是没有意义的.比如程序员运行通 ...
- MeteoInfo-Java解析与绘图教程(七)_图层添加站点名称或区域名称
MeteoInfo-Java解析与绘图教程(七)_图层添加站点名称或区域名称 在上文说了用自动站的数据经过插值绘制色斑图,这种一般是在geoserver上叠加图片呈现,但遇到后端导出图片,我们又想添加 ...
- JavaScript 判断变量是否为空---三元运算,元组获取值-重组.map()。
var from_days = getQueryString('from_days'); undefined {'from_days': (from_days) ? from_days : null} ...
- mysql三种提交类型
mysql提交分显式提交.隐式提交及自动提交. (1) 显式提交用COMMIT命令直接完成的提交为显式提交.其格式为:SQL>COMMIT: (2) 隐式提交用SQL命令间接完成的提交为隐式提交 ...
- 【Android开发】找乐,一个笑话App的制作过程记录
缘起 想做一个笑话App的原因是因为在知乎上看过一个帖子,做Android可以有哪些数据可以练手,里面推荐了几个数据开放平台.在这些平台中无一不是有公共的笑话接口,当时心想这个可以拿来练手啊,还挺有意 ...
- 【LeetCode】263. Ugly Number 解题报告(Java & Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 除去2,3,5因子 日期 [LeetCode] 题目 ...
- git安装与使用,未完待续... ...
目录 一.git概念 二.git简史 三.git的安装 四.git结构 五.代码托管中心-本地库和远程库的交互方式 六.初始化本地仓库 七.git常用命令 1.add和commit命令 2.sta ...
- Codeforces 777C:Alyona and Spreadsheet(预处理)
During the lesson small girl Alyona works with one famous spreadsheet computer program and learns ho ...
- Chapter 20 Treatment-Confounder Feedback
目录 20.1 The elements of treatment-confounder feedback 20.2 The bias of traditional methods 20.3 Why ...
- WEB文档在线预览解决方案
web页面无法支持预览office文档,但是却可以预览PDF.flash文档,所以大多数解决方案都是在服务端将office文档转换为pdf,然后再通过js的pdf预览插件(谷歌浏览器等已经原生支持嵌入 ...