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传输文件示例代码的更多相关文章

  1. jQuery中读取json文件示例代码

    json文件是一种轻量级的数据交互格式.一般在jquery中使用getJSON()方法读取,具体示例代码如下,感兴趣的朋友可以参考下哈,希望可以帮助到你   json文件是一种轻量级的数据交互格式.一 ...

  2. IE下JS读取xml文件示例代码

    JS读取xml文件具体步骤为:创建DOM对象.加载xml文件(仅适用于IE)附示例代码,感兴趣的朋友可以参考下,希望对大家有所帮助使用javascript脚本读取xml文件,这里暂只考虑IE浏览器st ...

  3. WCF使用net.tcp传输文件

    摘要:今天看了一些官方的资料和配置,简单写了一个WCF服务来传递一个文件,借此看看WCF传输大文件的能力,这里采用的是NetTcp绑定,之所以没有采用 basicHttpBinding是因为考虑这种方 ...

  4. SkylineGlobe TEPro 6.6.1 二次开发导出KML或者KMZ文件示例代码

    其实Skyline的fly文件跟kml文件很像很像,只不过一个是编码加密的,另一个早已经成为OGC的通用标准: 喜欢Skyline的小伙伴们试试下面的代码吧,细心的人能发现彩蛋哦. <!DOCT ...

  5. Qt PC 安卓 tcp传输文件

    废话不多说,如题,上代码 qt PC端 头文件 //网络部分 #include <QTcpSocket> #include <QFile> #include <QFile ...

  6. Java实验五报告——TCP传输及加解密

    一.实验内容 1.运行教材上TCP代码,结对进行,一人服务器,一人客户端: 2.利用加解密代码包,编译运行代码,一人加密,一人解密: 3.集成代码,一人加密后通过TCP发送: 注:加密使用AES或者D ...

  7. JAVA之旅(三十三)——TCP传输,互相(伤害)传输,复制文件,上传图片,多并发上传,多并发登录

    JAVA之旅(三十三)--TCP传输,互相(伤害)传输,复制文件,上传图片,多并发上传,多并发登录 我们继续网络编程 一.TCP 说完UDP,我们就来说下我们应该重点掌握的TCP了 TCP传输 Soc ...

  8. 网络传输 buf 封装 示例代码

    网络传输 buf 封装 示例代码 使用boost库 asio // BufferWrapTest.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h&quo ...

  9. java实现两台电脑间TCP协议文件传输

    记录下之前所做的客户端向服务端发送文件的小项目,总结下学习到的一些方法与思路. 注:本文参考自<黑马程序员>视频. 首先明确需求,在同一局域网下的机器人A想给喜欢了很久的机器人B发送情书, ...

随机推荐

  1. 又拿奖了!腾讯云原生数据库TDSQL-C斩获2021PostgreSQL中国最佳数据库产品奖

    日前,开源技术盛会PostgresConf.CN & PGconf.Asia2021大会(简称2021 PG亚洲大会)在线上隆重召开,腾讯云作为业内领先的云数据库服务商受邀出席,多位专家深入数 ...

  2. CF1003C Intense Heat 题解

    Content 给定一个长度为 \(n\) 的数列,求数列中所有长度 \(\geqslant k\) 的区间的最大平均值. 数据范围:\(1\leqslant k,n,a_i\leqslant 500 ...

  3. java web 404错误页面配置

    java web 404错误页面配置:注意红框的地方,在工程的web.xml文件里的最开头加入如下的内容便可,但是也有问题,针对以.action后缀名和.jsp后缀名不起作用, 因为后面配置了一些拦截 ...

  4. python requests库的简单运用

    python requests的简单运用 使用pycharm获取requests包 ctrl+alt+s Project:pythonProject pythoninterpreter 点+号搜索 使 ...

  5. MindSpore联邦学习框架解决行业级难题

    内容来源:华为开发者大会2021 HMS Core 6 AI技术论坛,主题演讲<MindSpore联邦学习框架解决隐私合规下的数据孤岛问题>. 演讲嘉宾:华为MindSpore联邦学习工程 ...

  6. JAVA调用微信接口实现页面分享功能(分享到朋友圈显示图片,分享给朋友)

    钉钉提供的内网穿透之HTTP穿透:https://www.cnblogs.com/pxblog/p/13862376.html 网页分享到微信中如何显示标题图,如果自定义标题图,描述,显示效果如下 官 ...

  7. c++代码编译错误查找方法之宏

    1.关于 本文演示环境: win10+vs2017 好久不用这法子了,都快忘了 排查错误,思路很重要,且一定要思路清晰(由于自己思路不清晰,查找错误耽误了不少时间,其实问题很简单,只是你要找到他需要不 ...

  8. Saving Beans(hud3037)

    Saving Beans Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tota ...

  9. How many integers can you find(hdu1796)

    How many integers can you find Time Limit: 12000/5000 MS (Java/Others)    Memory Limit: 65536/32768 ...

  10. Chapter 1 A Definition of Causal Effect

    目录 1.1 Individual casual effects 1.2 Average casual effects 1.5 Causation versus association Hern\(\ ...