C# 使用Socket开发聊天及高速文件传输程序【无需服务器端】(和遇到的各种坑)值得一看

本文主要是介绍C# 使用Socket开发聊天及高速文件传输程序【无需服务器端】(和遇到的各种坑)值得一看,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

肝了好久。。终于写好了ConSocket。。哈哈哈哈哈哈哈哈哈。。。速度还令人满意
demo下载
速度还可以的,本机测试,均速是28s/GB,
速度是Windows文件管理器的68%!!!!!
内网传输1GB–102s
外网1GB速度是QQ的20%
(忍不住)

就是界面不太友好。。

其中的文件传输组件,聊天组件都是分离的,可用于Winform程序,形式为dll

不多说了,先码为敬–Github.ConSocket–

/
/
/
/
/
/
/

以下各种坑(持续更新)

  1. Console.IO chat过程中input一半对方发送了消息解决方案
  2. 在文件传输时防止chat组件抢包
  3. 加了state包还是给抢了???
  4. 传输后的文件偏小?偏大?打不开?
  5. 一个神一样的大坑 - FileStream.Write()没有写入?【未解决】
  6. Android sdk avd到底**放在哪里??????

Console.IO chat过程中input一半对方发送了消息解决方案

public class stringclass
{private  string inputstr=String.Empty;public string set(string str){lock(this){if(str==@"@#"){return inputstr;}inputstr=str;return inputstr;}}
}

这样就可以在收到消息时打断输入,先显示消息,再继续输入

在文件传输时防止chat组件抢包

可以搞个封装类储存当前状态

public class statesaver{///<summary>/// arg:9--is used to get value-----arg 0:can't socket-----arg 1:can socket/// ///</summary>private int state=1;public int set(int arg){lock(this){if(arg==9){return state;}state=arg;return state;}}}

然后只初始化一个statesave,并以参数传入所有组件
组件操作前都要查询state

加了statesaver 。 包还是给抢了???

经过分析,在查询的时候state还是为1,可是receive时为0(好尬)
我也没有办法,只好传两个确认包呗。。。

Thread.Sleep(socketfreq);while(stdsav.set(9)==0){Thread.Sleep(200);}try{if(stdsav.set(9)==1){//---------------------------------------------------------------------------------------问题等待解决:此receive抢包问题:进去时还是1,抢包时是0//---------------------------------------------------------------------------------------目前代替方案:$%$recv/accpet包将会发送两次,//----------------------------------------------------------------------------------------------------下18行左右有内码包过滤代码,如解决,需删除n = socket.Receive(buffer);//			Console.WriteLine("-----Received    with code "+stdsav.set(9).ToString());}}catch(Exception){Writered("\n\nConnection Failed");while(true){}working=0;}

传输后的文件偏小?偏大?打不开?

传说中的丢包,粘包。。。。在TCP文件传输时影响不大
只要先交接一下文件信息

namestr=filename+@"@#@"+filelength.ToString()+@"@#@";//--------------------sndfmatnamebuf = Encoding.UTF8.GetBytes(namestr);socket.Send(namebuf,namebuf.Length,SocketFlags.None);Console.WriteLine("");Console.Write("等待对方确认 ");Thread wat=new Thread(waitingth);wat.Start();try{leng= socket.Receive(recvbuf);}catch(Exception){wat.Abort();Writered("\n\nConnection Failed\n\n");while(true){}}wat.Abort();

就行了。。。
然后在文件传输时尽量用流水模式(毕竟tcp是流传输,这个特性不能浪费了)
只要这样就好`

while(sendseek<filelength)

就可以避免几乎所有偏小偏大打不开问题了

接下来是一个神一样的大坑

我都蒙蔽了,
测试截图
debuginfo最后一项是最后一个包的大小,
可以看到文件传输前后正好差了最后一个包。。。!!!!!!!!!!!!!!!!!
经过排查竟然是最后一次FileStream.Write没有写入

fs.Write(buffer,0,paklen);

循环了几万遍,都没出问题,竟然在最后一次出问题。。。。
于是就搞了个下下之策

fs.Close();
FileStream addon=File.OpenWrite(pathstr+namestack[0]);
addon.Write(buffer,0,paklen);
addon.Close();

只能再写入一遍了。。。
有大佬能给下解释吗???????????

Androidsdk在哪里??

打算开发android版。所以下了xamarin for vs。。。
看他在那更新,我先去吃饭。
等我吃完饭c盘已经红了。。。
我给吓得直接转unity
但是那些下了一般的android sdk**就

前面代码里经常有waitingth,那是感jio有个进度用的(事实上并没有level)

不想写for,将就一下吧

void waitingth(){while(true){Console.Write(".");Thread.Sleep(200);Console.Write(".");Thread.Sleep(200);Console.Write(".");Thread.Sleep(200);Console.Write(".");Thread.Sleep(200);Console.Write(".");Thread.Sleep(200);Console.Write(".");Thread.Sleep(200);Console.Write('\u0008');Console.Write('\u0008');Console.Write('\u0008');Console.Write('\u0008');Console.Write('\u0008');Console.Write('\u0008');Console.Write(" ");Console.Write(" ");Console.Write(" ");Console.Write(" ");Console.Write(" ");Console.Write(" ");Console.Write('\u0008');Console.Write('\u0008');Console.Write('\u0008');Console.Write('\u0008');Console.Write('\u0008');Console.Write('\u0008');}}

就这样先,等待后续更新

这篇关于C# 使用Socket开发聊天及高速文件传输程序【无需服务器端】(和遇到的各种坑)值得一看的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/828099

相关文章

基于 Cursor 开发 Spring Boot 项目详细攻略

《基于Cursor开发SpringBoot项目详细攻略》Cursor是集成GPT4、Claude3.5等LLM的VSCode类AI编程工具,支持SpringBoot项目开发全流程,涵盖环境配... 目录cursor是什么?基于 Cursor 开发 Spring Boot 项目完整指南1. 环境准备2. 创建

Python使用FastAPI实现大文件分片上传与断点续传功能

《Python使用FastAPI实现大文件分片上传与断点续传功能》大文件直传常遇到超时、网络抖动失败、失败后只能重传的问题,分片上传+断点续传可以把大文件拆成若干小块逐个上传,并在中断后从已完成分片继... 目录一、接口设计二、服务端实现(FastAPI)2.1 运行环境2.2 目录结构建议2.3 serv

C#实现千万数据秒级导入的代码

《C#实现千万数据秒级导入的代码》在实际开发中excel导入很常见,现代社会中很容易遇到大数据处理业务,所以本文我就给大家分享一下千万数据秒级导入怎么实现,文中有详细的代码示例供大家参考,需要的朋友可... 目录前言一、数据存储二、处理逻辑优化前代码处理逻辑优化后的代码总结前言在实际开发中excel导入很

Spring Security简介、使用与最佳实践

《SpringSecurity简介、使用与最佳实践》SpringSecurity是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架,本文给大家介绍SpringSec... 目录一、如何理解 Spring Security?—— 核心思想二、如何在 Java 项目中使用?——

springboot中使用okhttp3的小结

《springboot中使用okhttp3的小结》OkHttp3是一个JavaHTTP客户端,可以处理各种请求类型,比如GET、POST、PUT等,并且支持高效的HTTP连接池、请求和响应缓存、以及异... 在 Spring Boot 项目中使用 OkHttp3 进行 HTTP 请求是一个高效且流行的方式。

python获取指定名字的程序的文件路径的两种方法

《python获取指定名字的程序的文件路径的两种方法》本文主要介绍了python获取指定名字的程序的文件路径的两种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要... 最近在做项目,需要用到给定一个程序名字就可以自动获取到这个程序在Windows系统下的绝对路径,以下

Java使用Javassist动态生成HelloWorld类

《Java使用Javassist动态生成HelloWorld类》Javassist是一个非常强大的字节码操作和定义库,它允许开发者在运行时创建新的类或者修改现有的类,本文将简单介绍如何使用Javass... 目录1. Javassist简介2. 环境准备3. 动态生成HelloWorld类3.1 创建CtC

使用Python批量将.ncm格式的音频文件转换为.mp3格式的实战详解

《使用Python批量将.ncm格式的音频文件转换为.mp3格式的实战详解》本文详细介绍了如何使用Python通过ncmdump工具批量将.ncm音频转换为.mp3的步骤,包括安装、配置ffmpeg环... 目录1. 前言2. 安装 ncmdump3. 实现 .ncm 转 .mp34. 执行过程5. 执行结

Java使用jar命令配置服务器端口的完整指南

《Java使用jar命令配置服务器端口的完整指南》本文将详细介绍如何使用java-jar命令启动应用,并重点讲解如何配置服务器端口,同时提供一个实用的Web工具来简化这一过程,希望对大家有所帮助... 目录1. Java Jar文件简介1.1 什么是Jar文件1.2 创建可执行Jar文件2. 使用java

C#使用Spire.Doc for .NET实现HTML转Word的高效方案

《C#使用Spire.Docfor.NET实现HTML转Word的高效方案》在Web开发中,HTML内容的生成与处理是高频需求,然而,当用户需要将HTML页面或动态生成的HTML字符串转换为Wor... 目录引言一、html转Word的典型场景与挑战二、用 Spire.Doc 实现 HTML 转 Word1