Server 端
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Threading;
using System.Net.Sockets;
using System.IO;
namespace ser
{
public partial class Form1 : Form
{
Socket ClientSocket;
FileStream MyFileStream;
FileStream EzoneStream;
Socket server;
Socket client;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
//開啓接收線程
Thread TempThread = new Thread(new ThreadStart(this.StartReceive));
TempThread.Start();
}
private void StartReceive()
{
//創建一個網絡端點
IPEndPoint ipep = new IPEndPoint(IPAddress.Any, int.Parse("1005"));
//MessageBox.Show(IPAddress.Any);
//創建一個套接字
server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//綁定套接字到端口
server.Bind(ipep);
//開始偵聽(並堵塞該線程)
server.Listen(10);
while (true)
{
try
{
client = server.Accept();
ClientSocket = client;
Thread TempThread = new Thread(new ThreadStart(this.Create));
TempThread.Start();
}
catch (Exception ex)
{
int k = 0;
}
}
}
public void Create()
{
client = ClientSocket;
//確認連接
//Socket client = server.Accept();
//獲得客戶端節點對象
IPEndPoint clientep = (IPEndPoint)client.RemoteEndPoint;
////獲得[文件名]
// string SendFileName = System.Text.Encoding.Unicode.GetString(ReceiveVarData(client));
//獲得[包的大小]
// string bagSize = System.Text.Encoding.Unicode.GetString(ReceiveVarData(client));
//獲得[包的總數量]
//int bagCount = int.Parse(System.Text.Encoding.Unicode.GetString(ReceiveVarData(client)));
//獲得[最後一個包的大小]
//string bagLast = System.Text.Encoding.Unicode.GetString(ReceiveVarData(client));
// 創建一個新文件
MyFileStream = new FileStream("123.txt", FileMode.Create, FileAccess.Write);
//已發送包的個數
int SendedCount = 0;
//開始循環接收數據包-------------------------------------------------
string dd="";
while (true)
{
byte[] data = ReceiveVarData(client);
if (data.Length == 0)
{
break;
}
else
{
SendedCount++;
//將接收到的數據包寫入到文件流對象
MyFileStream.Write(data, 0, data.Length);
//顯示已發送包的個數
dd = Encoding.Default.GetString(data);
break;
}
}
//關閉文件流
MyFileStream.Close();
//發送數據-------------------------------------------------
EasyCares.App.Msg(dd, "ej");
if (dd == "1234567890")
{
//開啓文件傳輸子線程
//Thread TempThread = new Thread(new ThreadStart(this.StartSend));
//TempThread.Start();
//Socket client = ClientSocket;
//創建一個文件對象
FileInfo EzoneFile = new FileInfo("E:\\2.jpg");
//打開文件流
EzoneStream = EzoneFile.OpenRead();
//包的大小
int PacketSize = int.Parse("2012");
//包的數量
int PacketCount = (int)(EzoneStream.Length / ((long)PacketSize));
//最後一個包的大小
int LastDataPacket = (int)(EzoneStream.Length - ((long)(PacketSize * PacketCount)));
//指向遠程服務端節點 IPEndPoint(IPAddress address, int port);
// IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), int.Parse(1005));
//創建套接字
//Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//連接到發送端
//client.Connect(ipep);
//獲得客戶端節點對象
// IPEndPoint clientep = (IPEndPoint)client.RemoteEndPoint;
//發送[文件名]到客戶端
// SendVarData(client, System.Text.Encoding.Unicode.GetBytes(EzoneFile.Name));
//發送[包的大小]到客戶端
// SendVarData(client, System.Text.Encoding.Unicode.GetBytes(PacketSize.ToString()));
//發送[包的總數量]到客戶端
// SendVarData(client, System.Text.Encoding.Unicode.GetBytes(PacketCount.ToString()));
//發送[最後一個包的大小]到客戶端
// SendVarData(client, System.Text.Encoding.Unicode.GetBytes(LastDataPacket.ToString()));
//數據包
byte[] dataP = new byte[PacketSize];
//開始循環發送數據包
for (int i = 0; i < PacketCount; i++)
{
//從文件流讀取數據並填充數據包
EzoneStream.Read(dataP, 0, dataP.Length);
//發送數據包
SendVarData(client, dataP);
}
//如果還有多餘的數據包,則應該發送完畢!
if (LastDataPacket != 0)
{
dataP = new byte[LastDataPacket];
EzoneStream.Read(dataP, 0, dataP.Length);
SendVarData(client, dataP);//發送內容
}
//關閉文件流
EzoneStream.Close();
MessageBox.Show("文件傳輸完畢!");
}
}
private void button1_Click(object sender, EventArgs e)
{
server.Close();
//關閉套接字
client.Close();
this.Close();
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
server.Close();
//關閉套接字
client.Close();
//關閉文件流
}
public static int SendVarData(Socket s, byte[] data)
{
int total = 0;
int size = data.Length;
int dataleft = size;
int sent;
byte[] datasize = new byte[4];
datasize = BitConverter.GetBytes(size);
sent = s.Send(datasize);
while (total < size)
{
sent = s.Send(data, total, dataleft, SocketFlags.None);
total += sent;
dataleft -= sent;
}
//string dd = Encoding.Default.GetString(data);
//EasyCares.App.Msg(dd, "SendVarData");
return total;
}
public static byte[] ReceiveVarData(Socket s)
{
int total = 0;
int recv;
byte[] datasize = new byte[4];
recv = s.Receive(datasize, 0, 4, SocketFlags.None);
int size = BitConverter.ToInt32(datasize, 0);
int dataleft = size;
byte[] data = new byte[size];
while (total < size)
{
recv = s.Receive(data, total, dataleft, SocketFlags.None);
if (recv == 0)
{
data = null;
break;
}
total += recv;
dataleft -= recv;
}
return data;
}
//public static int SendData(Socket s, byte[] data)
//{
// int total = 0;
// int size = data.Length;
// int dataleft = size;
// int sent;
// while (total < size)
// {
// sent = s.Send(data, total, dataleft, SocketFlags.None);
// total += sent;
// dataleft -= sent;
// }
// return total;
//}
//public static byte[] ReceiveData(Socket s, int size)
//{
// int total = 0;
// int dataleft = size;
// byte[] data = new byte[size];
// int recv;
// while (total < size)
// {
// recv = s.Receive(data, total, dataleft, SocketFlags.None);
// if (recv == 0)
// {
// data = null;
// break;
// }
// total += recv;
// dataleft -= recv;
// }
// return data;
//}
}
}
client端
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Threading;
namespace cli
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
//獲得本機的IP地址
textBox4.Text = Dns.GetHostByName(Dns.GetHostName()).AddressList[0].ToString();
}
private void button1_Click(object sender, EventArgs e)
{
//選擇要進行傳輸的文件
if (this.openFileDialog1.ShowDialog() == DialogResult.OK)
{
FileInfo EzoneFile = new FileInfo(this.openFileDialog1.FileName);
this.textBox1.Text = EzoneFile.FullName;
this.textBox2.Text = EzoneFile.Name;
this.textBox3.Text = EzoneFile.Length.ToString();
}
}
private void button2_Click(object sender, EventArgs e)
{
//開啓文件傳輸子線程
Thread TempThread = new Thread(new ThreadStart(this.StartSend));
TempThread.Start();
}
private void StartSend()
{
//創建一個文件對象
FileInfo EzoneFile = new FileInfo(this.textBox1.Text);
//打開文件流
FileStream EzoneStream = EzoneFile.OpenRead();
//包的大小
int PacketSize = int.Parse(this.textBox8.Text);
//包的數量
int PacketCount = (int)(EzoneStream.Length / ((long)PacketSize));
//最後一個包的大小
int LastDataPacket = (int)(EzoneStream.Length - ((long)(PacketSize * PacketCount)));
//指向遠程服務端節點 IPEndPoint(IPAddress address, int port);
IPEndPoint ipep = new IPEndPoint(IPAddress.Parse(txtIP.Text.Trim()), int.Parse(this.textBox5.Text));
//創建套接字
Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//連接到發送端
client.Connect(ipep);
//獲得客戶端節點對象
IPEndPoint clientep = (IPEndPoint)client.RemoteEndPoint;
//發送[文件名]到客戶端
// SendVarData(client, System.Text.Encoding.Unicode.GetBytes(EzoneFile.Name));
//發送[包的大小]到客戶端
// SendVarData(client, System.Text.Encoding.Unicode.GetBytes(PacketSize.ToString()));
//發送[包的總數量]到客戶端
// SendVarData(client, System.Text.Encoding.Unicode.GetBytes(PacketCount.ToString()));
//發送[最後一個包的大小]到客戶端
// SendVarData(client, System.Text.Encoding.Unicode.GetBytes(LastDataPacket.ToString()));
//數據包
//發送數據--------------------------------------------------------
byte[] data = new byte[PacketSize];
//開始循環發送數據包
for (int i = 0; i < PacketCount; i++)
{
//從文件流讀取數據並填充數據包
EzoneStream.Read(data, 0, data.Length);
//發送數據包
SendVarData(client, data);
}
//如果還有多餘的數據包,則應該發送完畢!
if (LastDataPacket != 0)
{
data = new byte[LastDataPacket];
EzoneStream.Read(data, 0, data.Length);
SendVarData(client, data);//發送內容
}
//接收數據--------------------------------------------------------
int SendedCount = 0;
FileStream MyFileStream = new FileStream("12345.txt", FileMode.Create, FileAccess.Write);
while (true)
{
byte[] dataP = ReceiveVarData(client);
if (dataP.Length == 0)
{
break;
}
else
{
SendedCount++;
//將接收到的數據包寫入到文件流對象
MyFileStream.Write(dataP, 0, dataP.Length);
//顯示已發送包的個數
string dd = Encoding.Default.GetString(dataP);
// richTextBox1.Text = dd;
EasyCares.App.Msg(dd, "ej");
if (dd == "1234567890")
{
//開啓文件傳輸子線程
}
}
}
//關閉文件流
MyFileStream.Close();
//關閉套接字
client.Close();
//關閉文件流
EzoneStream.Close();
MessageBox.Show("文件傳輸完畢!");
}
public static int SendVarData(Socket s, byte[] data)
{
int total = 0;
int size = data.Length;
int dataleft = size;
int sent;
byte[] datasize = new byte[4];
datasize = BitConverter.GetBytes(size);
sent = s.Send(datasize);
while (total < size)
{
sent = s.Send(data, total, dataleft, SocketFlags.None);
total += sent;
dataleft -= sent;
}
return total;
}
public static byte[] ReceiveVarData(Socket s)
{
int total = 0;
int recv;
byte[] datasize = new byte[4];
recv = s.Receive(datasize, 0, 4, SocketFlags.None);
int size = BitConverter.ToInt32(datasize, 0);
int dataleft = size;
byte[] data = new byte[size];
while (total < size)
{
recv = s.Receive(data, total, dataleft, SocketFlags.None);
if (recv == 0)
{
data = null;
break;
}
total += recv;
dataleft -= recv;
}
return data;
}
//public static byte[] ReceiveData(Socket s, int size)
//{
// int total = 0;
// int dataleft = size;
// byte[] data = new byte[size];
// int recv;
// while (total < size)
// {
// recv = s.Receive(data, total, dataleft, SocketFlags.None);
// if (recv == 0)
// {
// data = null;
// break;
// }
// total += recv;
// dataleft -= recv;
// }
// return data;
//}
//公共函數
//public static int SendData(Socket s, byte[] data)
//{
// int total = 0;
// int size = data.Length;
// int dataleft = size;
// int sent;
// while (total < size)
// {
// sent = s.Send(data, total, dataleft, SocketFlags.None);
// total += sent;
// dataleft -= sent;
// }
// return total;
//}
}
}