수색…


통사론

  • 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
    }
}


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow