|
목 차 |
1. Program 목적
2. Program 개발배경
3. 배경지식
4. 주요 코드
5. 문제점과 소감
1. Program 목적 및 개발 배경
소켓통신과 WPF의 미디어플레이어를 사용해 미디어를 브로드 캐스팅
하며 동시에 감상한다.
2. 배경 지식
WPF에서 미디어 엘리먼트라는 클래스를 이해하고 사용할 수 있어야 하고 또 비동기 소켓통신을 사용하여 메시지를 읽고 쓰는 방법과 FTP의 기본개념을 숙지해야 한다.
WPF(Windows Presentation Foundation) WPF(Windows Presentation Foundation)는 시각적으로 뛰어난 사용자 환경에서 Windows 클라이언트 응용 프로그램을 만들 수 있는 차세대 프레젠테이션 시스템입니다. WPF를 사용하면 광범위한 독립 실행형 응용 프로그램과 브라우저에서 호스팅되는 응용 프로그램을 모두 만들 수 있습니다. |
FTP [file transfer protocol] 인터넷을 통해 한 컴퓨터에서 다른 컴퓨터로 파일을 전송할 수 있도록 하는 방법과, 그런 프로그램을 모두 일컫는 말이다. 인터넷을 통하여 어떤 한 컴퓨터에서 다른 컴퓨터로 파일을 송수신할 수 있도록 지원하는 방법과 그런 프로그램을 통칭하기도 한다. FTP를 이용하면 자신이 원하는 프로그램이나 각종 데이터를 무료나 저렴한 가격에 살 수 있다. 또 용량이 큰 파일도 빠르게 송수신할 수 있다. 파일을 송수신할 때에는 정당한 자격, 즉 원격 호스트 컴퓨터를 이용할 수 있는 사용자 ID와 패스워드(password)가 있어야 원하는 원격 호스트 컴퓨터에 접속할 수 있다. |
3. 프로그램 이해
- 실행
미디어 엘리먼트와 채팅 컨트롤들을 구성한다.
소켓통신을 사용하여 채팅 메시지와 동영상 이벤트 보내 주고 서버에서 메시지 헤더를 확인하여 회원한테 뿌려준다.
4. 주요코드소개
1. FTP서버에서 미디어를 불러와 미디어 소스로 설정한다.
media = string.Format("ftp://192.168.34.59/" + e_name + "/" + e_name + ".wmv");
mediaElement1.Source = new Uri(media);
2. 타이머를 사용하여 주기적으로 미디어의 포지션을 서버에 보내준다.
void timer_Tick(object sender, EventArgs e)
{
{
string r_num = rnum.Content.ToString();
int msghead = 13;//재생시간정보
int hour = mediaElement1.Position.Hours;
int min = mediaElement1.Position.Minutes;
int sec = mediaElement1.Position.Seconds;
byte[] body = new byte[1024];
MemoryStream ms = new MemoryStream(body);
BinaryWriter bw = new BinaryWriter(ms);
bw.Write(int.Parse(r_num)); //방번호
bw.Write(msghead);
bw.Write(hour); //미디어시간
bw.Write(min); //분
bw.Write(sec); //초
byte[] pack = new byte[4 + ms.Position];
MemoryStream ms2 = new MemoryStream(pack);
BinaryWriter bw2 = new BinaryWriter(ms2);
bw2.Write((int)ms.Position);
bw2.Write(body, 0, (int)ms.Position);
sock.Send(pack);
ms.Close();
ms2.Close();
}
}
3. delegate를 사용하여 스레드충돌을 방지하면서 채팅 메시지를 받는다.
delegate void ChattingMsgDel(byte[] body);
private void ChattingMsg(byte[] body)
{
if (this.Dispatcher.Thread != Thread.CurrentThread)
{
ChattingMsgDel m = new ChattingMsgDel(ChattingMsg);
object[] objs = new object[1];
objs[0] = body;
this.Dispatcher.BeginInvoke(m, objs);
}
else
{
MemoryStream ms = new MemoryStream(body);
BinaryReader br = new BinaryReader(ms);
int r_num = br.ReadInt32();
int msghead = br.ReadInt32();
string id = br.ReadString();
string msg = br.ReadString();
if (r_num == room_num)
{
listBox2.Items.Add("[" + id.ToString() + "] : " + msg.ToString());
}
}
}
5. 메시지 바디부분의 메시지 번호를 read해서 각함수로 전달한다.
delegate void ProblemMsgDel(byte[] body);
private void ProblemMsg(byte[] body)
{
if (this.Dispatcher.Thread != Thread.CurrentThread)
{
ProblemMsgDel m = new ProblemMsgDel(ProblemMsg);
object[] objs = new object[1];
objs[0] = body;
this.Dispatcher.BeginInvoke(m, objs);
}
else
{
{
MemoryStream ms = new MemoryStream(body);
BinaryReader br = new BinaryReader(ms);
int r_num = br.ReadInt32();
int msghead = br.ReadInt32();
string pro = br.ReadString();
string pro1 = br.ReadString();
string pro2 = br.ReadString();
string pro3 = br.ReadString();
string pro4 = br.ReadString();
string answer = br.ReadString();
if (r_num == room_num)
{
pr = new Problem(pro, pro1, pro2, pro3, pro4, answer);
grid1.Children.Add(pr);
pr.NoanswerEventHandler += new Problem.NoAnswer(pr_NoanswerEventHandler);
pr.StopProblemEventHandler += new Problem.StopProblem(pr_StopProblemEventHandler);
}
}
}
}
6. 서버에서 주기적으로 오는 미디어플레이정보를 담는 클래스를 만들어 저장한다.
class PlayTime
{
public int RNUM
{
get;
set;
}
public int HOUR
{
get;
set;
}
public int MIN
{
get;
set;
}
public int SEC
{
get;
set;
}
public int STATE
{
get;
set;
}
}
private void SetPlayTime(byte[] body)
{
MemoryStream ms = new MemoryStream(body);
BinaryReader br = new BinaryReader(ms);
int r_num = br.ReadInt32();
int msghead = br.ReadInt32();
int hour = br.ReadInt32();
int min = br.ReadInt32();
int sec = br.ReadInt32();
pt.RNUM = r_num;
pt.HOUR = hour;
pt.MIN = min;
pt.SEC = sec;
Console.WriteLine(min+"min"+sec+"sec");
ms.Close();
}
5. 문제점 과 소감
테스팅시 간혹 발생하는 문제점으로 플레이 도중 접속했을 때 서버로 부터 미디어 포지션을 받아오는데 디버깅하여 포지션 세팅부분을 보았을땐는 포지션을 정확히 받아와 세팅하지만 처음부터 재생하는 문제점이 있었다.
Windows Server 2008 OS를 사용하면 서버에서 미디어를 부드럽게 받아올수 있다고 한다. 하지만 지금 개발환경에서 XP로 FTP를 사용하였는데 미디어 파일을 전부 다운받은뒤 실행하는 모습을 보여 버벅거리는 모습이 있다.
|