C#使用socket实现FTP、POP3、SMTP的客户端 (二)
来源:互联网 发布:amd游戏优化档案 15.7 编辑:程序博客网 时间:2024/04/29 07:19
概述
- socket本质是编程接口,是对TCP/IP的封装。
- TCP/IP是传输层的协议。
- FTP、POP3、SMTP都是应用层的协议,是基于TCP/IP协议的。
所以,我们使用socket实现上述几种协议的客户端,其实是对借助socket对TCP/IP数据传输的封装基础,再往上封装一层的。
FTP客户端
C#使用socket实现FTP、POP3、SMTP的客户端 (一)
POP3客户端
界面图:
控件由以下组成:
- 五个textbox:tb_POPServer, tb_username, tb_password, tb_message, tb_ID
- 一个listbox:lsb_status
- 四个button:btn_saveSettings, btn_connect, btn_disconnect, btn_Receive
该POP3客户端主要实现的就是接收邮件功能了,然而并没有实现邮件内容解析功能
头文件:
using System;using System.Windows.Forms;using System.Net.Sockets;using System.IO;
Sockets包是肯定要的,IO主要是为了使用NetworkStream类来方便socket的读写
全局变量:
#region Private Variablesprivate TcpClient Server;private NetworkStream StrmWtr;private StreamReader StrmRdr;private String cmdData;private byte[] szData;private const String CRLF = "\r\n";#endregion
POP3只需要建立一个连接,客户端向服务器发命令,服务器向客户端返回数据就行了。
主要用到的POP3命令如下:
(建议使用网易163邮箱,QQ的邮箱有SSL加密,好像挺麻烦的。使用POP3服务和SMTP服务需要登录邮箱,在“设置”里面打开POP3服务和SMTP服务授权。)
注意:PASS的密码是授权码,不是你登录邮箱的密码!
全局函数:
#region Private Functions/// <summary>/// 获取命令端口返回结果,并记录在lsb_status上/// </summary>private String getSatus(){ String ret = StrmRdr.ReadLine(); lsb_status.Items.Add(ret); lsb_status.SelectedIndex = lsb_status.Items.Count - 1; return ret;}#endregion
这几行代码重用太多了,索性拉出来写成函数了
连接按键(btn_connect)&断开连接(btn_disconnect):
#region Button: Connect & Disconnectprivate void btn_connect_Click(object sender, EventArgs e){ Cursor cr = Cursor.Current; Cursor.Current = Cursors.WaitCursor; Server = new TcpClient(tb_POPServer.Text, 110); lsb_status.Items.Clear(); try { StrmWtr = Server.GetStream(); StrmRdr = new StreamReader(Server.GetStream()); this.getSatus(); string ret; //Login cmdData = "USER " + tb_username.Text + CRLF; szData = System.Text.Encoding.ASCII.GetBytes(cmdData.ToCharArray()); StrmWtr.Write(szData, 0, szData.Length); this.getSatus(); cmdData = "PASS " + tb_password.Text + CRLF; szData = System.Text.Encoding.ASCII.GetBytes(cmdData.ToCharArray()); StrmWtr.Write(szData, 0, szData.Length); ret = this.getSatus(); if (ret[0] == '-') throw new InvalidOperationException("用户名密码错误"); //Get Email's Info cmdData = "STAT" + CRLF; szData = System.Text.Encoding.ASCII.GetBytes(cmdData.ToCharArray()); StrmWtr.Write(szData, 0, szData.Length); this.getSatus(); btn_connect.Enabled = false; btn_disconnect.Enabled = true; btn_Receive.Enabled = true; } catch (InvalidOperationException err) { lsb_status.Items.Add("ERROR: " + err.Message.ToString()); } finally { Cursor.Current = cr; }}private void btn_disconnect_Click(object sender, EventArgs e){ Cursor cr = Cursor.Current; Cursor.Current = Cursors.WaitCursor; //Logout cmdData = "QUIT" + CRLF; szData = System.Text.Encoding.ASCII.GetBytes(cmdData.ToCharArray()); StrmWtr.Write(szData, 0, szData.Length); this.getSatus(); StrmWtr.Close(); StrmRdr.Close(); btn_connect.Enabled = true; btn_disconnect.Enabled = false; btn_Receive.Enabled = false; Cursor.Current = cr;}#endregion
简单又重复,就是通过socket发命令,再通过socket接数据,没啥特别的
(就连解析字符串,然后显示有几封邮件的代码我都没写)
(因为一写,强迫症绝壁会打算把整封邮件的内容一起解析了)
接收邮件按键(btn_Receive):
#region Button: Receive Emailprivate void btn_Receive_Click(object sender, EventArgs e){ Cursor cr = Cursor.Current; Cursor.Current = Cursors.WaitCursor; string szTemp; tb_message.Clear(); try { cmdData = "RETR " + tb_ID.Text + CRLF; szData = System.Text.Encoding.ASCII.GetBytes(cmdData.ToCharArray()); StrmWtr.Write(szData, 0, szData.Length); szTemp = this.getSatus(); if (szTemp[0] != '-') { while (szTemp != ".") { tb_message.Text += szTemp + "\r\n"; szTemp = StrmRdr.ReadLine(); } } } catch (InvalidOperationException err) { lsb_status.Items.Add("ERROR: " + err.Message.ToString()); }}#endregion
强迫症忍住了,没把邮件解析出来……直接返回了socket收到的数据
SMTP客户端
C#使用socket实现FTP、POP3、SMTP的客户端 (三)
- C#使用socket实现FTP、POP3、SMTP的客户端 (二)
- C#使用socket实现FTP、POP3、SMTP的客户端 (一)
- C#使用socket实现FTP、POP3、SMTP的客户端 (三)
- 使用Telnet进行SMTP/POP3/FTP/NNTP
- 使用 Socket 通信实现 FTP 客户端程序(二)
- Socket实现的SMTP邮件发送客户端。
- 使用 Socket 通信实现 FTP 客户端程序
- 使用 Socket 通信实现 FTP 客户端程序
- 使用 Socket 通信实现 FTP 客户端程序
- 使用 Socket 通信实现 FTP 客户端程序
- 使用 Socket 通信实现 FTP 客户端程序
- 使用 Socket 通信实现 FTP 客户端程序
- 使用 Socket 通信实现 FTP 客户端程序
- 使用 Socket 通信实现 FTP 客户端程序
- 使用 Socket 通信实现 FTP 客户端程序
- 使用 Socket 通信实现 FTP 客户端程序
- 使用 SOCKET 通信实现 FTP 客户端程序
- 使用 Socket 通信实现 FTP 客户端程序
- ubuntu 打开终端快捷键
- linux学习笔记之输出重定向管道符及通配符
- ubantu14.04版本 arm-linux-gcc-3.4.5-glibc-2.3.6.tar.bz2 的安装
- 回文日期(date)
- Linux文件拆分命令 spilt
- C#使用socket实现FTP、POP3、SMTP的客户端 (二)
- 关于== 与 equals
- NAT的三种形态
- ios开发 真机调试访问本地服务器的url问题
- key
- PAT甲级真题及训练集(11)--1031. Hello World for U (20)
- 在家的日子
- java基础编程#2
- findViewById方法探究