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发送情书, ...
随机推荐
- 选课系统V1.0
tree . . ├── bin │ ├── __init__.py │ └── start.py #启动文件 ├── conf │ ├── __init__.py │ └── set ...
- Vue总结第五天:vue-router (使用模块化(创建Vue组件)机制编程)、router-link 标签的属性、路由代码跳转、懒加载、路由嵌套(子路由)、路由传递数据、导航守卫)
Vue总结第五天:vue-router ✿ 路由(器)目录: □ vue中路由作用 □ vue-router基本使用 □ vue-router嵌套路由 □ vue-router参数传递 □ ...
- cmake全面教程
1. 官网教程 2. 中文教程 3. Modern CMake
- 【LeetCode】1408. 数组中的字符串匹配 String Matching in an Array
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 暴力遍历 日期 题目地址:https://leetco ...
- 【LeetCode】791. Custom Sort String 解题报告(Python & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 按顺序构造字符串 排序 日期 题目地址:https: ...
- Codeforces 849A:Odds and Ends(思维)
A. Odds and Ends Where do odds begin, and where do they end? Where does hope emerge, and will they e ...
- Java练习小题_求一个3*3矩阵对角线元素之和,矩阵的数据用行的形式输入到计算机中 程序分析:利用双重for循环控制输入二维数组,再将a[i][i]累加后输出。
要求说明: 题目:求一个3*3矩阵对角线元素之和,矩阵的数据用行的形式输入到计算机中 程序分析:利用双重for循环控制输入二维数组,再将 a[i][i] 累加后输出. 实现思路: [二维数组]相关知识 ...
- javascript实现base64格式转码与解码
最近碰到一个需求,后端返回base64格式的数据,前端需要进行base64格式解码,好了,前端采用内部提供的atob函数进行解码,开完成,交付测试,然后测试小哥哥小姐姐反馈说中文乱码! 然后查了一下, ...
- 记一次log4j2引发的渗透测试
前言 记一次log4j2打入内网并用CVE-2021-42287.CVE-2021-42278获取到DC权限的靶场渗透. 外网打点 首先对web进行端口扫描,发现38080端口和22端口 访问一下38 ...
- Laravel Redis分布式锁实现源码分析
首先是锁的抽象类,定义了继承的类必须实现加锁.释放锁.返回锁拥有者的方法. namespace Illuminate\Cache; abstract class Lock implements Loc ...