我把代碼貼出來,麻煩各位大神幫我看看問題出在哪里。
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("完成訊息發送...");
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/79715.html
標籤:網絡通信
上一篇:有沒有懂電腦的大佬鴨?
