// Thread Netwotk Server Exam
namespace threadNetworkExam
{
public partial class Form1 : Form
{
// TCP 소켓통신 서버구현을 위해 TCP리스너 정의/초기화
private TcpListener tcpListner = null;
public Form1()
{
InitializeComponent();
}
// Thread Method
// Client 접속시 스레드가 호출하여 작업할 메소드 정의
private void AcceptClient()
{
while (true)
{
// Client 소켓통신을 위해 수신을 대기하는 TcpClient 생성
// TcpListner를 통해 생성
TcpClient tcpClient = tcpListner.AcceptTcpClient();
if (tcpClient.Connected)
{
// 접속한 Client IP정보를 얻어서 리스트박스에 추가
string str = ((IPEndPoint)tcpClient.Client.RemoteEndPoint).Address.ToString();
listBox1.Items.Add(str);
}
EchoServer echoServer = new EchoServer(tcpClient);
Thread th = new Thread(new ThreadStart(echoServer.Process));
th.IsBackground = true;
th.Start();
}
}
private void Form1_Load(object sender, EventArgs e)
{
tcpListner = new TcpListener(3000);
tcpListner.Start();
// 서버의 IP주소를 얻어서 텍스트박스에 넣는다.
IPHostEntry host = Dns.GetHostEntry(Dns.GetHostName());
for(int i = 0; i < host.AddressList.Length; i++)
{
if(host.AddressList[i].AddressFamily == AddressFamily.InterNetwork)
{
textBox1.Text = host.AddressList[i].ToString();
break;
}
}
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
tcpListner.Stop();
}
private void button1_Click(object sender, EventArgs e)
{
// 서버시작 버튼클릭시 클라이언트 접속대기 및 처리를 위한 쓰레드 생성
// Main 종료시 같이 종료되기위해 백그라운드로 설정
Thread th = new Thread(new ThreadStart(AcceptClient));
th.IsBackground = true;
th.Start();
}
}
public class EchoServer
{
TcpClient refClient;
private BinaryReader br = null;
private BinaryWriter bw = null;
int intValue;
float floatValue;
string strValue;
public EchoServer(TcpClient client)
{
refClient = client;
}
public void Process()
{
NetworkStream ns = refClient.GetStream();
try
{
br = new BinaryReader(ns);
bw = new BinaryWriter(ns);
while(true)
{
intValue = br.ReadInt32();
floatValue = br.ReadSingle();
strValue = br.ReadString();
bw.Write(intValue);
bw.Write(floatValue);
bw.Write(strValue);
}
}
catch (SocketException se)
{
br.Close();
bw.Close();
ns.Close();
ns = null;
refClient.Close();
MessageBox.Show(se.Message);
Thread.CurrentThread.Abort();
}
catch (IOException ex)
{
// 연결이 끊어져 읽을 수 없을떄.
br.Close();
bw.Close();
ns.Close();
ns = null;
refClient.Close();
MessageBox.Show(ex.Message);
Thread.CurrentThread.Abort();
}
}
}
}