基于tcp的socket异步通信第二次服务端发送文件到客户端socket显示未连接

qq_24062975 2019-05-15 09:38:56
我把代码贴出来,麻烦各位大神帮我看看问题出在哪里。
    private void OnStartServer()
{
try
{
//端口号
IPEndPoint endPoint = new IPEndPoint(IPAddress.Any, 50223);
//监听
socketWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
socketWatch.Bind(endPoint);
//一次性最多可监听500个客户端
socketWatch.Listen(500);
Console.WriteLine("服务端开始监听......");
//创建用于和客户端通信的socket,第一个参数为委托类型
socketWatch.BeginAccept(new AsyncCallback(AcceptInfo), socketWatch);
}
catch (Exception ex)
{
Console.WriteLine(ex);
}
}
//关闭服务
public void OnStop()
{
try
{
socketWatch.Shutdown(SocketShutdown.Both);
socketWatch.Close();
}
catch (Exception ex)
{
Console.WriteLine(ex);
}
}
/// <summary>
/// 等待客户端的连接,并且创建与之通信用的Socket
/// </summary>
/// <param name="aResult"></param>
private void AcceptInfo(IAsyncResult aResult)
{
Socket socket = aResult.AsyncState as Socket;
//创建与客户端通信的socket
Socket client = socket.EndAccept(aResult);
socketSend = client;
//获取远程主机的终结点(ip+端口)
string clientIp = ((System.Net.IPEndPoint)client.RemoteEndPoint).Address.ToString();
string clientPort = ((System.Net.IPEndPoint)client.RemoteEndPoint).Port.ToString();
Console.WriteLine("远程主机:" + clientIp + ":" + clientPort + "连接成功");
try
{
//接收客户端消息
client.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveAndSendMessage), client);
}
catch (Exception ex)
{
Console.WriteLine(ex);
}
//准备接受下一个客户端请求
socket.BeginAccept(new AsyncCallback(AcceptInfo), socket);
}

private void ReceiveAndSendMessage(IAsyncResult aResult)
{
//接收客户端发来的消息
Socket socket = aResult.AsyncState as Socket;
try
{
//返回接收的数据的长度
int strLength = 0;

strLength = socket.EndReceive(aResult);

if (strLength == 0)
{
socket.Shutdown(SocketShutdown.Both);
socket.Close();
return;
}
//将字节数组转换成字符串
string strText = Encoding.UTF8.GetString(buffer, 0, strLength);
Console.WriteLine("接收到的字符串:" + strText);
//服务端给客户端发送图像,这里觉得应该优化下(在不开启线程的情况下测试下)
if (strText == "2")
{
//Thread sendThread = new Thread(SendFileToClient);
//sendThread.IsBackground = true;
//sendThread.Start(socket);
SendFileToClient(socket);
}
}
catch (Exception ex)
{
Console.WriteLine(ex);
}
try
{
//接收客户端消息
socket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveAndSendMessage), socket);
}
catch
{
}
}
/// <summary>
/// 发送图像给客户端
/// </summary>
/// <param name="obj"></param>
private void SendFileToClient(object obj)
{
Socket socket = obj as Socket;
if (socket.Connected)
{
socket.BeginSend(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(SendFile), socket);
}
else
{
socket.Shutdown(SocketShutdown.Both);
socket.Close();
}
}
/// <summary>
/// 发送
/// </summary>
/// <param name="aResult"></param>
private void SendFile(IAsyncResult aResult)
{
Socket socket = aResult.AsyncState as Socket;
//发送图像文件的路径
//string filePath = @"D:\imagesTest";
string filePath = @"D:\image";
List<string> fileList = new List<string>();
DirectoryInfo directoryInfo = new DirectoryInfo(filePath);
FileStream fs = null;
using (NetworkStream ns = new NetworkStream(socket, FileAccess.ReadWrite, false))
{

foreach (FileInfo fileName in directoryInfo.GetFiles())
{
try
{
string imagePath = null;
imagePath = filePath + "\\" + fileName.ToString();
fs = new FileStream(imagePath as string, FileMode.OpenOrCreate, FileAccess.Read, FileShare.ReadWrite);
//ns = new NetworkStream(socket, FileAccess.ReadWrite, false);
if (!File.Exists(imagePath.ToString()))
return;
byte[] fileBytes = null;
Int64 fileTotalLen = fs.Length + 132;
if (fileTotalLen <= maxBufferSize)//小文件发送
{
fileBytes = new byte[fileTotalLen];
Array.Copy(BitConverter.GetBytes(fileBytes.Length - 132), fileBytes, 4);
byte[] fileNameBytes = System.Text.Encoding.Default.GetBytes(fileName.ToString());
fileNameBytes.CopyTo(fileBytes, 4);

using (fs)
{
//将图片byte信息读入byte数组中
fs.Read(fileBytes, 132, fileBytes.Length - 132);
fs.Close();
}
IAsyncResult result = ns.BeginWrite(fileBytes, 0, fileBytes.Length, null, null);
ns.EndWrite(result);
}

ns.Flush();

}
ns.Flush();
}

}
catch (Exception ex)
{


Console.WriteLine(ex);
}


fs.Close();
}
//ns.Close();

}
int length = socket.EndSend(aResult);
Console.WriteLine("完成消息发送...");

}
}
...全文
17 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

4,356

社区成员

发帖
与我相关
我的任务
社区描述
通信技术相关讨论
社区管理员
  • 网络通信
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧