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发送情书, ...
随机推荐
- Linux 输入指令显示 command not found(未找到命令)解决办法
问题摘要:当我在linux中安装了一个Nginx,最后需要检查是否安装成功的时候,输入了Nginx -v 提示未找到命令(服务器中英文提示为 command not found) 其他软件命令未找到问 ...
- linux查看磁盘SN
ls -l /dev/disk/by-id/ | grep -iE <SN>
- Shell之Sed常用用法
匹配某字符串开头的行,整行替换 文本原内容 目的: SELINUX= 整行替换为SELINUX=disabled # grep -Ev '^$|^#' /etc/selinux/config SELI ...
- tcp十种状态;关于tcp中time_wait状态(2MSL问题)
tcp十种状态 注意: 当一端收到一个FIN,内核让read返回0来通知应用层另一端已经终止了向本端的数据传送 发送FIN通常是应用层对socket进行关闭的结果 关于tcp中time_wait状态的 ...
- 将本地的react项目代码打包到服务器
打包过程 连接服务器 ssh root@xx.xx.xx.xx(服务器IP) 定位到当前项目目录 cd /path/projectName 更新代码到服务器 git pull 执行打包命令(这里我创建 ...
- 【LeetCode】575. Distribute Candies 解题报告(Java & Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 Java解法 Python解法 日期 题目地址:ht ...
- anaconda 如何更换镜像源
今天需要对anaconda更换其镜像源. 故而做一个小记: 一 查看anaconda的本源方法 电脑路径:C:\Users\14269,找到 .condarc 文件. 打开.condarc文件,可看 ...
- <学习opencv>opencv函数
/*=========================================================================*/ // openCV中的函数 /*====== ...
- maven打包报错 Fatal error compiling: tools.jar not found: C:\Program Files\Java\jre1.8.0_151\..\lib\tool
maven 打包报错 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:2.5.1:comp ...
- C#中的值传递与引用传递(in、out、ref)
在C#中,方法.构造函数可以拥有参数,当调用方法或者构造函数时,需要提供参数,而参数的传递方式有两种(以方法为例): 值传递 值类型对象传递给方法时,传递的是值类型对象的副本而不是值类型对象本身.常用 ...