以下代码为服务端发送文件代码,为什么当同时发送文件给两个用户时,接受第二个用户发送的信息就为乱码?消息为英文?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;
using System.Xml;namespace FileSendServer
{
public partial class SendFile : Form
{
public SendFile()
{
InitializeComponent();
}
//传送文件所在服务器IP
private string clientIP = "";
//传送文件路径
private string filename = "";
private Socket ServerSocket;//服务端运行的SOCKET
private Socket ServerSocket1;//服务端运行的SOCKET
private Thread ServerThread;//服务端运行的线程
private Thread th;
private Socket[] ClientSocket;//为客户端建立的SOCKET连接
private int ClientNumb;//存放客户端数量
private byte[] MsgBuffer;//存放消息数据
private void Form1_Load(object sender, EventArgs e)
{ clientIP = "192.168.10.15";
filename ="";
//创建客户连接侦测
interception(); } /// <summary>
/// //创建客户连接侦测
/// </summary>
private void interception()
{
try
{
int inport;
IPAddress hostIP = Dns.GetHostEntry(clientIP).AddressList[0]; //将主机名或 IP 地址解析为 IPHostEntry 实例。
//将网络端点表示为 IP 地址和端口号。
IPEndPoint ep = new IPEndPoint(hostIP, 11000); //用指定的地址和端口号初始化 IPEndPoint 类的新实例。
ServerSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
ServerSocket.Bind(ep);//将SOCKET接口和IP端口绑定
ServerSocket.Listen(10);//开始监听,并且挂起数为10
ServerThread = new Thread(RecieveAccept);//将接受客户端连接的方法委托给线程
ServerThread.Start();//线程开始运行
ClientSocket = new Socket[65535];//为客户端提供连接个数
MsgBuffer = new byte[1024];//消息数据大小
ClientNumb = 0;//数量从0开始统计
CheckForIllegalCrossThreadCalls = false;//不捕获对错误线程的调用
}
catch (SocketException ex)
{
Console.WriteLine(ex.ToString());
}
} /// <summary>
/// 开启新端口进行文件发送(挂起线程)
/// </summary>
private void SocketBind()
{
IPAddress hostIP = Dns.GetHostEntry(clientIP).AddressList[0]; //将主机名或 IP 地址解析为 IPHostEntry 实例。
int InPort=12000;
//获取客户端文件XLM
XmlDocument FileInfo = new XmlDocument();
FileInfo.Load(Application.StartupPath + @"\FileInfo.xml");
XmlNode xne = FileInfo.SelectSingleNode("Server");
XmlNodeList xn = xne.ChildNodes;
foreach (XmlNode xf in xn)
{
XmlElement xe = (XmlElement)xf;
string sort = xe.InnerText.ToString().Trim();
InPort = Convert.ToInt32(xe.Name.ToString().Substring(1,xe.Name.Length-1));
if (sort == "0")
{
xe.InnerText = "1";
break;
}
}
//保存編輯后的文件信息XML
FileInfo.Save(Application.StartupPath + @"\FileInfo.xml");
//将网络端点表示为 IP 地址和端口号。
IPEndPoint ep = new IPEndPoint(hostIP,InPort);
ClientSocket[ClientNumb].Send(Encoding.Default.GetBytes(InPort.ToString()));
ServerSocket1 = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
ServerSocket1.Bind(ep);
ServerSocket1.Listen(10);
CheckForIllegalCrossThreadCalls = false;//不捕获对错误线程的调用
ClientSocket[ClientNumb] = ServerSocket1.Accept();
//RecieveCallBack(IAsyncResult AR)
ParameterizedThreadStart s = new ParameterizedThreadStart(SendFiles);
th = new Thread(s);
th.Start(ClientSocket[ClientNumb]);
} /// <summary>
/// 监听客户端连接
/// </summary>
private void RecieveAccept()
{
while (true)
{
ClientSocket[ClientNumb] = ServerSocket.Accept();
//连接成功,记录连接信息
this.ClientList.Items.Add(ClientSocket[ClientNumb].RemoteEndPoint.ToString() + "成功连接服务器.");
ClientNumb++;
//创建新的发送文件对象
SocketBind();
}
} /// <summary>
/// 发送文件
/// </summary>
/// <param name="obj"></param>
void SendFiles(object obj)
{
Socket ClientSocket = (Socket)obj;
int btyes;
//获取更新文件信息
btyes = ClientSocket.Receive(MsgBuffer);
//获取客户短传来的更新文件信息
string file = Encoding.Default.GetString(MsgBuffer, 0, btyes);
if (file != "")
{
string[] val = file.Split('-');
string sendfile = "";
for (int h = 0; h < val.Length; h++)
{
//获取文件大小
string filepath = Application.StartupPath + @"\" + val[h].ToString().Trim();
FileStream fl = new FileStream(filepath, FileMode.Open, FileAccess.Read);
int filelength = (int)fl.Length;
if (h == val.Length - 1)
{
sendfile = sendfile + filelength.ToString().Trim() + "," + val[h].ToString().Trim();
}
else
{
sendfile = sendfile + filelength.ToString().Trim() + "," + val[h].ToString().Trim() + "-";
}
}
//发送总文件个数、当前文件大小、文件名含后缀名(字符串形式,以“/”区分)
ClientSocket.Send(Encoding.Default.GetBytes(sendfile));
//接收客戶端接受信息的完成指令
btyes = ClientSocket.Receive(MsgBuffer);
//獲取指令字符串
string dictate = Encoding.Default.GetString(MsgBuffer, 0, btyes);
//判斷客戶端接收文件信息是否成功
if (dictate == "StrOK")
{
for (int j = 0; j < val.Length; j++)
{
/*发送文件*/
//获取发送文件路径
filename = Application.StartupPath + @"\" + val[j].ToString().ToString();
//文件实例化
FileStream fileSteam = new FileStream(filename, FileMode.Open, FileAccess.Read);
//将发送的文件包切成1024字节的文件包
while (fileSteam.Position < fileSteam.Length)
{
int readSize = fileSteam.Read(MsgBuffer, 0, MsgBuffer.Length);
if (readSize > 0)
{
//发送文件包
ClientSocket.Send(MsgBuffer, readSize, SocketFlags.None);
}
}
//接收客戶端收取發送文件完成的指令
btyes = ClientSocket.Receive(MsgBuffer);
dictate = Encoding.Default.GetString(MsgBuffer, 0, btyes);
}
ClientSocket.Shutdown(SocketShutdown.Both);
ClientSocket.Close();
}
}
}
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;
using System.Xml;namespace FileSendServer
{
public partial class SendFile : Form
{
public SendFile()
{
InitializeComponent();
}
//传送文件所在服务器IP
private string clientIP = "";
//传送文件路径
private string filename = "";
private Socket ServerSocket;//服务端运行的SOCKET
private Socket ServerSocket1;//服务端运行的SOCKET
private Thread ServerThread;//服务端运行的线程
private Thread th;
private Socket[] ClientSocket;//为客户端建立的SOCKET连接
private int ClientNumb;//存放客户端数量
private byte[] MsgBuffer;//存放消息数据
private void Form1_Load(object sender, EventArgs e)
{ clientIP = "192.168.10.15";
filename ="";
//创建客户连接侦测
interception(); } /// <summary>
/// //创建客户连接侦测
/// </summary>
private void interception()
{
try
{
int inport;
IPAddress hostIP = Dns.GetHostEntry(clientIP).AddressList[0]; //将主机名或 IP 地址解析为 IPHostEntry 实例。
//将网络端点表示为 IP 地址和端口号。
IPEndPoint ep = new IPEndPoint(hostIP, 11000); //用指定的地址和端口号初始化 IPEndPoint 类的新实例。
ServerSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
ServerSocket.Bind(ep);//将SOCKET接口和IP端口绑定
ServerSocket.Listen(10);//开始监听,并且挂起数为10
ServerThread = new Thread(RecieveAccept);//将接受客户端连接的方法委托给线程
ServerThread.Start();//线程开始运行
ClientSocket = new Socket[65535];//为客户端提供连接个数
MsgBuffer = new byte[1024];//消息数据大小
ClientNumb = 0;//数量从0开始统计
CheckForIllegalCrossThreadCalls = false;//不捕获对错误线程的调用
}
catch (SocketException ex)
{
Console.WriteLine(ex.ToString());
}
} /// <summary>
/// 开启新端口进行文件发送(挂起线程)
/// </summary>
private void SocketBind()
{
IPAddress hostIP = Dns.GetHostEntry(clientIP).AddressList[0]; //将主机名或 IP 地址解析为 IPHostEntry 实例。
int InPort=12000;
//获取客户端文件XLM
XmlDocument FileInfo = new XmlDocument();
FileInfo.Load(Application.StartupPath + @"\FileInfo.xml");
XmlNode xne = FileInfo.SelectSingleNode("Server");
XmlNodeList xn = xne.ChildNodes;
foreach (XmlNode xf in xn)
{
XmlElement xe = (XmlElement)xf;
string sort = xe.InnerText.ToString().Trim();
InPort = Convert.ToInt32(xe.Name.ToString().Substring(1,xe.Name.Length-1));
if (sort == "0")
{
xe.InnerText = "1";
break;
}
}
//保存編輯后的文件信息XML
FileInfo.Save(Application.StartupPath + @"\FileInfo.xml");
//将网络端点表示为 IP 地址和端口号。
IPEndPoint ep = new IPEndPoint(hostIP,InPort);
ClientSocket[ClientNumb].Send(Encoding.Default.GetBytes(InPort.ToString()));
ServerSocket1 = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
ServerSocket1.Bind(ep);
ServerSocket1.Listen(10);
CheckForIllegalCrossThreadCalls = false;//不捕获对错误线程的调用
ClientSocket[ClientNumb] = ServerSocket1.Accept();
//RecieveCallBack(IAsyncResult AR)
ParameterizedThreadStart s = new ParameterizedThreadStart(SendFiles);
th = new Thread(s);
th.Start(ClientSocket[ClientNumb]);
} /// <summary>
/// 监听客户端连接
/// </summary>
private void RecieveAccept()
{
while (true)
{
ClientSocket[ClientNumb] = ServerSocket.Accept();
//连接成功,记录连接信息
this.ClientList.Items.Add(ClientSocket[ClientNumb].RemoteEndPoint.ToString() + "成功连接服务器.");
ClientNumb++;
//创建新的发送文件对象
SocketBind();
}
} /// <summary>
/// 发送文件
/// </summary>
/// <param name="obj"></param>
void SendFiles(object obj)
{
Socket ClientSocket = (Socket)obj;
int btyes;
//获取更新文件信息
btyes = ClientSocket.Receive(MsgBuffer);
//获取客户短传来的更新文件信息
string file = Encoding.Default.GetString(MsgBuffer, 0, btyes);
if (file != "")
{
string[] val = file.Split('-');
string sendfile = "";
for (int h = 0; h < val.Length; h++)
{
//获取文件大小
string filepath = Application.StartupPath + @"\" + val[h].ToString().Trim();
FileStream fl = new FileStream(filepath, FileMode.Open, FileAccess.Read);
int filelength = (int)fl.Length;
if (h == val.Length - 1)
{
sendfile = sendfile + filelength.ToString().Trim() + "," + val[h].ToString().Trim();
}
else
{
sendfile = sendfile + filelength.ToString().Trim() + "," + val[h].ToString().Trim() + "-";
}
}
//发送总文件个数、当前文件大小、文件名含后缀名(字符串形式,以“/”区分)
ClientSocket.Send(Encoding.Default.GetBytes(sendfile));
//接收客戶端接受信息的完成指令
btyes = ClientSocket.Receive(MsgBuffer);
//獲取指令字符串
string dictate = Encoding.Default.GetString(MsgBuffer, 0, btyes);
//判斷客戶端接收文件信息是否成功
if (dictate == "StrOK")
{
for (int j = 0; j < val.Length; j++)
{
/*发送文件*/
//获取发送文件路径
filename = Application.StartupPath + @"\" + val[j].ToString().ToString();
//文件实例化
FileStream fileSteam = new FileStream(filename, FileMode.Open, FileAccess.Read);
//将发送的文件包切成1024字节的文件包
while (fileSteam.Position < fileSteam.Length)
{
int readSize = fileSteam.Read(MsgBuffer, 0, MsgBuffer.Length);
if (readSize > 0)
{
//发送文件包
ClientSocket.Send(MsgBuffer, readSize, SocketFlags.None);
}
}
//接收客戶端收取發送文件完成的指令
btyes = ClientSocket.Receive(MsgBuffer);
dictate = Encoding.Default.GetString(MsgBuffer, 0, btyes);
}
ClientSocket.Shutdown(SocketShutdown.Both);
ClientSocket.Close();
}
}
}
解决方案 »
- WinForm窗口的名称放入string中,如何打开该Form?
- 控件设计问题,如何使某个属性指向特定控件类型的转换器?
- 重新发布 学生宿舍管理系统 (ftp下载);希望大家提提意见,共同学习!
- 如何让Microsoft Web Browser控件支持Active控件?
- ●求一个预览水晶报表的例子,连接的是oracle数据库,我已经没办法了.
- 关于dataset和dataAdapter的一些思考。欢迎大家讨论。
- 请教 wpf关于datagrid如何获取上一行/下一行的问题
- 如何控件DATAGRID中行的颜色
- 窗口切换问题!
- 装配件mscorlib和system里都有system名字空间,如果用using system,那编译器知道是用哪个吗?
- C# 约瑟夫系列
- 需要命名空间管理器或 XsltContext。此查询具有前缀、变量或用户定义的函数。
SocketBind方法: ClientSocket[ClientNumb].Send(Encoding.Default.GetBytes(InPort.ToString()));ClientNumb很有问题,自己想想吧
第一个用户正常
第二个用户为乱码