C\#튜 토리 얼 을 배 우 는 Socket 의 간단 한 사용

7023 단어 c#socket
머리말
socket 을 소개 하기 전에 기초 지식 을 보충 하고 이 를 바탕 으로 네트워크 통신 을 이해 해 야 순리 적 이 며,당연히 기초 적 인 것 은 뛰 어 넘 을 수 있 습 니 다.다 쓸데없는 소리 야,본론 으로 들 어가.
TCP/IP:Transmission Control Protocol/Internet Protocol,전송 제어 프로 토 콜/인터넷 연결 프로 토 콜,일명 네트워크 통신 프로 토 콜.쉽게 말 하면 TCP 는 전송 데 이 터 를 제어 하고 전송 문 제 를 발견 하 며 문제 가 있 으 면 신 호 를 보 내 고 모든 데이터 가 목적지 까지 안전하게 전 송 될 때 까지 재 전송 을 요구 합 니 다.IP 는 인터넷 의 모든 컴퓨터 에 주 소 를 정의 하여 전송 할 수 있 도록 합 니 다.프로 토 콜 계층 모델 의 측면 에서 볼 때 TCP/IP 는 네트워크 인터페이스 층(링크 층),네트워크 층,전송 층,응용 층 이다.이것 은 OSI 의 7 층 구조 와 협의 족 에 대해 다르다.아래 그림 은 간단하게 다음 과 같다.



주:첫 번 째 그림:TCP/IP 의 4 층 구 조 는 OSI 7 층 구조 에 대응 합 니 다.
세 번 째 그림:TCP/IP 프로 토 콜 족 이 OSI 7 층 에서 의 위치 와 대응 하 는 기능.
두 번 째 그림:TCP/IP 프로 토 콜 모듈 관계 도.
현 단계 socket 통신 은 TCP,UDP 프로 토 콜 을 사용 합 니 다.UDP 에 비해 TCP 는 비교적 안전 하고 안정 적 인 프로 토 콜 입 니 다.
Socket 은 통신 TCP/IP 의 통신 인터페이스,즉 HTTP 의 추상 층 이다.즉,Socket 은 Http 위 에 있 고 Socket 은 엔진 이다.실제로 전송 층 의 TCP 는 네트워크 계층 의 IP 프로 토 콜 을 바탕 으로 하 는 것 이 고 응용 층 의 HTTP 프로 토 콜 은 전송 층 의 TCP 프로 토 콜 을 바탕 으로 하 는 것 이 며 Socket 자 체 는 프로 토 콜 이 아니 라 위 에서 말 한 것 처럼 TCP 나 UDP 프로 그래 밍 을 위 한 인터페이스 만 제공 합 니 다.
C\#에서 Socket 을 사용 하여 데이터 전송 을 매우 편리 하 게 할 수 있 습 니 다.
Socket 대상 은 C\#Socket 을 사용 하 는 중요 한 대상 입 니 다.Socket 의 구조 함수 에서 우 리 는 주소,Socket 의 클래스,지원 하 는 프로 토 콜 등 을 설정 할 수 있 습 니 다.그 정 의 는 다음 과 같 습 니 다.

public Socket(AddressFamily addressFamily, SocketType socketType, ProtocolType protocolType);
Socket 을 사용 하려 면 Socket 의 대상 을 만들어 야 합 니 다.이 대상 을 만 들 려 면 IPEndPoint 대상 이 접속사 에 연결 되 어야 합 니 다.다음 과 같은 정의 가 있 습 니 다.

//           ,       ; 
socketWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//        IP  ;
IPAddress address = IPAddress.Parse(textBox1.Text.Trim());
//     ip           ; 
IPEndPoint endPoint = new IPEndPoint(address, int.Parse(textBox2.Text.Trim()));
그리고 Socket 의 Bind 를 통 해 연결 합 니 다.

socketWatch.Bind(endPoint);
우 리 는 항상 내부 네트워크 의 다른 ip 과 포트 에 연결 되 기 때문에 우 리 는 스 레 드 를 만들어 관찰 해 야 합 니 다.다음 과 같은 정의 가 있 습 니 다.

//          ; 
   socketWatch.Listen(10);
   //          ; 
   threadWatch = new Thread(WatchConnecting);
   threadWatch.IsBackground = true;
   threadWatch.Start();
   ShowMsg("         !");
그 검 측 방법 은 다음 과 같다.그 중에서 클 라 이언 트 의 연결 요청 을 계속 검 측 하 는 것 이다.Accept()방법 을 통 해 소켓 대상 의 RemoteEndPoint()를 통 해 IP 를 얻 을 수 있다.

void WatchConnecting()
  {
   while (true) //                ; 
   {
    //            ,Accept          ; 
    Socket sokConnection = socketWatch.Accept(); //              ,                 ; 
    //             IP  ; 
    Online.Items.Add(sokConnection.RemoteEndPoint.ToString());
    //                      ; 
    dict.Add(sokConnection.RemoteEndPoint.ToString(), sokConnection);
    ShowMsg("       !");
    Thread thr = new Thread(RecMsg);
    thr.IsBackground = true;
    thr.Start(sokConnection);
    dictThread.Add(sokConnection.RemoteEndPoint.ToString(), thr); //                   。 
   }
  }
마지막 으로 우 리 는 Recmsg 방법 을 실행 하기 위해 스 레 드 를 열 었 다.그리고 우 리 는 클 라 이언 트 가 우리 에 게 보 낸 데 이 터 를 계속 감청 했다.

void RecMsg(object sokConnectionparn)
  {
   Socket sokClient = sokConnectionparn as Socket;
   while (true)
   {
    //     2M    ; 
    byte[] arrMsgRec = new byte[1024 * 1024 * 2];
    //              arrMsgRec ; 
    int length = -1;
    try
    {
     length = sokClient.Receive(arrMsgRec); //     ,        ; 
    }
    catch (SocketException se)
    {
     ShowMsg("  :" + se.Message);
     //                         ; 
     dict.Remove(sokClient.RemoteEndPoint.ToString());
     //                       ; 
     dictThread.Remove(sokClient.RemoteEndPoint.ToString());
     //             IP 
     Online.Items.Remove(sokClient.RemoteEndPoint.ToString());
     break;
    }
    catch (Exception e)
    {
     ShowMsg("  :" + e.Message);
     //                         ; 
     dict.Remove(sokClient.RemoteEndPoint.ToString());
     //                       ; 
     dictThread.Remove(sokClient.RemoteEndPoint.ToString());
     //             IP 
     Online.Items.Remove(sokClient.RemoteEndPoint.ToString());
     break;
    }
    if (arrMsgRec[0] == 0) //          ; 
    {
     string strMsg = System.Text.Encoding.UTF8.GetString(arrMsgRec, 1, length - 1);//                ; 
     ShowMsg(strMsg);
    }
    if (arrMsgRec[0] == 1) //          ; 
    {
     SaveFileDialog sfd = new SaveFileDialog();

     if (sfd.ShowDialog(this) == System.Windows.Forms.DialogResult.OK)
     {//      sfd.ShowDialog()            this                 ,            ,,       !!!【  :  this sfd.ShowDialog(this),“   ”        SaveFileDialog     ,   thisSaveFileDialog                ,     “   ”  。】 

      string fileSavePath = sfd.FileName;//          ; 
      //      ,          ; 
      using (FileStream fs = new FileStream(fileSavePath, FileMode.Create))
      {
       fs.Write(arrMsgRec, 1, length - 1);
       ShowMsg("      :" + fileSavePath);
      }
     }
    }
   }
  }
우 리 는 방법 에서 Object 형식의 대상 을 얻 었 습 니 다.이 Object 대상 을 Socket 으로 바 꾼 다음 에 우 리 는 Socket 의 방법 Receive()방법 으로 되 돌아 온 데 이 터 를 받 았 습 니 다.그 중에서 속성 이 있 고 ip 과 일부 데 이 터 를 얻 을 수 있 습 니 다.서버 가 클 라 이언 트 에 게 데 이 터 를 보 내 는 것 도 간단 하 다.Send 방법 을 통 해 다음 과 같은 정 의 를 내 릴 수 있 습 니 다.

string strMsg = "   " + "\r
" + " -->" + richTextBox1.Text.Trim() + "\r
"; byte[] arrMsg = System.Text.Encoding.UTF8.GetBytes(strMsg); // Utf-8 ; byte[] arrSendMsg = new byte[arrMsg.Length + 1]; arrSendMsg[0] = 0; // Buffer.BlockCopy(arrMsg, 0, arrSendMsg, 1, arrMsg.Length); string strKey = ""; strKey = Online.Text.Trim(); if (string.IsNullOrEmpty(strKey)) // ; { MessageBox.Show(" !!!"); } else { dict[strKey].Send(arrSendMsg);// sokConnection , ; ShowMsg(strMsg); richTextBox1.Clear(); }
마지막 으로 주의해 야 할 것 은 파일 이 크 면 이 버퍼 가 파일 바이트 만큼 크 지 않 을 때 차단 되 기 때문에 파일 을 Byte 로 변환 하 는 것 이 올 바른 방법 입 니 다.클 라 이언 트 에서 역전 만 하면 돼!
총결산
이상 은 이 글 의 전체 내용 입 니 다.본 논문 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 참고 학습 가치 가 있 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 댓 글 을 남 겨 주 셔 서 저희 에 대한 지지 에 감 사 드 립 니 다.

좋은 웹페이지 즐겨찾기