My_Client
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Threading; // 추가
using System.Net; // 추가
using System.Net.Sockets; // 추가
using System.IO; // 추가
namespace My_Client
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
StreamReader streamReader; // 데이타 읽기 위한 스트림리더
StreamWriter streamWriter; // 데이타 쓰기 위한 스트림라이터
private void button1_Click(object sender, EventArgs e) // '연결하기' 버튼이 클릭되면
{
Thread thread1 = new Thread(connect); // Thread 객채 생성, Form과는 별도 쓰레드에서 connect 함수가 실행됨.
thread1.IsBackground = true; // Form이 종료되면 thread1도 종료.
thread1.Start(); // thread1 시작.
}
private void connect() // thread1에 연결된 함수. 메인폼과는 별도로 동작한다.
{
TcpClient tcpClient1 = new TcpClient(); // TcpClient 객체 생성
IPEndPoint ipEnd = new IPEndPoint(IPAddress.Parse(textBox1.Text), int.Parse(textBox2.Text)); // IP주소와 Port번호를 할당
tcpClient1.Connect(ipEnd); // 서버에 연결 요청
writeRichTextbox("서버 연결됨...");
streamReader = new StreamReader(tcpClient1.GetStream()); // 읽기 스트림 연결
streamWriter = new StreamWriter(tcpClient1.GetStream()); // 쓰기 스트림 연결
streamWriter.AutoFlush = true; // 쓰기 버퍼 자동으로 뭔가 처리..
while (tcpClient1.Connected) // 클라이언트가 연결되어 있는 동안
{
string receiveData1 = streamReader.ReadLine(); // 수신 데이타를 읽어서 receiveData1 변수에 저장
writeRichTextbox(receiveData1); // 데이타를 수신창에 쓰기
}
}
private void writeRichTextbox(string data) // richTextbox1 에 쓰기 함수
{
richTextBox1.Invoke((MethodInvoker)delegate { richTextBox1.AppendText(data + "\r\n"); }); // 데이타를 수신창에 표시, 반드시 invoke 사용. 충돌피함.
richTextBox1.Invoke((MethodInvoker)delegate { richTextBox1.ScrollToCaret(); }); // 스크롤을 젤 밑으로.
}
private void button2_Click(object sender, EventArgs e) // '보내기' 버튼이 클릭되면
{
string sendData1 = textBox3.Text; // testBox3 의 내용을 sendData1 변수에 저장
streamWriter.WriteLine(sendData1); // 스트림라이터를 통해 데이타를 전송
}
}
}
Form1.Designer
namespace My_Client
{
partial class Form1
{
/// <summary>
/// 필수 디자이너 변수입니다.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// 사용 중인 모든 리소스를 정리합니다.
/// </summary>
/// <param name="disposing">관리되는 리소스를 삭제해야 하면 true이고, 그렇지 않으면 false입니다.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form 디자이너에서 생성한 코드
/// <summary>
/// 디자이너 지원에 필요한 메서드입니다.
/// 이 메서드의 내용을 코드 편집기로 수정하지 마세요.
/// </summary>
private void InitializeComponent()
{
this.label1 = new System.Windows.Forms.Label();
this.label2 = new System.Windows.Forms.Label();
this.textBox1 = new System.Windows.Forms.TextBox();
this.textBox2 = new System.Windows.Forms.TextBox();
this.textBox3 = new System.Windows.Forms.TextBox();
this.richTextBox1 = new System.Windows.Forms.RichTextBox();
this.button1 = new System.Windows.Forms.Button();
this.button2 = new System.Windows.Forms.Button();
this.SuspendLayout();
//
// label1
//
this.label1.AutoSize = true;
this.label1.Location = new System.Drawing.Point(13, 13);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(44, 12);
this.label1.TabIndex = 0;
this.label1.Text = "IP 주소";
//
// label2
//
this.label2.AutoSize = true;
this.label2.Location = new System.Drawing.Point(175, 14);
this.label2.Name = "label2";
this.label2.Size = new System.Drawing.Size(27, 12);
this.label2.TabIndex = 1;
this.label2.Text = "Port";
//
// textBox1
//
this.textBox1.Location = new System.Drawing.Point(12, 29);
this.textBox1.Name = "textBox1";
this.textBox1.Size = new System.Drawing.Size(159, 21);
this.textBox1.TabIndex = 2;
//
// textBox2
//
this.textBox2.Location = new System.Drawing.Point(177, 29);
this.textBox2.Name = "textBox2";
this.textBox2.Size = new System.Drawing.Size(78, 21);
this.textBox2.TabIndex = 3;
//
// textBox3
//
this.textBox3.Location = new System.Drawing.Point(12, 221);
this.textBox3.Name = "textBox3";
this.textBox3.Size = new System.Drawing.Size(311, 21);
this.textBox3.TabIndex = 4;
//
// richTextBox1
//
this.richTextBox1.Location = new System.Drawing.Point(12, 56);
this.richTextBox1.Name = "richTextBox1";
this.richTextBox1.Size = new System.Drawing.Size(392, 159);
this.richTextBox1.TabIndex = 5;
this.richTextBox1.Text = "";
//
// button1
//
this.button1.Location = new System.Drawing.Point(271, 13);
this.button1.Name = "button1";
this.button1.Size = new System.Drawing.Size(133, 37);
this.button1.TabIndex = 6;
this.button1.Text = "연결하기";
this.button1.UseVisualStyleBackColor = true;
this.button1.Click += new System.EventHandler(this.button1_Click);
//
// button2
//
this.button2.Location = new System.Drawing.Point(329, 221);
this.button2.Name = "button2";
this.button2.Size = new System.Drawing.Size(75, 23);
this.button2.TabIndex = 8;
this.button2.Text = "보내기";
this.button2.UseVisualStyleBackColor = true;
this.button2.Click += new System.EventHandler(this.button2_Click);
//
// Form1
//
this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 12F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(419, 256);
this.Controls.Add(this.button2);
this.Controls.Add(this.button1);
this.Controls.Add(this.richTextBox1);
this.Controls.Add(this.textBox3);
this.Controls.Add(this.textBox2);
this.Controls.Add(this.textBox1);
this.Controls.Add(this.label2);
this.Controls.Add(this.label1);
this.Name = "Form1";
this.Text = "클라이언트 Form";
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.Label label1;
private System.Windows.Forms.Label label2;
private System.Windows.Forms.TextBox textBox1;
private System.Windows.Forms.TextBox textBox2;
private System.Windows.Forms.TextBox textBox3;
private System.Windows.Forms.RichTextBox richTextBox1;
private System.Windows.Forms.Button button1;
private System.Windows.Forms.Button button2;
}
}
Program
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace My_Client
{
static class Program
{
/// <summary>
/// 해당 애플리케이션의 주 진입점입니다.
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
}
}
My_Server
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Threading; // 추가
using System.Net; // 추가
using System.Net.Sockets; // 추가
using System.IO; // 추가
namespace My_Server
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
StreamReader streamReader1; // 데이타 읽기 위한 스트림리더
StreamWriter streamWriter1; // 데이타 쓰기 위한 스트림라이터
private void button1_Click(object sender, EventArgs e) // '연결하기' 버튼이 클릭되면
{
Thread thread1 = new Thread(connect); // Thread 객채 생성, Form과는 별도 쓰레드에서 connect 함수가 실행됨.
thread1.IsBackground = true; // Form이 종료되면 thread1도 종료.
thread1.Start(); // thread1 시작.
}
private void connect() // thread1에 연결된 함수. 메인폼과는 별도로 동작한다.
{
TcpListener tcpListener1 = new TcpListener(IPAddress.Parse(textBox1.Text), int.Parse(textBox2.Text)); // 서버 객체 생성 및 IP주소와 Port번호를 할당
tcpListener1.Start(); // 서버 시작
writeRichTextbox("서버 준비...클라이언트 기다리는 중...");
TcpClient tcpClient1 = tcpListener1.AcceptTcpClient(); // 클라이언트 접속 확인
writeRichTextbox("클라이언트 연결됨...");
streamReader1 = new StreamReader(tcpClient1.GetStream()); // 읽기 스트림 연결
streamWriter1 = new StreamWriter(tcpClient1.GetStream()); // 쓰기 스트림 연결
streamWriter1.AutoFlush = true; // 쓰기 버퍼 자동으로 뭔가 처리..
while (tcpClient1.Connected) // 클라이언트가 연결되어 있는 동안
{
string receiveData1 = streamReader1.ReadLine(); // 수신 데이타를 읽어서 receiveData1 변수에 저장
writeRichTextbox(receiveData1); // 데이타를 수신창에 쓰기
}
}
private void writeRichTextbox(string str) // richTextbox1 에 쓰기 함수
{
richTextBox1.Invoke((MethodInvoker)delegate { richTextBox1.AppendText(str + "\r\n"); }); // 데이타를 수신창에 표시, 반드시 invoke 사용. 충돌피함.
richTextBox1.Invoke((MethodInvoker)delegate { richTextBox1.ScrollToCaret(); }); // 스크롤을 젤 밑으로.
}
private void button2_Click(object sender, EventArgs e) // '보내기' 버튼이 클릭되면
{
string sendData1 = textBox3.Text; // testBox3 의 내용을 sendData1 변수에 저장
streamWriter1.WriteLine(sendData1); // 스트림라이터를 통해 데이타를 전송
}
}
}
Form1.Designer
namespace My_Server
{
partial class Form1
{
/// <summary>
/// 필수 디자이너 변수입니다.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// 사용 중인 모든 리소스를 정리합니다.
/// </summary>
/// <param name="disposing">관리되는 리소스를 삭제해야 하면 true이고, 그렇지 않으면 false입니다.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form 디자이너에서 생성한 코드
/// <summary>
/// 디자이너 지원에 필요한 메서드입니다.
/// 이 메서드의 내용을 코드 편집기로 수정하지 마세요.
/// </summary>
private void InitializeComponent()
{
this.textBox3 = new System.Windows.Forms.TextBox();
this.richTextBox1 = new System.Windows.Forms.RichTextBox();
this.textBox2 = new System.Windows.Forms.TextBox();
this.textBox1 = new System.Windows.Forms.TextBox();
this.label2 = new System.Windows.Forms.Label();
this.label1 = new System.Windows.Forms.Label();
this.button2 = new System.Windows.Forms.Button();
this.button1 = new System.Windows.Forms.Button();
this.SuspendLayout();
//
// textBox3
//
this.textBox3.Location = new System.Drawing.Point(7, 233);
this.textBox3.Name = "textBox3";
this.textBox3.Size = new System.Drawing.Size(296, 21);
this.textBox3.TabIndex = 17;
//
// richTextBox1
//
this.richTextBox1.Location = new System.Drawing.Point(7, 51);
this.richTextBox1.Name = "richTextBox1";
this.richTextBox1.Size = new System.Drawing.Size(377, 170);
this.richTextBox1.TabIndex = 16;
this.richTextBox1.Text = "";
//
// textBox2
//
this.textBox2.Location = new System.Drawing.Point(169, 24);
this.textBox2.Name = "textBox2";
this.textBox2.Size = new System.Drawing.Size(57, 21);
this.textBox2.TabIndex = 15;
this.textBox2.Text = "5000";
//
// textBox1
//
this.textBox1.Location = new System.Drawing.Point(7, 24);
this.textBox1.Name = "textBox1";
this.textBox1.Size = new System.Drawing.Size(156, 21);
this.textBox1.TabIndex = 14;
this.textBox1.Text = "192.168.134.71";
//
// label2
//
this.label2.AutoSize = true;
this.label2.Location = new System.Drawing.Point(167, 9);
this.label2.Name = "label2";
this.label2.Size = new System.Drawing.Size(27, 12);
this.label2.TabIndex = 13;
this.label2.Text = "Port";
//
// label1
//
this.label1.AutoSize = true;
this.label1.Location = new System.Drawing.Point(7, 9);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(44, 12);
this.label1.TabIndex = 12;
this.label1.Text = "IP 주소";
//
// button2
//
this.button2.Location = new System.Drawing.Point(309, 233);
this.button2.Name = "button2";
this.button2.Size = new System.Drawing.Size(75, 23);
this.button2.TabIndex = 11;
this.button2.Text = "보내기";
this.button2.UseVisualStyleBackColor = true;
this.button2.Click += new System.EventHandler(this.button2_Click);
//
// button1
//
this.button1.Location = new System.Drawing.Point(247, 9);
this.button1.Name = "button1";
this.button1.Size = new System.Drawing.Size(137, 36);
this.button1.TabIndex = 10;
this.button1.Text = "연결하기";
this.button1.UseVisualStyleBackColor = true;
this.button1.Click += new System.EventHandler(this.button1_Click);
//
// Form1
//
this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 12F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(397, 265);
this.Controls.Add(this.textBox3);
this.Controls.Add(this.richTextBox1);
this.Controls.Add(this.textBox2);
this.Controls.Add(this.textBox1);
this.Controls.Add(this.label2);
this.Controls.Add(this.label1);
this.Controls.Add(this.button2);
this.Controls.Add(this.button1);
this.Name = "Form1";
this.Text = "서버 Form";
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.TextBox textBox3;
private System.Windows.Forms.RichTextBox richTextBox1;
private System.Windows.Forms.TextBox textBox2;
private System.Windows.Forms.TextBox textBox1;
private System.Windows.Forms.Label label2;
private System.Windows.Forms.Label label1;
private System.Windows.Forms.Button button2;
private System.Windows.Forms.Button button1;
}
}
Program
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace My_Server
{
static class Program
{
/// <summary>
/// 해당 애플리케이션의 주 진입점입니다.
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
}
}
'C#' 카테고리의 다른 글
C# 문법 공부 : Timer (0) | 2024.04.29 |
---|---|
C# 문법 공부 : Queues (0) | 2024.04.29 |
C# 문법 공부 : HttpWebRe (0) | 2024.04.29 |
C# 문법 공부 : Gif Image (0) | 2024.04.29 |
C# 문법 공부 : Generics (1) | 2024.04.29 |