使用C#进行点对点通讯和文件传输

原创 2007年09月28日 14:01:00
上面介绍了通讯的基类,下面就是使用那个类进行发送和接收的部分:
二、发送部分:
发送咱们使用了多线程,可以同时进行多个任务,比如发送文件、发送文本等,互不影响:
发送文本方法:
private void StartSendText(string strHost,int iPort,string strInfo)
       {
           SendText stText = new SendText(strHost,iPort,strInfo,new CommunClass.OnSend(OnSendDrawProgress)) ;
           StartThread(new ThreadStart(stText.Send)) ;
       }
下面是他调用用到的一些方法:
开始一个线程
private void StartThread(ThreadStart target)
       {
           Thread doStep = new Thread(target) ;          
           doStep.IsBackground = true ;
           doStep.Start() ;
       }
 发送一部分(本文设置的是1024字节)成功后的回调方法
        public void OnSendDrawProgress(int iTotal,int iSending)
       {  
           if (iTotal != pbMain.Maximum)
               pbMain.Maximum = iTotal ;
                pbMain.Value = iSending ;
       }
因为使用的是线程,所以发送文本使用的是一个发送文本类的方法,该类如下:
public class SendText
     {
          private string Host ;
          private int Port ;
          private string Info ;
          private CommunClass.OnSend onsend ;
         public SendText(string strHost,int iPort,string strInfo,
              CommunClass.OnSend onSend)
         {
              Host = strHost ;
              Port = iPort ;
              Info = strInfo ;
              onsend = onSend ;
         }
         public void Send()
         {
              Socket s = null ;
              try
              {
                   s = CommunClass.ConnectToServer(Host,Port) ;
 
                   CommunClass.WriteCommandToSocket(s,"SENDTEXT") ;
                   CommunClass.WriteCommandDescToSocket(s,"") ;                  
                   CommunClass.WriteDynamicTextToSocket(s,Info,onsend) ;
              }
              catch (Exception e)
              {
                   MessageBox.Show(e.Message) ;
              }
              finally
              {
                   if (s != null)
                        s.Close() ;
              }
         }
 
     }//end class
      
这样就可以使用一个线程发送文本了。
发送文件的方法也类似:
private void StartSendFile(string strHost,int iPort,string strFile)
       {
           SendFile sfFile = new SendFile(strHost,iPort,strFile,this.pbMain) ;
           pbMain.Value = 0 ;
           StartThread(new ThreadStart(sfFile.Send)) ;       
       }
发送文件的类:
public class SendFile
     {
          private string Host ;
          private int Port ;
          private string FileToSend ;
          private ProgressBar pbar;
 
         public SendFile(string strHost,int iPort,string strFile,ProgressBar pbMain)
         {
              Host = strHost ;
              Port = iPort ;
              FileToSend = strFile ;
              pbar = pbMain ;
         }
         public void Send()
         {
              Socket s = null ;
              try
              {                  
                   s = CommunClass.ConnectToServer(Host,Port) ;
 
                   CommunClass.WriteCommandToSocket(s,"SENDFILE") ;
                   CommunClass.WriteCommandDescToSocket(s,"") ;
                  
                   CommunClass.WriteFileToSocket(s,FileToSend,new CommunClass.OnSend(OnSendDrawProgress)) ;
              }
              catch (Exception e)
              {
                   MessageBox.Show(e.Message) ;
              }
              finally
              {
                   if (s != null)
                        s.Close() ;
              }
         }
        
 
         public void OnSendDrawProgress(int iTotal,int iSending)
         {   
              if (iTotal != pbar.Maximum)
                   pbar.Maximum = iTotal ;
           
              pbar.Value = iSending ;
         }        
    
     }//end class
当然,你发送一个命令让服务器端启动一个程序(靠,这不成木马了吗?)也可以:
俺这里只给出一部分代码,其余的您自己可以发挥以下:
public class ExeCuteFile
     {
          private string Host ;
          private int Port ;
          private string FileName ;
          private string cmdParam ;
        
         public ExeCuteFile(string strHost,int iPort,string strFileName,string strCmdParam)
         {
              Host = strHost ;
              Port = iPort ;
              FileName = strFileName ;
              cmdParam = strCmdParam ;
         }
        
         public void Send()
         {
                   Socket s = null ;
              try
              {
                   s = CommunClass.ConnectToServer(Host,Port) ;
 
                   CommunClass.WriteCommandToSocket(s,"EXECUTEFILE") ;
                   CommunClass.WriteCommandDescToSocket(s,FileName) ;
                   CommunClass.WriteDynamicTextToSocket(s,"",null) ;
                   MessageBox.Show(CommunClass.ReadDynamicTextFromSocket(s)) ;
              }
              catch (Exception e)
              {
                   MessageBox.Show(e.Message) ;
              }
              finally
              {
                   if (s != null)
                        s.Close() ;
              }
 
         }
     }
三、下面是服务器端接受信息的代码:
创建监听:
///<summary>
         /// 再给定的主机和端口上创建监听程序
         ///</summary>
         ///<param name="strAddress"></param>
         ///<param name="iPort"></param>
          private void BuildingServer(string strAddress,int iPort)
         {
              IPAddress ipAddress = Dns.Resolve(strAddress).AddressList[0];
             
              try
              {
                   listener = new TcpListener(ipAddress, iPort);   
              }
              catch ( Exception e)
              {
                   AddInfo(e.Message) ;
              }
         }

 

开始监听:
///<summary>
         /// 开始监听
         ///</summary>
          private void StartListen()
         {
              bool done = false;       
 
              listener.Start();
              while (!done)
              {
                   Socket s = listener.AcceptSocket() ;
                   if(s != null)
                   {
                        DealWithSocket dws = new DealWithSocket(s,this.tbLog) ;
                        StartThread(new ThreadStart(dws.DealWith)) ;
                   }
              }        
         }
 
private void StartThread(ThreadStart target)
         {
              Thread doStep = new Thread(target) ;
              doStep.IsBackground = true ;
              doStep.Start() ;
         }
开始监听后,对于每一个监听到的客户端的连接都用一个单独的线程来处理,处理通过类DealWithSocket来完成,下面是类代码:
public class DealWithSocket
     {
          private Socket s = null ;
          private TextBox tbLog = null ;
         public DealWithSocket(Socket newSocket,TextBox tbInfo)
         {
              s = newSocket ;
              tbLog = tbInfo ;
         }
 
         public void DealWith()
         {
              string strCmd = CommunClass.ReadCommandFromSocket(s) ;
              string strDesc = CommunClass.ReadCommandDescFromSocket(s) ;
              AddInfo(strCmd) ;
              switch(strCmd)
              {
                   case "SENDFILE" :
                        CommunClass.ReadDynamicFileFromSocket(s,"e://rrr.txt") ;                       
                       break ;
                   case "EXECUTEFILE" :
                       string strParam = CommunClass.ReadDynamicTextFromSocket(s) ;
                       string strResult = ExeCuteFile(strDesc,strParam) ;
                        CommunClass.WriteDynamicTextToSocket(s,strResult,null) ;
                       break ;
                   default:              
                       string strDetail = CommunClass.ReadDynamicTextFromSocket(s) ;
                        AddInfo(strDetail) ;
                       break ;
              }
              try
              {
                   s.Close() ;
              }
              catch (Exception e)
              {
                   AddInfo(e.Message) ;
              }
         }
          private void AddInfo(string strInfo)
         {
              string Info = DateTime.Now.ToLongTimeString() + " "+ strInfo +"/r/n" ;
              tbLog.Text += Info ;
              tbLog.Refresh() ;
         }
          private string ExeCuteFile(string strFileName,string strCmdParam)
         {
              System.Diagnostics.Process proc = new System.Diagnostics.Process() ;
              proc.StartInfo.FileName = strFileName ;
              proc.StartInfo.Arguments = strCmdParam ;
              try
              {
                   proc.Start() ;
                   return "OK" ;
              }
              catch(Exception err)
              {
                   return err.Message ;
              }
         }
     }//end class
以上就是所用的代码,希望大家批判指正.
 
 

使用C#进行点对点通讯和文件传输

最近一个项目要用到点对点文件传输,俺就到处找资料写程序,最后终于完成了,为了让别人少走些弯路,俺决定将俺程序中最重要的部分贡献出来,希望对大家有所帮助。 俺的程序分三部分,包括发送部分、接受部分和一...
  • ccx_john
  • ccx_john
  • 2013年12月10日 11:14
  • 557

使用Socket进行设备间点对点连接传输数据

对GCDAsyncSocket和GCDAsyncUdpSocket进行封装, 实现了服务器通过UDP广播向局域网发送数据, 客户端接收后与服务器进行TCP连接, 成功连接后进行点对点通信....
  • liangshi1
  • liangshi1
  • 2016年06月04日 15:55
  • 3594

怎么用C++实现点对点通信

怎么用C++实现点对点通信 1、使用c++TCP /IP 编程 ,socket 或者 RemoteFuncationsCall 远程方法调用 (RPC)。  2、服务器端: ...
  • DDFFR
  • DDFFR
  • 2016年10月22日 22:29
  • 1432

C#完整的通信代码(点对点,点对多,同步,异步,UDP,TCP)

C# code namespace UDPServer { class Program { static void Main(string[] args) { int re...
  • ccx_john
  • ccx_john
  • 2013年12月10日 11:13
  • 993

C# Winform局域网传送文件

//发送文件 private void btn_sendFile_Click(object sender, EventArgs e) { ...
  • smartsmile2012
  • smartsmile2012
  • 2013年03月11日 10:19
  • 5004

如何实现即时通讯的点对点聊天需求

在IM通讯中,通常需要管理自己的小伙伴,经常联系的,重要的用户需要标识在同一用户列表里,方便自己快速联系以及查看好友动态。那么如何可以做到类似QQ的好友列表功能呢,下面以一款在市面上功能强大的SDK为...
  • little_rui
  • little_rui
  • 2014年09月26日 14:17
  • 2499

ZStack间接panid通信设置(将zigbee改装成点对点通信的方法)

虽然这种改装违背了zigbee这个协议本身的初衷,但是依然可以满足某种特定的通信需求,我的项目中用到了,贴出来给大家看看,是一师兄整理的资料,在此分享给大家 间接panId通信的优点:同一信道下面的...
  • z_l_l_m
  • z_l_l_m
  • 2013年09月11日 22:39
  • 4390

一种Jingle开源库的文件传输原理与实现

0    引言 随着即时通信(IM)软件已经成为互联网信息平台的重要组成部分[4]。但基于自身利益的考虑,各个IM软件均制定并保守自己支持的通信协议格式和标准,导致了各个通信软件不能互联互通...
  • educast
  • educast
  • 2014年09月22日 09:26
  • 4427

socket03---小变形,点对点通信聊天

回顾一下上篇中提到的几个常用的结构和函数://最常用的ipv4的sockaddr struct sockaddr_in{ in_port_t sin_port; //2个字节,...
  • tingyun_say
  • tingyun_say
  • 2016年04月28日 20:22
  • 1120

android网络编程 -- Socket 通信(03) 点对点Android聊天室实现(带服务器) [附源码分析]

1-简介: 概念:在网络上的两个程序通过一个双向的通信连接实现数据的交换,这个双向链路的一端称为一个socket。 组成:由一个IP地址和一个端口号唯一确定,是TCP/IP 协议的一个十分流行的编程界...
  • hit_rxz
  • hit_rxz
  • 2014年09月20日 18:12
  • 3829
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:使用C#进行点对点通讯和文件传输
举报原因:
原因补充:

(最多只允许输入30个字)