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 로 변환 하 는 것 이 올 바른 방법 입 니 다.클 라 이언 트 에서 역전 만 하면 돼!총결산
이상 은 이 글 의 전체 내용 입 니 다.본 논문 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 참고 학습 가치 가 있 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 댓 글 을 남 겨 주 셔 서 저희 에 대한 지지 에 감 사 드 립 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
C#Task를 사용하여 비동기식 작업을 수행하는 방법라인이 완성된 후에 이 라인을 다시 시작할 수 없습니다.반대로 조인(Join)만 결합할 수 있습니다 (프로세스가 현재 라인을 막습니다). 임무는 조합할 수 있는 것이다. 연장을 사용하여 그것들을 한데 연결시키는 것이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.