小弟第一次接触这方面的东西,好多都没明白,希望有懂这方面知识的大大们给点帮助。偶的QQ467842700
这个服务器方程序只能接收一次传送的文件,第二次就连接不上了,如何让其可以一直监听。还有就是这个我做了局域网内可以传输,但是外网之间连接不上,请问是怎么回事。
服务器
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 TestSocketServerHSTF
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent(); dataGridView1.AllowUserToAddRows = false;
}
Thread TempThread = null;
private void Form1_Load(object sender, EventArgs e)
{
//开启接收线程
TempThread = new Thread(new ThreadStart(this.StartReceive));
TempThread.Start();
} private void StartReceive()
{
IPEndPoint ipep = new IPEndPoint(IPAddress.Any, int.Parse("8511"));
//MessageBox.Show(IPAddress.Any.ToString());
//创建一个套接字
Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //绑定套接字到端口
server.Bind(ipep); //开始侦听(并堵塞该线程)
server.Listen(10); //确认连接
Socket client = server.Accept();
//获得客户端节点对象
IPEndPoint clientep = (IPEndPoint)client.RemoteEndPoint; //获得[文件名]
string SendFileName = System.Text.Encoding.Unicode.GetString(TransferFiles.TransferFiles.ReceiveVarData(client));
//MessageBox.Show("文件名" + SendFileName); //获得[包的大小]
string bagSize = System.Text.Encoding.Unicode.GetString(TransferFiles.TransferFiles.ReceiveVarData(client));
//MessageBox.Show("包大小" + bagSize); //获得[包的总数量]
int bagCount = int.Parse(System.Text.Encoding.Unicode.GetString(TransferFiles.TransferFiles.ReceiveVarData(client)));
//MessageBox.Show("包的总数量" + bagCount); //获得[最后一个包的大小]
string bagLast = System.Text.Encoding.Unicode.GetString(TransferFiles.TransferFiles.ReceiveVarData(client));
//MessageBox.Show("最后一个包的大小" + bagLast); //创建一个新文件
FileStream MyFileStream = new FileStream(SendFileName, FileMode.Create, FileAccess.Write); //已发送包的个数
int SendedCount = 0; while (true)
{
byte[] data = TransferFiles.TransferFiles.ReceiveVarData(client);
if (data.Length == 0)
{
break;
}
else
{
SendedCount++;
//将接收到的数据包写入到文件流对象
MyFileStream.Write(data, 0, data.Length);
//显示已发送包的个数
//MessageBox.Show("已发送包个数"+SendedCount.ToString());
}
} //关闭文件流
MyFileStream.Close();
//关闭套接字
client.Close();
//填加到dgv里
//文件大小,IP,已发送包的个数,文件名,包的总量,最后一个包的大小
this.dataGridView1.Rows.Add(bagSize, clientep.Address, SendedCount, SendFileName, bagCount, bagLast);
} #region 拦截Windows消息,关闭窗体时执行
protected override void WndProc(ref Message m)
{
const int WM_SYSCOMMAND = 0x0112;
const int SC_CLOSE = 0xF060;
if (m.Msg == WM_SYSCOMMAND && (int)m.WParam == SC_CLOSE)
{//捕捉关闭窗体消息
// User clicked close button
//this.WindowState = FormWindowState.Minimized;//把右上角红叉关闭按钮变最小化 ServiceStop();
}
base.WndProc(ref m);
}
#endregion #region 停止服务
//停止服务
private void ServiceStop()
{
try
{
}
catch { }
try
{
}
catch { }
}
#endregion private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
}
}
}
这个服务器方程序只能接收一次传送的文件,第二次就连接不上了,如何让其可以一直监听。还有就是这个我做了局域网内可以传输,但是外网之间连接不上,请问是怎么回事。
服务器
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 TestSocketServerHSTF
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent(); dataGridView1.AllowUserToAddRows = false;
}
Thread TempThread = null;
private void Form1_Load(object sender, EventArgs e)
{
//开启接收线程
TempThread = new Thread(new ThreadStart(this.StartReceive));
TempThread.Start();
} private void StartReceive()
{
IPEndPoint ipep = new IPEndPoint(IPAddress.Any, int.Parse("8511"));
//MessageBox.Show(IPAddress.Any.ToString());
//创建一个套接字
Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //绑定套接字到端口
server.Bind(ipep); //开始侦听(并堵塞该线程)
server.Listen(10); //确认连接
Socket client = server.Accept();
//获得客户端节点对象
IPEndPoint clientep = (IPEndPoint)client.RemoteEndPoint; //获得[文件名]
string SendFileName = System.Text.Encoding.Unicode.GetString(TransferFiles.TransferFiles.ReceiveVarData(client));
//MessageBox.Show("文件名" + SendFileName); //获得[包的大小]
string bagSize = System.Text.Encoding.Unicode.GetString(TransferFiles.TransferFiles.ReceiveVarData(client));
//MessageBox.Show("包大小" + bagSize); //获得[包的总数量]
int bagCount = int.Parse(System.Text.Encoding.Unicode.GetString(TransferFiles.TransferFiles.ReceiveVarData(client)));
//MessageBox.Show("包的总数量" + bagCount); //获得[最后一个包的大小]
string bagLast = System.Text.Encoding.Unicode.GetString(TransferFiles.TransferFiles.ReceiveVarData(client));
//MessageBox.Show("最后一个包的大小" + bagLast); //创建一个新文件
FileStream MyFileStream = new FileStream(SendFileName, FileMode.Create, FileAccess.Write); //已发送包的个数
int SendedCount = 0; while (true)
{
byte[] data = TransferFiles.TransferFiles.ReceiveVarData(client);
if (data.Length == 0)
{
break;
}
else
{
SendedCount++;
//将接收到的数据包写入到文件流对象
MyFileStream.Write(data, 0, data.Length);
//显示已发送包的个数
//MessageBox.Show("已发送包个数"+SendedCount.ToString());
}
} //关闭文件流
MyFileStream.Close();
//关闭套接字
client.Close();
//填加到dgv里
//文件大小,IP,已发送包的个数,文件名,包的总量,最后一个包的大小
this.dataGridView1.Rows.Add(bagSize, clientep.Address, SendedCount, SendFileName, bagCount, bagLast);
} #region 拦截Windows消息,关闭窗体时执行
protected override void WndProc(ref Message m)
{
const int WM_SYSCOMMAND = 0x0112;
const int SC_CLOSE = 0xF060;
if (m.Msg == WM_SYSCOMMAND && (int)m.WParam == SC_CLOSE)
{//捕捉关闭窗体消息
// User clicked close button
//this.WindowState = FormWindowState.Minimized;//把右上角红叉关闭按钮变最小化 ServiceStop();
}
base.WndProc(ref m);
}
#endregion #region 停止服务
//停止服务
private void ServiceStop()
{
try
{
}
catch { }
try
{
}
catch { }
}
#endregion private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
}
}
}
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Collections;
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 发送端
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
} 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 EzoneSend_Load(object sender, System.EventArgs e)
//{
// //获得本机的IP地址
// this.textBox4.Text = Dns.GetHostByName(Dns.GetHostName()).AddressList[0].ToString();
// //this.textBox4.Text= Dns.GetHostByName(Dns.GetHostName()).AddressList[0].Address.ToString();
//} private void button2_Click(object sender, EventArgs e)
{
//开启文件传输子线程
Thread TempThread = new Thread(new ThreadStart(this.StartSend));
TempThread.Start();
this.button2.Enabled = false;
Control.CheckForIllegalCrossThreadCalls = false;
} private void Form1_Load(object sender, EventArgs e)
{
//获得本机的IP地址
this.textBox4.Text =Dns.GetHostByName(Dns.GetHostName()).AddressList[0].ToString();
} private void StartSend()
{
//创建一个文件对象
FileInfo EzoneFile = new FileInfo(this.textBox1.Text);
//打开文件流
FileStream EzoneStream = EzoneFile.OpenRead();
//包的大小
int PacketSize = int.Parse(this.textBox6.Text);
//包的数量
int PacketCount = (int)(EzoneStream.Length / ((long)PacketSize));
this.textBox8.Text = PacketCount.ToString();
this.progressBar1.Maximum = PacketCount;
//最后一个包的大小
int LastDataPacket = (int)(EzoneStream.Length - ((long)(PacketSize * PacketCount)));
this.textBox9.Text = LastDataPacket.ToString(); ////创建一个网络端点
//IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("192.168.1.136"), int.Parse(this.textBox5.Text)); ////MessageBox.Show(IPAddress.Any); ////创建一个套接字
//Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //MessageBox.Show(server.ToString()); //指向远程服务端节点 58.248.216.80
IPEndPoint ipep = new IPEndPoint(IPAddress.Parse(textBox7.Text), int.Parse(this.textBox5.Text));
//创建套接字
Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//连接到发送端
client.Connect(ipep); ////绑定套接字到端口
//client.Bind(ipep); //MessageBox.Show(ipep.ToString()); ////开始侦听(并堵塞该线程)
//server.Listen(10);
//确认连接
//Socket client = server.Accept(); //MessageBox.Show(client.ToString()); //获得客户端节点对象
IPEndPoint clientep = (IPEndPoint)client.RemoteEndPoint;
//获得客户端的IP地址
this.textBox7.Text=clientep.Address.ToString();
//发送[文件名]到客户端
TransferFiles.TransferFiles.SendVarData(client, System.Text.Encoding.Unicode.GetBytes(EzoneFile.Name));
//发送[包的大小]到客户端
TransferFiles.TransferFiles.SendVarData(client, System.Text.Encoding.Unicode.GetBytes(PacketSize.ToString()));
//发送[包的总数量]到客户端
TransferFiles.TransferFiles.SendVarData(client, System.Text.Encoding.Unicode.GetBytes(PacketCount.ToString()));
//发送[最后一个包的大小]到客户端
TransferFiles.TransferFiles.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);
//发送数据包
TransferFiles.TransferFiles.SendVarData(client, data);
//显示发送数据包的个数
this.textBox10.Text = ((int)(i + 1)).ToString();
//进度条值的显示
this.progressBar1.PerformStep();
} //如果还有多余的数据包,则应该发送完毕!
if (LastDataPacket != 0)
{
data = new byte[LastDataPacket];
EzoneStream.Read(data, 0, data.Length);
TransferFiles.TransferFiles.SendVarData(client, data);
this.progressBar1.Value = this.progressBar1.Maximum;
} //关闭套接字
client.Close();
//server.Close();
//关闭文件流
EzoneStream.Close();
this.button2.Enabled = true;
MessageBox.Show("文件传输完毕!");
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;using System.Net.Sockets;
using System.Net;
using System.Windows.Forms;namespace TransferFiles
{
public class TransferFiles
{
public TransferFiles()
{ } 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;
} 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;
}
}
}