수색…
통사론
- TcpClient (문자열 호스트, int 포트);
비고
client.GetStream()
을 사용하여 TcpClient
에서 NetworkStream
을 가져 client.GetStream()
StreamReader/StreamWriter
로 전달하여 비동기 읽기 및 쓰기 메서드에 액세스 할 수 있습니다.
기본 TCP 통신 클라이언트
이 코드 예는 TCP 클라이언트를 만들고 소켓 연결을 통해 "Hello World"를 보낸 다음 연결을 닫기 전에 콘솔에 서버 응답을 씁니다.
// Declare Variables
string host = "stackoverflow.com";
int port = 9999;
int timeout = 5000;
// Create TCP client and connect
using (var _client = new TcpClient(host, port))
using (var _netStream = _client.GetStream())
{
_netStream.ReadTimeout = timeout;
// Write a message over the socket
string message = "Hello World!";
byte[] dataToSend = System.Text.Encoding.ASCII.GetBytes(message);
_netStream.Write(dataToSend, 0, dataToSend.Length);
// Read server response
byte[] recvData = new byte[256];
int bytes = _netStream.Read(recvData, 0, recvData.Length);
message = System.Text.Encoding.ASCII.GetString(recvData, 0, bytes);
Console.WriteLine(string.Format("Server: {0}", message));
};// The client and stream will close as control exits the using block (Equivilent but safer than calling Close();
웹 서버에서 파일 다운로드
인터넷에서 파일을 다운로드하는 것은 거의 모든 응용 프로그램에서 필요로하는 매우 일반적인 작업입니다.
이를 위해 " System.Net.WebClient "클래스를 사용할 수 있습니다.
"using"패턴을 사용하는 가장 간단한 방법은 다음과 같습니다.
using (var webClient = new WebClient())
{
webClient.DownloadFile("http://www.server.com/file.txt", "C:\\file.txt");
}
이 예제에서 수행하는 작업은 "사용"을 사용하여 웹 클라이언트가 완료되면 올바르게 정리되고 첫 번째 매개 변수의 URL에서 명명 된 리소스를 로컬 하드 드라이브의 명명 된 파일로 두 번째로 전송하는 것입니다 매개 변수.
첫 번째 매개 변수는 " System.Uri "유형이고 두 번째 매개 변수는 " System.String "유형입니다.
또한이 기능을 비동기 형식으로 사용할 수 있기 때문에 백그라운드에서 다운로드를 수행하고 응용 프로그램이 다른 작업을 수행하는 동안 현대적인 응용 프로그램에서 이러한 방식으로 호출하는 것이 중요합니다. 사용자 인터페이스를 응답 성있게 유지합니다.
비동기 메서드를 사용하면 진행률을 모니터링 할 수있는 이벤트 처리기를 연결할 수 있으므로 예를 들어 다음과 같이 진행률 막대를 업데이트 할 수 있습니다.
var webClient = new WebClient())
webClient.DownloadFileCompleted += new AsyncCompletedEventHandler(Completed);
webClient.DownloadProgressChanged += new DownloadProgressChangedEventHandler(ProgressChanged);
webClient.DownloadFileAsync("http://www.server.com/file.txt", "C:\\file.txt");
그러나 비동기 버전을 사용하는 경우 기억해야 할 중요한 사항 중 하나는 " '구문 사용'에서 사용하는 것이 매우 중요합니다.
그 이유는 아주 간단합니다. 다운로드 파일 메서드를 호출하면 즉시 반환됩니다. 이것을 using 블록에 가지고 있다면, 그 블록으로 돌아와 즉시 클래스 객체를 처리하고 진행중인 다운로드를 취소 할 것입니다.
비동기 전송을 수행하는 '사용'방법을 사용하는 경우 전송이 완료 될 때까지 둘러싼 블록 안에 있어야합니다.
비동기 TCP 클라이언트
C # 응용 프로그램에서 async/await
을 사용하면 멀티 스레딩이 간단 해집니다. 이것은 TcpClient와 함께 async/await
를 사용하는 방법입니다.
// Declare Variables
string host = "stackoverflow.com";
int port = 9999;
int timeout = 5000;
// Create TCP client and connect
// Then get the netstream and pass it
// To our StreamWriter and StreamReader
using (var client = new TcpClient())
using (var netstream = client.GetStream())
using (var writer = new StreamWriter(netstream))
using (var reader = new StreamReader(netstream))
{
// Asynchronsly attempt to connect to server
await client.ConnectAsync(host, port);
// AutoFlush the StreamWriter
// so we don't go over the buffer
writer.AutoFlush = true;
// Optionally set a timeout
netstream.ReadTimeout = timeout;
// Write a message over the TCP Connection
string message = "Hello World!";
await writer.WriteLineAsync(message);
// Read server response
string response = await reader.ReadLineAsync();
Console.WriteLine(string.Format($"Server: {response}"));
}
// The client and stream will close as control exits
// the using block (Equivilent but safer than calling Close();
기본 UDP 클라이언트
이 코드 예는 UDP 클라이언트를 만들고 네트워크를 통해 "Hello World"를 의도 된받는 사람에게 보냅니다. UDP는 비 연결형이므로 리스너는 활성 상태 일 필요가 없으며 상관없이 메시지를 브로드 캐스트합니다. 메시지가 보내지면 클라이언트 작업이 완료됩니다.
byte[] data = Encoding.ASCII.GetBytes("Hello World");
string ipAddress = "192.168.1.141";
string sendPort = 55600;
try
{
using (var client = new UdpClient())
{
IPEndPoint ep = new IPEndPoint(IPAddress.Parse(ipAddress), sendPort);
client.Connect(ep);
client.Send(data, data.Length);
}
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
아래는 위의 클라이언트를 보완하는 UDP 수신기의 예입니다. 그것은 끊임없이 앉아서 주어진 포트에서 트래픽을 수신하고 그 데이터를 콘솔에 기록합니다. 이 예제에는 내부적으로 설정되지 않은 제어 플래그 ' done
'이 포함되어 있으며이를 설정하여 리스너를 종료하고 종료 할 수 있습니다.
bool done = false;
int listenPort = 55600;
using(UdpClinet listener = new UdpClient(listenPort))
{
IPEndPoint listenEndPoint = new IPEndPoint(IPAddress.Any, listenPort);
while(!done)
{
byte[] receivedData = listener.Receive(ref listenPort);
Console.WriteLine("Received broadcast message from client {0}", listenEndPoint.ToString());
Console.WriteLine("Decoded data is:");
Console.WriteLine(Encoding.ASCII.GetString(receivedData)); //should be "Hello World" sent from above client
}
}