안녕하세요 C#의 맛을 조금 본 학생입니다. 맨날 콘솔창만 보다가 GUI를 보니까 더 재미있게 하고있습니다.
혼자 캐치마인드라는 게임을 만들려고 소켓 통신에 대해서 이것저것 찾아보면서 만들고 있었는데 !!
신기하게도 되다가 안되다가를 반복합니다..
////////////////////////////////////////
프로그램 방식
1. 클라이언트 프로그램에서 mouseMove 이벤트가 발생하면 해당 좌표를 서버에 보낸다.
2. 받은 좌표를 다른 클라이언트들에게 다 보냄
3. 좌표를 받은 클라이언트들은 패널에 대해서 invalidate를 호출해서 추가된 좌표도 다시 그려줌.
4. 위의 동작을 반복
////////////////////////////////////////
예를 들면 User 한명이 서버에 접속해있는 상태에서 접속을 해서 연결을 시도하면 접속과 동시에 퇴장이 발생합니다.
StreamWriter 에 대해서 Flush() 함수를 호출해주거나 AutoFlush 속성을 true로 변경해줬지만 동일한 현상이 발생합니다.
신기하게도 어쩔땐 다 연결이 잘 되고 어쩔땐 연결이 안되고.. 왜 이런걸까요 ..
아래는 소스코드입니다.
/////////// User //////////
// mouse move 이벤트
private void panel1_MouseMove(object sender, MouseEventArgs e)
{
if (isClicked && user.Connected)
{
sw.WriteLine(e.X + "," + e.Y);
sw.Flush();
}
}
// 스레드에 의해 실행되는 receive 함수
private void receive()
{
while (isOn == true)
{
try
{
string message = sr.ReadLine(); // sr은 streamReader
if (message != null)
{
string[] point = message.Split(',');
points.Add(new Point(Convert.ToInt32(point[0]), Convert.ToInt32(point[1])));
pnl_drawBoard.Invalidate();
}
if (user.Connected == false)
isOn = false;
}
catch
{
isOn = false;
}
}
// 자기마음대로 아래 if문으로 내려와요 ㅠㅠ
// user는 Socket
if (user.Connected)
{
ns.Close();
sr.Close();
sw.Close();
user.Close();
}
MessageBox.Show("접속 종료");
}