刚开始没太搞清楚文件的分块传输,以至于在文件传输进度的地方,找了很久的资料都没弄出来。
服务端和客户端增加文件传输进度。
<pre name="code" class="csharp">using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using System.IO;
namespace Server2
{
public partial class Server : Form
{
public Server()
{
InitializeComponent();
TextBox.CheckForIllegalCrossThreadCalls = false;
}
Thread threadWatch = null;
Socket socketWatch = null;
private void SendServer_Click(object sender, EventArgs e)
{
socketWatch = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
int port = Convert.ToInt32(Port.Text.Trim());
IPAddress ip = IPAddress.Parse(IP.Text.Trim());
IPEndPoint ipe = new IPEndPoint(ip, port);
socketWatch.Bind(ipe);
socketWatch.Listen(5);
threadWatch = new Thread(WatchConnect);
threadWatch.IsBackground = true;
threadWatch.Start();
Message.AppendText("服务器已经启动,开始监听..." + "\r\n");
}
//感觉和C++的Map一样的一个容器
Dictionary<string, Socket> dicSocket = new Dictionary<string, Socket>();
Socket socketConnect = null;//与客户端建立连接的套接字
string clientName = null;//访问者的名字
IPAddress clientIP;//访问者的IP
int clientPort;//访问者的端口号
private void WatchConnect()
{
while (true)
{
try
{
socketConnect = socketWatch.Accept();
}
catch (Exception ex)
{
Message.AppendText(ex.Message);
break;
}
clientIP = (socketConnect.RemoteEndPoint as IPEndPoint).Address;//获取访问者的IP
clientPort = (socketConnect.RemoteEndPoint as IPEndPoint).Port;//获取访问者的Port
//创建访问者的标识,IP + Port
clientName = "IP:" + clientIP + "Port:" + clientPort;
ClientList.Items.Add(clientName);//在列表添加访问者信息
dicSocket.Add(clientName,socketConnect);//在字典数据中添加访问者
ParameterizedThreadStart pts = new ParameterizedThreadStart(ServerRec);
Thread thread = new Thread(pts);
thread.IsBackground = true;
thread.Start(socketConnect);
Message.AppendText("IP:" + clientIP + " Port:" + clientPort + " 的客户端与您连接成功,现在你们可以开始通信了...\r\n");
}
}
string recStr = null;
private void ServerRec(object obj)
{
Socket socketServer = obj as Socket;
long fileLength = 0;
while (true)
{
int firstRcv = 0;
byte[] buffer = new byte[8 * 1024];
try
{
//获取接受数据的长度,存入内存缓冲区,返回一个字节数组的长度
if (socketServer != null) firstRcv = socketServer.Receive(buffer);
if (firstRcv > 0)//大于0,说明有东西传过来
{
if (buffer[0] == 0)//0对应文字信息
{
recStr = Encoding.UTF8.GetString(buffer, 1, firstRcv - 1);
Message.AppendText(clientName + ": " + GetTime() + "\r\n" + recStr + "\r\n");
}
if (buffer[0] == 1)//1对应文件信息
{
string filenameSuffix = recStr.Substring(recStr.LastIndexOf("."));