반응형
(C# WindoForm) 두번 째 Client 소스
1. Send 함수 추가 [서버에 메시지 보내기 함수]
2. Receive 함수 추가 [서버가 보낸 메시지 받기 함수]
3. Delegate 함수 추가
-> 비동기 통신을 하기 위해 Receive 함수를 스레드로 만들었음
-> 스레드가 동작되고 있는 함수에서는 TextBox에 출력하기 위해 Delegate 를 사용해야한다.
4. Client 사용자가 입력한 주소와 포트번호를 받아와 서버연결을 할 수 있도록 함
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Net;
using System.Threading;
namespace test
{
public partial class View : Form
{
public Boolean ClientCon = false;
private TcpClient client;
private NetworkStream mystream;
private StreamReader myread;
private StreamWriter mywrite;
private int _port;
private String _address;
byte[] bytes= new byte[1024];
byte[] Rbyte = new byte[1024];
String Message = "";
Thread myreader;
//===================================
delegate void AppendTextDelegate(Control ctrl, string s); // 델리게이트 선언
AppendTextDelegate _textAppender; // 델리게이트 변수선언
//===================================
public View()
{
InitializeComponent();
_textAppender = new AppendTextDelegate(AppendText); //생성
}
//=============================================================
void AppendText(Control ctrl, string s)
{
if (ctrl.InvokeRequired) ctrl.Invoke(_textAppender, ctrl, s);
else
{
string source = ctrl.Text;
ctrl.Text = source + Environment.NewLine + s;
}
}
//=============================================================
private void View_Load(object sender, EventArgs e)
{
}
public int fn_port(int port)
{
_port = port;
return _port;
}
public String fn_Add(String address)
{
_address = address;
return _address;
}
//클라이언트 오픈
public int fn_open()
{
int ret = 0;
if (!ClientCon)
{
ret = fn_Connection();
}
else
{
fn_Disconnection();
ret = -1;
}
return ret;
}
//클라이언트 연결함수
public int fn_Connection()
{
int ret = 0;
try
{
client = new TcpClient(_address, _port);
mystream = client.GetStream();
myread = new StreamReader(mystream);
mywrite = new StreamWriter(mystream);
myreader = new Thread(fn_Receive);
myreader.Start();
ClientCon = true;
}
catch
{
ClientCon = false;
ret = -2;
}
return ret;
}
//클라이언트 종료함수
public int fn_Disconnection()
{
int ret = 0;
this.ClientCon = false;
try
{
Thread.Sleep(1);
if (myread != null) myread.Close();
if (mywrite != null) mywrite.Close();
if (mystream != null) mystream.Close();
if (client != null) client.Close();
myreader.Abort();
}
catch
{
ret = -2;
}
return ret;
}
private void textBox1_TextChanged(object sender, EventArgs e)
{
}
//보내기 버튼
private void button1_Click(object sender, EventArgs e)
{
//보내기 함수
fn_send();
}
//메시지 보내는함수
public int fn_send()
{
int iret = 0;
String msg = "보내기";
byte[] buff= Encoding.ASCII.GetBytes(msg);
mystream = client.GetStream();
mystream.Write(buff, 0, buff.Length);
mystream.Flush();
return iret;
}
//메시지 받는함수
public void fn_Receive()
{
//int iret = 0;
while (ClientCon)
{
if (mystream.CanRead)
{
//iret = myread.BaseStream.Read(Rbyte, 0, Rbyte.Length);
String myreader = myread.ReadLine();
byte[] Rbuff = Encoding.ASCII.GetBytes(myreader);
if(Rbuff.Length > 0)
{
//textBox4.AppendText("도착시간" + " : "+DateTime.Now.ToString() + Environment.NewLine);
//textBox4.AppendText("메시지 수신" + " :" + myreader + Environment.NewLine);
AppendText(textBox4, "도착시간" + " : " + DateTime.Now.ToString() + Environment.NewLine);
AppendText(textBox4, "메시지 수신" + " :" + myreader + Environment.NewLine);
}
else
{
textBox4.AppendText("수신불가");
}
}
}
}
private void button2_Click(object sender, EventArgs e)
{
}
//서버연결 버튼
private void button3_Click(object sender, EventArgs e)
{
//입력한 주소를 받아옴
fn_Add(txtAddress.Text.ToString());
//입력한 아이피를 받아옴
fn_port(Int32.Parse(txtPort.Text.ToString()));
//클라이언트 오픈함수(ClientConnection)
fn_open();
//메시지 받기
//fn_Receive();
//아이피 받아오기
if (mystream.CanRead)
{
Socket socket = client.Client;
IPEndPoint ip_p = (IPEndPoint)socket.RemoteEndPoint;
String ip = ip_p.Address.ToString();
//if (socket != null) socket.Close();
textBox4.AppendText(ip + Environment.NewLine);
for (int i = 0; i < 100000000; i++)
{
}
Message = "서버에 연결하였습니다";
//textBox4.AppendText(DateTime.Now.ToString() + " " + Environment.NewLine);
//textBox4.AppendText(Message + Environment.NewLine);
AppendText(textBox4, DateTime.Now.ToString() + " " + Environment.NewLine);
AppendText(textBox4, Message + Environment.NewLine);
}
else
{
Message = "서버 연결 실패";
textBox4.AppendText(Message + Environment.NewLine);
}
}
private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
{
}
//서버연결끊기버튼
private void button2_Click_1(object sender, EventArgs e)
{
if (ClientCon)
{
fn_Disconnection();
Message = "연결을 끊었습니다";
textBox4.AppendText(DateTime.Now.ToString() + " " + Environment.NewLine);
textBox4.AppendText(Message + Environment.NewLine);
}
else
{
Message = "계속 연결 중";
textBox4.AppendText(Message);
}
}
}
}
[C#] - C# TCP/IP Client Part.1 [기본소스]
[C#] - C# TCP/IP Client Part.3
[C#] - C# TCP/IP Client 테스트 소스
반응형
'C#' 카테고리의 다른 글
C# Byte 배열로 형변환 하기 (0) | 2019.07.15 |
---|---|
C# Postgresql 연동하기 (0) | 2019.04.23 |
C# 폼에서 폼으로 파라미터 인수 넘기기 (0) | 2019.04.17 |
C# TCP/IP Client Part.3 (9) | 2019.03.26 |
C# TCP/IP Client Part.1 [기본소스] (2) | 2019.03.21 |