10.10网络聊天

本文介绍了一个基于C#实现的TCP聊天程序与文件传输功能。通过创建多个线程来处理聊天消息的接收和发送,同时实现了文件的发送与接收功能。文中详细展示了如何配置IP地址与端口,启动监听服务,以及处理网络流的操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

[STAThread]
        
static void Main() 
        
{
            Application.Run(
new Form1());
        }

        
private void StartLisen ()//助教要作的事情
        {
            System.Net.IPAddress ip 
= System.Net.IPAddress.Parse ("10.0.3.4") ;// 将 IP 地址字符串转换为 System.Net.IPAddress 实例。  
            
            System.Net.IPEndPoint ipe 
= new System.Net.IPEndPoint (ip , 10000) ;//用指定的IP地址和端口号将网络终端端点实例化。
    
            tl
= new System.Net.Sockets.TcpListener (ipe) ;// 使用终结点ipe初始化 该侦听类的新实例
            tl.Start () ;        

            
while (true)
            
{
                System.Net.Sockets.TcpClient tc 
= tl.AcceptTcpClient () ;  //网络客户端tc 接受网络侦听类tl挂起的连接请求 
                System.Net.Sockets.NetworkStream ns =  tc.GetStream () ;//返回用于发送和接受的数据流给ns

                
byte [] buf = new byte [1024] ;  
                
int r = 0 ; 
                
while ((r = ns.Read (buf , 0 , buf.Length ))!=0)  
                
{
                    
string s = System.Text.Encoding.Default.GetString (buf ) ;    
                    
this.ChatHistory.AppendText (s) ;
                }

                ns.Close () ;    
            }

        }
    
        
private System.Threading.Thread  td ;  //定义td私有变量线程
        private System.Net.Sockets.TcpListener tl ; //定义网络客户端侦听 tl
        
        
private void OnLine_Click(object sender, System.EventArgs e)          //上线
        {
            System.Threading.ThreadStart ts 
= new System.Threading.ThreadStart(StartLisen) ;
            
//助教计划 ,(生成td线程的一个ts计划,传入所要触发的StartLisen事件)
            td = new System.Threading.Thread (ts) ;
            
//生成助教 ---并把计划交给他 
            td.Start () ;
            
            System.Threading.ThreadStart ts2   
= new System.Threading.ThreadStart (StartLisen2) ;
            
            td2 
= new System.Threading.Thread (ts2);
        
            td2.Start () ;
        }

        
private void OffLine_Click(object sender, System.EventArgs e)       //下线
        {
            
this.td.Abort () ;  //线程实例td终止
            this.tl.Stop () ;  //客户端侦听tl关闭

            
this.td2.Abort() ;
            
this.tl2.Stop() ;
        }

        
private void Send_Click(object sender, System.EventArgs e)           //发送聊天内容
        {
            System.Net.Sockets.TcpClient tc 
= new System.Net.Sockets.TcpClient(this.IpAdd.Text,10000) ;
                
// 初始化客户端类的一个新实例,并将其绑定到指定的10000本地终结点。
            System.Net.Sockets.NetworkStream ns = tc.GetStream ();

            
string s = this.MyName.Text+System.Environment.NewLine+this.ChatText.Text;
            
this.ChatHistory.AppendText(s) ;
            
byte [] buf = System.Text.Encoding.Default.GetBytes(s) ;    
            
            ns.Write (buf , 
0 , buf.Length );

            ns.Close () ;
        }

        
private System.Threading.Thread td2 ;
        
private System.Net.Sockets.TcpListener tl2 ;
        
private void StartLisen2 ()        //监听,即可以接收对方的文件           
        {
            System.Net.IPAddress ip 
= System.Net.IPAddress.Parse ("10.0.*.*") ;// 将 接收方的IP 地址字符串转换为 System.Net.IPAddress 实例。  
            System.Net.IPEndPoint ipe = new System.Net.IPEndPoint ( ip , 10001) ;//用指定的IP地址和端口号将网络终端端点实例化。
    
            tl2
= new System.Net.Sockets.TcpListener (ipe) ;// 使用终结点ipe初始化 该侦听类的新实例
            tl2.Start () ;

            
while (true)
            
{
                System.Net.Sockets.TcpClient tc 
= tl2.AcceptTcpClient () ;  //网络客户端tc 接受网络侦听类tl挂起的连接请求 
                System.Net.Sockets.NetworkStream ns = tc.GetStream () ;//返回用于发送和接受的数据流给ns

                
if(this.saveFileDialog1.ShowDialog() == DialogResult.OK )
                
{
                    
string fm = this.saveFileDialog1.FileName ;
                    
                    System.IO.FileStream wfs 
= new FileStream (fm,System.IO.FileMode.Create) ;
                    
                    
byte [] buf = new byte [1024] ;  
                    
int r = 0 ; 
                    
while ((r = ns.Read (buf , 0 , buf.Length ))!=0)  
                    
{
                        wfs.Write(buf,
0,r) ;
                    }

                ns.Close () ;
                wfs.Close() ;
                }

            }

        }

        
private void openfile_Click(object sender, System.EventArgs e)       //发送文件
        {        
            
if(this.openFileDialog1.ShowDialog()==DialogResult.OK) 
            
{
                
string fm = this.openFileDialog1.FileName ;
 
                System.IO.FileStream rfs 
= new FileStream(fm,System.IO.FileMode.Open) ; 

                System.Net.Sockets.TcpClient tc 
= new System.Net.Sockets.TcpClient(this.IpAdd.Text,10001) ;
                
                System.Net.Sockets.NetworkStream ns 
= tc.GetStream ();

                
byte [] buf =new byte[1024];    
                
                
int i ;
                
                
while ((i=rfs.Read(buf,0,buf.Length)) !=0 )
                
{
                    ns.Write (buf , 
0 , i ) ;
                }

                rfs.Close() ;
                ns.Close () ;
                
            }

        }


        
private void sendfile_Click(object sender, System.EventArgs e)     
        
{
          
        }


        
private void ChatText_TextChanged(object sender, System.EventArgs e)
        
{
        
        }

        
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值