프로그램 설명
패킷을 이용한 데이타 전송 예제입니다. 로그인과 회원가입을 예로 들어 설명 합니다.
전송할 데이타를 바로 네트워크 스트림에 쓰지 않고 전송 패킷에 저장을 한 후, 일괄 전송하는 방법입니다.
1. 3개의 프로젝트를 먼저 만듭니다.
MyLogin_Packet : 클래스 라이브러리 타입, dll class 파일, 패킷 정의용
MyLoginClient1_WindowsForm : 윈도우즈 폼 타입. 클라이언트 폼. exe 파일
MyLoginServer1_WindowsForm : 윈도우즈 폼 타입. 서버 폼. exe 파일
2. MyLogin_Packet : 클래스 라이브러리 타입, dll class 파일, 패킷 정의용
기본 패킷 정의
namespace MyLogin_Packet { public enum PacketType :int { Login = 0, Login_RESULT, Member_REGISTER, Member_REGISTER_RESULT } [Serializable] public class Packet { public int packet_Type; public int packet_Length; public Packet() { this.packet_Type = 0; this.packet_Length = 0; } public static byte[] Serialize(Object data) { try { MemoryStream ms = new MemoryStream(1024 * 4); // packet size will be maximum 4k BinaryFormatter bf = new BinaryFormatter(); bf.Serialize(ms, data); return ms.ToArray(); } catch { return null; } } public static Object Deserialize(byte[] data) { try { MemoryStream ms = new MemoryStream(1024 * 4); ms.Write(data, 0, data.Length); ms.Position = 0; BinaryFormatter bf = new BinaryFormatter(); Object obj = bf.Deserialize(ms); ms.Close(); return obj; } catch { return null; } } } }
파생된 패킷 정의(로그인, 회원가입)
namespace MyLogin_Packet { [Serializable] public class Login : Packet { public string id_str { get; set; } public string pw_str { get; set; } } }
namespace MyLogin_Packet { [Serializable] public class MemberRegister : Packet { public string id_str { get; set; } public string pw_str { get; set; } public string nickname_str { get; set; } } }
3. MyLoginClient1_WindowsForm : 윈도우즈 폼 타입. 클라이언트 폼. exe 파일
로그인 버튼 클릭시 전송할 데이타 Login Packet class 로 Serialize 시킴. 받은 데이타는 LoginResult Packet class 로 Deserialize 시킴.
private void btnSend_Click(object sender, EventArgs e) { try { byte[] buffer = new byte[1024 * 4]; // 1. connect to server TcpClient client = new TcpClient("192.168.0.11", 7778); NetworkStream stream = client.GetStream(); // 2. send the packet Login login = new Login(); login.packet_Type = (int)PacketType.Login; login.id_str = textBox1.Text.Trim(); login.pw_str = textBox2.Text.Trim(); Packet.Serialize(login).CopyTo(buffer, 0); stream.Write(buffer, 0, buffer.Length); // 3. receive the packet Array.Clear(buffer, 0, buffer.Length); int bytesRead = stream.Read(buffer, 0, buffer.Length); LoginResult loginResult = (LoginResult)Packet.Deserialize(buffer); if (loginResult.result) { MessageBox.Show(loginResult.reason, "클라이언트 확인", MessageBoxButtons.OK, MessageBoxIcon.Error); } else { MessageBox.Show(loginResult.reason, "클라이언트 오류", MessageBoxButtons.OK, MessageBoxIcon.Error); } // 4. close the socket stream.Close(); client.Close(); } catch(Exception ex) { MessageBox.Show(ex.Message, "오류", MessageBoxButtons.OK, MessageBoxIcon.Error); } }
4. MyLoginServer1_WindowsForm : 윈도우즈 폼 타입. 서버 폼. exe 파일
stream 으로 데이타를 받은 후, PacketType class 로 deserialize 시킴으로, 받은 패킷이 어떤 기능을 하는 패킷인지 구분하는 로직
Packet packet = (Packet)Packet.Deserialize(buffer); if (packet == null) return; switch ((int)packet.packet_Type) { case (int)PacketType.Login: { // 로그인 로직 추가 } break; case (int)PacketType.Member_REGISTER: { // 회원가입 로직 추가 } break; }
Login packet class 로 deserialize 시킴
// 받은 패킷을 Login class 로 deserialize 시킴 Login login = (Login)Packet.Deserialize(buffer); setLog(string.Format("ID : {0}, PWD : {1}", login.id_str, login.pw_str)); // 화면에 display 시킴
Loginresult packet class 로 serialize 시켜서 클라이언트에게 전송함
// 전송할 패킷을 LoginResult class 로 serialize 시킴 LoginResult loginResult = new LoginResult(); loginResult.packet_Type = (int)PacketType.Login_RESULT; if (random.Next(1, 100) % 2 == 0) // 짝수라면.... 로그인 성공 { loginResult.result = true; loginResult.reason = "정상적으로 로그인이 되었습니다."; } else // 홀수라면.... 로그인 실패 { loginResult.result = false; loginResult.reason = "아이디와 비밀번호를 확인 하시기 바랍니다."; } Array.Clear(buffer, 0, buffer.Length); Packet.Serialize(loginResult).CopyTo(buffer, 0); stream.Write(buffer, 0, buffer.Length);
실행 화면
소스 파일 :
MyLoginClient1_WindowsForm.zip MyLoginServer1_WindowsForm.zip
'C# with TCP/IP' 카테고리의 다른 글
[Program C#] File 전송 (3) | 2015.05.30 |
---|---|
[Program C#] Check all client connection. (0) | 2015.05.20 |
[Program C#]이미지 파일과 텍스트 전송 - 2 (1) | 2015.04.02 |
[Program C#]이미지 파일과 텍스트 전송 - 1 (0) | 2015.03.26 |
[Program C#] SslStream 을 이용한 통신 방법 (1) | 2015.03.20 |