C# 채팅 프로그램(Server 확장)
채팅 서버와 클라이언트를 같이 가지고 있는 프로그램이다.
클라이언트와 서버에서 통신을 하기위해서 해당 IP주소와 포트번호를 일치 시켜주어야 한다.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
using System.IO;
using System.Threading;
namespace ChatServer
{
public partial class MainForm : Form
{
TcpListener Server; // 소켓 서버를 구현하기 위해서
TcpClient Client; // 서버+클라이언트기능을 하기위해서
StreamReader Reader; //스트림 값을 읽어오기 위해서
StreamWriter Writer; //스트림 값을 쓰기위해서
NetworkStream stream; //네트워크스트림 연결을 위해서
Thread ReceiveThread; //멀티쓰레드를 위해서
bool Connected; // 연결상태확인
private delegate void AddTextDelegate(string strText); //Cross-Thread 호출을 실행하기 위해 사용함.
public MainForm()
{
InitializeComponent();
}
private void MainForm_Load(object sender, EventArgs e)
{
Thread ListenThread = new Thread(new ThreadStart(Listen)); //서버를 시작함.
ListenThread.Start();
}
private void SendBtn_Click(object sender, EventArgs e)
{
txtMessage.AppendText("이쪽 " + txtSend.Text + "\r\n"); // 이쪽 : 블라블라~
Writer.WriteLine(txtSend.Text); //작성한 글을 읽어서 씀
Writer.Flush(); //전송하고 비움.
txtSend.Clear(); // 글을 작성하는 부분 클리어
}
private void MainForm_formClosing(object sender, FormClosedEventArgs e) //종료버튼을 눌렀을때
{
Connected = false;
if (Reader != null)
Reader.Close();
if (Writer != null)
Writer.Close();
if (Server != null)
Server.Stop();
if (Client != null)
Client.Close();
if (ReceiveThread != null)
ReceiveThread.Abort();
}
private void Listen()
{
AddTextDelegate AddText = new AddTextDelegate(txtMessage.AppendText); // 메소드를 등록
try {
IPAddress addr = new IPAddress(0); //ip주소
int port = 8080; //포트
Server = new TcpListener(addr, port); //서버에 ip주소와 포트가져와서 서버실행
Server.Start(); // 서버시작
Invoke(AddText, "서버가 시작되었습니다..." + "\r\n");
Client = Server.AcceptTcpClient(); //Client 수락
Connected = true; // 연결됬음을 알리는..
Invoke(AddText, "클라이언트와 연결되었습니다." + "\r\n");
stream = Client.GetStream(); // 스트림을 통해서 Client값을 가져오기
Reader = new StreamReader(stream); // 스트림값을 읽어드리기
Writer = new StreamWriter(stream); // 스트림값을 쓰기
ReceiveThread = new Thread(new ThreadStart(Receive)); //클래스를 통해서 값을 받는다.
ReceiveThread.Start(); // 값을 받는 스레드 실행
}
catch(Exception e)
{
}
}
private void Receive()
{
AddTextDelegate AddText = new AddTextDelegate(txtMessage.AppendText); // 메소드 등록
try
{
while (Connected)
{
Thread.Sleep(1); //Windows 시스템은 거의 정확한 sleep 시간을 보장한다. 즉, 1ms에 거의 유사한 sleep 시간을 제공한다.
if (stream.CanRead) // 스트림을 읽을 수 있다면...
{
string tempStr = Reader.ReadLine(); // 값을 일어와서
if (tempStr.Length > 0) // 문자 길이가 0이 아니라면
{
Invoke(AddText, "저쪽: " + tempStr + "\r\n"); // 출력
Panel_1.Text = "메시지도착시간: " + DateTime.Now; // 메시지도착시간 출력
}
}
}
}
catch (Exception e)
{
}
}
}
}
'1. IT Story > Development' 카테고리의 다른 글
이진찾기 (0) | 2012.03.28 |
---|---|
피보나치 (0) | 2012.03.28 |
윈도우폰 게임개발 기초(WindowPhoneGame) (0) | 2012.03.07 |
C# 채팅 프로그램(Client 확장) (0) | 2012.03.07 |
C# 채팅 프로그램(Client) (0) | 2012.03.07 |
선택정렬응용 (0) | 2012.03.07 |
이름정렬 (0) | 2012.03.07 |
링크드리스트를 이용한 학생관리Pro (0) | 2012.03.07 |