일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 졸업 작품 소재
- 캡슐화
- 안드로이드 앱 개발
- 산책하기 좋은 곳
- 표준 입출력
- 충남 천안
- 소켓 통신
- c#
- 파이썬
- 클래스 다이어그램
- 원격 제어 프로그램
- 실습으로 다지는 c#
- c언어
- 언제나휴일
- 알고리즘
- 동영상
- 동영상 강의
- 실습
- 강의
- Windows Forms
- C++
- 네트워크 프로그래밍
- 언제나 휴일
- 졸업 작품
- 프로젝트
- 무료 동영상 강의
- 소스 코드
- 추천
- 유튜브 동영상 강의
- 표준 라이브러리 함수
Archives
- Today
- Total
프로그래밍 언어 및 기술 [언제나휴일]
P2P 메신저 - 파일 전송 클라이언트 구현 [C#] 본문
1. 유튜브 동영상 강의
안녕하세요. 언제나 휴일에 언휴예요.
이번 강의는 파일 전송 클라이언트를 구현하는 실습입니다.
파일 전송 및 수신에 필요한 서버와 클라이언트는 P2P 메신저를 구현할 때 필요한 요소 기술입니다.
먼저 익히고 넘어갈게요.
다음글 P2P 메신저 - 파일 전송 클라이언트 구현 [C#] 도 같이 학습하세요.
2. 파일 데이터 전송 이벤트 인자 및 대리자 소스 코드
using System;
namespace 파일_전송_클라이언트
{
public delegate void SendFileDataEventHandler(object sender, SendFileDataEventArgs e);
public class SendFileDataEventArgs:EventArgs
{
public string FileName
{
get;
private set;
}
public long Remain
{
get;
private set;
}
public SendFileDataEventArgs(string fname, long remain)
{
FileName = fname;
Remain = remain;
}
}
}
3. 파일 전송 클라이언트 클래스 소스 코드
/* https://ehpub.co.kr
* 파일 전송 클라이언트
*/
using System;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Security.Cryptography;
namespace 파일_전송_클라이언트
{
public class FileSendClient
{
const int MAX_PACK_SIZE = 1024;
public event SendFileDataEventHandler SendFileDataEventHandler = null;
public string IPStr
{
get;
private set;
}
public int Port
{
get;
private set;
}
public FileSendClient(string ip, int port)
{
IPStr = ip;
Port = port;
}
delegate void SendDele(string fname);
public void SendAsync(string fname)
{
SendDele dele = Send;
dele.BeginInvoke(fname, null, null);
}
public void Send(string fname)
{
if(File.Exists(fname)==false)
{
return;
}
Socket sock = new Socket(AddressFamily.InterNetwork,
SocketType.Stream, ProtocolType.Tcp);
IPEndPoint iep = new IPEndPoint(IPAddress.Parse(IPStr), Port);
sock.Connect(iep);
byte[] packet = new byte[MAX_PACK_SIZE];
MemoryStream ms = new MemoryStream(packet);
BinaryWriter bw = new BinaryWriter(ms);
bw.Write(fname);
bw.Close();
ms.Close();
sock.Send(packet);
FileStream fs = File.OpenRead(fname);
ms = new MemoryStream(packet);
bw = new BinaryWriter(ms);
bw.Write(fs.Length);
sock.Send(packet, 0, 8, SocketFlags.None);
ms.Close();
bw.Close();
long remain = fs.Length;
int sl;
while(remain>=MAX_PACK_SIZE)
{
fs.Read(packet, 0, MAX_PACK_SIZE);
sl = sock.Send(packet);
while(sl<MAX_PACK_SIZE)
{
sl += sock.Send(packet, sl, MAX_PACK_SIZE - sl, SocketFlags.None);
}
if(SendFileDataEventHandler != null)
{
SendFileDataEventHandler(this, new SendFileDataEventArgs(fname, remain));
}
remain -= MAX_PACK_SIZE;
}
fs.Read(packet, 0, (int)remain);
sl = sock.Send(packet);
while (sl < remain)
{
sl += sock.Send(packet, sl, (int)remain - sl, SocketFlags.None);
}
remain = 0;
if (SendFileDataEventHandler != null)
{
SendFileDataEventHandler(this, new SendFileDataEventArgs(fname, remain));
}
fs.Close();
sock.Close();
}
}
}
4. Program.cs 소스 코드
/* https://ehpub.co.kr
* 파일 전송 클라이언트
*/
using System;
namespace 파일_전송_클라이언트
{
class Program
{
static void Main(string[] args)
{
Console.Write("서버 IP:");
string ip = Console.ReadLine();
int port = 10340;
Console.Write("포트 번호:{0}",port);
FileSendClient fsc = new FileSendClient(ip, port);
fsc.SendFileDataEventHandler += Fsc_SendFileDataEventHandler;
Console.Write("전송할 파일명:");
string fname = Console.ReadLine();
fsc.SendAsync(fname);
Console.ReadKey();
}
private static void Fsc_SendFileDataEventHandler(object sender, SendFileDataEventArgs e)
{
Console.WriteLine("{0}파일 {1}bytes 남았음.", e.FileName, e.Remain);
}
}
}
언제나휴일 여행 및 산책
'C# > 네트워크 프로그래밍 C#' 카테고리의 다른 글
P2P 메신저 – 인증 서비스 구현 및 마무리[C#] (0) | 2024.01.09 |
---|---|
.NET 리모팅 [C#] (0) | 2024.01.09 |
P2P 메신저 – 파일 송수신 기능 구현 [C#] (0) | 2024.01.08 |
P2P 메신저 - 파일 수신 서버 구현 [C#] (0) | 2024.01.07 |
P2P 메신저 – 숏 메시지 송수신 예광탄 구현하기 [C#] (1) | 2024.01.06 |
TCP 통신 – Echo 서버 클래스 구현, 이벤트 정의 및 콜백 처리 [C#] (1) | 2024.01.05 |
TCP 통신 – echo 서버 및 클라이언트 구현 [네트워크 프로그래밍 C#] (2) | 2024.01.04 |