C#TCP

本文介绍如何使用 C# 实现 TCP 协议下的客户端和服务端通信,包括时间服务器示例、FTP 文件下载及邮件发送等示例代码。
TCPClient
TCPClient 类提供了一种使用 TCP 协议连接到某个端点的简化方法。它还通过 NetworkStream 
对象展现在连接过程中读取或写入的数据。
请参见下面从 QuickStart 文档中摘录的日期/时间客户机示例。
 
使用 C# 编写
using System;
using System.Net;
using System.Net.Sockets;
using System.IO;
using System.Text;
class Client
{
public static void Main(String[] args)
{
TCPClient tcpc = new TCPClient();
Byte[] read = new Byte[32];
if (args.Length != 1)
{
Console.WriteLine(“请在命令行中指定服务器名称”);
return;
}
String server = args[0];
// 验证服务器是否存在
if (DNS.GetHostByName(server) == null)
{
Console.WriteLine(“找不到服务器:” + 服务器);
return;
}
// 尝试连接到服务器
if (tcpc.Connect(server, 13) == -1)
{
Console.WriteLine(“无法连接到服务器:” + 服务器);
return;
}
// 获取流
Stream s = tcpc.GetStream();
// 读取流并将它转换为 ASCII 码形式
int bytes = s.Read(read, 0, read.Length);
String Time = Encoding.ASCII.GetString(read);
// 显示数据
Console.WriteLine(“已接收到的” + 字节 + “字节”);
Console.WriteLine(“当前日期和时间是:” + 时间);
tcpc.Close();
}
}
 
TCPListener
TCPListener 类便于在来自某个客户机的 TCP 连接的特定套接字上进行侦听的工作。
请参见下面包括在 QuickStart 文档中的日期/时间服务器示例。
 
使用 C# 编写
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
class Server
{
public static void Main()
{
DateTime now;
String strDateLine;
Encoding ASCII = Encoding.ASCII;
// 在端口 13 进行侦听
TCPListener tcpl = new TCPListener(13);
tcpl.Start();
Console.WriteLine(“正在等待客户进行连接”);
Console.WriteLine(“请按 Ctrl+c 退出...”);
while (true)
{
// 接收会阻塞,直到有人连接上
Socket s = tcpl.Accept();
// 获取当前的日期和时间并将它连接成一个字符串
now = DateTime.Now;
strDateLine = now.ToShortDateString() + " " +
now.ToLongTimeString();
// 将该字符串转换成一个字节数组并发送它
Byte[] byteDateLine =
ASCII.GetBytes(strDateLine.ToCharArray());
s.Send(byteDateLine, byteDateLine.Length, 0);
Console.WriteLine(“发送” + strDateLine);
}
}
}

这个似乎是FTP下载的:
#region "Download: File transfer FROM ftp server" 
        /// <summary> 
        /// Copy a file from FTP server to local 
        /// </summary> 
        /// <param name="sourceFilename">Target filename, if required </param> 
        /// <param name="localFilename">Full path of the local file </param> 
        /// <returns> </returns> 
        /// <remarks>Target can be blank (use same filename), or just a filename 
        /// (assumes current directory) or a full path and filename </remarks> 
        public bool Download(string sourceFilename, string localFilename
bool PermitOverwrite) 
        
            //2. determine target file 
            FileInfo fi = new FileInfo(localFilename); 
            return this.Download(sourceFilename, fi, PermitOverwrite); 
        
 
        //Version taking an FtpFileInfo 
        public bool Download(FtpFileInfo file, string localFilename
bool permitOverwrite) 
        
            return this.Download(file.FullName, localFilename
, permitOverwrite); 
        
 
        //Another version taking FtpFileInfo and FileInfo 
        public bool Download(FtpFileInfo file, FileInfo localFI
bool permitOverwrite) 
        
            return this.Download(file.FullName, localFI
, permitOverwrite); 
        
 
        //Version taking string/FileInfo 
        public bool Download(string sourceFilename, FileInfo targetFI
bool permitOverwrite) 
        
            //1. check target 
            if (targetFI.Exists && !(permitOverwrite)) 
            
                throw (new ApplicationException("Target file already exists")); 
            
 
            //2. check source 
            string target; 
            if (sourceFilename.Trim() == ""
            
                throw (new ApplicationException("File not specified")); 
            
            else if (sourceFilename.Contains("/")) 
            
                //treat as a full path 
                target = AdjustDir(sourceFilename); 
            
            else 
            
                //treat as filename only, use current directory 
                target = CurrentDirectory + sourceFilename; 
            
 
            string URI = Hostname + target; 
 
            //3. perform copy 
            System.Net.FtpWebRequest ftp = GetRequest(URI); 
 
            //Set request to download a file in binary mode 
            ftp.Method = System.Net.WebRequestMethods.Ftp.DownloadFile; 
            ftp.UseBinary = true
 
            //open request and get response stream 
            using (FtpWebResponse response = (FtpWebResponse)ftp.GetResponse()) 
            
                using (Stream responseStream = response.GetResponseStream()) 
                
                    //loop to read & write to file 
                    using (FileStream fs = targetFI.OpenWrite()) 
                    
                        try 
                        
                            byte[] buffer = new byte[2048]; 
                            int read = 0; 
                            do 
                            
                                read = responseStream.Read(buffer, 0, buffer.Length); 
                                fs.Write(buffer, 0, read); 
                            while (!(read == 0)); 
                            responseStream.Close(); 
                            fs.Flush(); 
                            fs.Close(); 
                        
                        catch (Exception) 
                        
                            //catch error and delete file only partially downloaded 
                            fs.Close(); 
                            //delete target file as it's incomplete 
                            targetFI.Delete(); 
                            throw
                        
                    
 
                    responseStream.Close(); 
                
 
                response.Close(); 
            
 
 
            return true
        
        #endregion


似乎是发送MAIL的
using System;
 
using System.Collections.Generic;
 
using System.Text;
 
using System.Net.Mail;
 
using System.Diagnostics;
 
  
 
namespace MailTest
 
{
 
     class Program
 
     {
 
         static void Main(string[] args)
 
         {
 
              Encoding encoding = Encoding.GetEncoding("GB2312");
 
  
 
              MailAddress from = new MailAddress("youmailname@163.com"
"19850101", encoding);
 
              MailAddress to = new MailAddress("youmailname@163.com");
 
              MailMessage mail = new MailMessage(from, to);
 
              mail.Subject = "test";
 
              mail.Body = "hello world";
 
              mail.SubjectEncoding = encoding;
 
              mail.BodyEncoding = encoding;
 
  
 
              SmtpClient smtp = new SmtpClient("smtp.163.com");
 
              smtp.DeliveryMethod = SmtpDeliveryMethod.Network;
 
              smtp.UseDefaultCredentials = true;
 
            smtp.Credentials 
new System.Net.NetworkCredential("rjgcwwdz@163.com""19850101");
 
  
 
              smtp.Send(mail);
 
         }
 
     }
 
}


类似QQ通讯:
using System; 
using System.Collections.Generic; 
using System.Text; 
using System.Net; 
using System.IO; 
using System.Net.Sockets; 
using System.Threading; 
 
namespace MyQQSer 
    class Serv 
    
        private TcpListener listenr; 
        private Thread thread; 
        private bool isClose = false;    //结束程序是退出循环 
        private Socket[] sock = new Socket[50]; 
 
        public Serv() 
        
            Listener(); 
        
 
        ~Serv() 
        
            isClose = true
            for (int i = 0; i < sock.Length; i++) 
            
                if (sock[i] != null
                    sock[i].Close(); 
                listenr.Stop(); 
            
        
 
        /// <summary> 
        /// 开始监听端口 
        /// </summary> 
        public void Listener() 
        
            if (listenr == null
                listenr = new TcpListener(IPAddress.Parse("127.0.0.1"), 5000); 
            listenr.Start(); 
            if (thread == null
                thread = new Thread(new ThreadStart(ReciverMessage)); 
            thread.IsBackground = true
            thread.Start(); 
        
 
        /// <summary> 
        /// 接收数据 
        /// </summary> 
        private void ReciverMessage() 
        
            int count; //可用套结字索引 
            count = GetCount(); 
            bool loop = true
            if (count == -1) 
                loop = false
            if (loop) 
            
                while (true
                
                    // 判断是否退出循环 
                    if (isClose) 
                        break;                    
                    sock[count] = listenr.AcceptSocket(); 
                    Thread t = new Thread(new ThreadStart(ReciverMessage)); 
                    t.IsBackground = true
                    t.Start(); 
                    // 接受客户端数据 
                    while (true
                    
                        byte[] buffs = new byte[100]; 
                        if (sock[count].Connected) 
                        
                            try 
                            
                                sock[count].Receive(buffs); 
                                string message = Encoding.Default.GetString(buffs); 
                                Console.WriteLine(message); 
                                SendToAll(buffs); 
                            
                            catch (Exception ex) 
                            
 
                            
                        
                    
                
            
            Thread.CurrentThread.Abort(); 
        
 
        // 得到可用套结字索引 
        private int GetCount() 
        
            for (int i = 0; i < sock.Length; i++) 
                if (sock[i] == null
                    return i; 
            return -1; 
        
 
        // 发送消息给所有人 
        private void SendToAll(byte[] buff) 
        
            for (int i = 0; i < sock.Length; i++) 
            
                if (sock[i] != null
                
                    if (sock[i].Connected) 
                    
                        sock[i].Send(buff); 
                    
                
            
        
    


using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Text; 
using System.Windows.Forms; 
using System.Net.Sockets; 
using System.Net; 
using System.Threading; 
using System.IO; 
 
namespace TestClient 
    public partial class Form1 : Form 
    
        private TcpClient client; 
        private Thread t; 
        private Socket sock; 
        private bool close = false
 
        public Form1() 
        
            InitializeComponent(); 
        
 
        // 连接 
        private void btnConnect_Click(object sender, EventArgs e) 
        
            if(client == null
                client = new TcpClient(new IPEndPoint(IPAddress.Parse("127.0.0.1")
int.Parse(txtLoalPort.Text))); 
 
            if (t == null
                t = new Thread(new ThreadStart(ReciverMessage)); 
            t.IsBackground = true
            t.Start(); 
            btnSend.Enabled = true
            btnConnect.Enabled = false
        
         
        // 接收消息 
        private void ReciverMessage() 
        
            client.Connect(IPAddress.Parse(txtSerIP.Text)
int.Parse(txtSerPort.Text)); 
            while (true
            
                if (close) 
                    break
                    //NetworkStream nws = client.GetStream(); 
                    //StreamReader sr = new StreamReader(nws); 
                    //string message = sr.ReadToEnd(); 
                    //sr.Close(); 
                    if(sock == null
                            sock = client.Client; 
                    byte[] buff = new byte[100]; 
                    sock.Receive(buff); 
                    string message = Encoding.Default.GetString(buff); 
                    this.lstMessage.Items.Add(message);                
            
            Thread.CurrentThread.Abort(); 
        
 
        // 发送消息 
        private void btnSend_Click(object sender, EventArgs e) 
        
            string message = this.txtInput.Text; 
            byte[] buff = Encoding.Default.GetBytes(message); 
            sock.Send(buff); 
            txtInput.Text = ""
        
 
        private void Form1_FormClosing(object sender, FormClosingEventArgs e) 
        
            close = true
            sock.Close(); 
        
    
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值