C #을 TCP / IP 서버 및 클라이언트

서버
하여 시스템을 사용하여,
는 System.Collections.Generic를 사용하여;
다루려면 System.Text를 사용하여;
하여하여 System.Threading를 사용하여;
하여 System.Net.Sockets를 사용하여;
사용하여 System.Net;

네임 스페이스 TcpIpServer
{
클래스 TcpIpServerEx
{
공공 RemoteEndPoint 엔드 포인트 {GET, 개인 SET을} // 현재 클라이언트 네트워크 노드

스레드 threadwatch = NULL; // 클라이언트가 스레드 모니터링을 담당
소켓 소켓 = NULL을; // 클라이언트 모니터링 소켓에 대한 책임
// 사전 <IP 및 포트, 소켓> 세트를 정의, 매장 고객 정보를 종료
공공 사전 <엔드 포인트, 소켓을> DIC = 새로운 새로운 사전 <엔드 포인트, 소켓> {};

개인 모두 StringBuilder 모두 StringBuilder 새로운 새로운 MSG = ();
공공 문자열 메시지
{
GET msg.ToString {반환 ();}
개인 SET
{
msg.AppendLine (값);
Console.WriteLine (값 + "\ R & LT \ N-");
}

}

개인 TcpIpServerEx () {}
공공 TcpIpServerEx (포트 = 11000 INT)
{
// 클라이언트를 수신 할 수있는 소켓을 정의 보낸 메시지는 세 개의 매개 변수 (IP4 주소 프로토콜, 스트리밍 연결, TCP 프로토콜)를 포함
, 소켓 새로운 새 = 소켓 (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)

// 포트 번호와 IP 주소 바인딩 네트워크 노드를 가리 키도록
IPEndPoint로 IPEndPoint로 새로운 새 점 = (IPAddress.Any 포트); // 서버 포트 설정, IP가 IP 네트워크이고, 본 절차 PC

결합 스누핑 // 네트워크 노드
Socket.bind (위치)

/ / 소켓은 수신 대기열 길이는 20으로 제한된다
socket.Listen (20);

// 리스너 스레드 생성
threadwatch = 새로운 새로운 스레드 (watchconnecting);

// 스레드의 형태가 배경과 동기화하기를 메인 쓰레드 단부를 따라 최종
= true로 threadwatch.IsBackground는,

스레드 시작 //
) (threadwatch.Start을;

스레드가 // 해당 프롬프트 표시 시작한 후
메시지 = ( "클라이언트 정보를 주셔서 듣기 시작된다!"+ "\ R & LT \ N-");
}

// 수신 클라이언트 요청이 전송
개인 무효 watchconnecting ()
{
소켓 연결을 = 널 (null);
그동안 (true로) 계속 요청에 클라이언트를 모니터링 //
{
은 try
{
; 연결 socket.Accept = ()
}
캐치 (예외 EX)
{
메시지 = (ex.Message); // 끝은 소켓을 듣고 이상
BREAK;
}

// 고객을 표시 할 수 있습니다 "연결 성공"메시지
문자열 sendmsg = + connection.RemoteEndPoint "서버 사용자의 IP의 성공에 연결된입니다!";
바이트 [] arrSendMsg = Encoding.UTF8.GetBytes (sendmsg)
연결 .send (arrSendMsg)


RemoteEndPoint = connection.RemoteEndPoint // 클라이언트 네트워크 노드 번호
메시지 = ( "성공", "클라이언트 접속 확립 \ t \ 없음!"+ RemoteEndPoint +);클라이언트와 // 디스플레이 연결
dic.Add (RemoteEndPoint 연결); // 클라이언트 정보를 추가


하는 통신 스레드 생성 //
; ParameterizedThreadStart PTS = 새로운 새 ParameterizedThreadStart (RECV)
스레드 스레드 = 새로운 새로운 스레드 (PTS)
thread.IsBackground = 참; // 설정된 배경 스레드, 출구와 주 스레드가 종료
thread.Start (연결) 스레드를 시작 //
}
}

///
/// 클라이언트가 보낸 정보를받을
///
/// 클라이언트 소켓 객체
개인 무효의 RECV을 (객체 socketclientpara)
{

같이 소켓 SocketServer의 socketclientpara 소켓 =;
그동안을 (true로)
{
// 메모리 버퍼 크기를 쉽게 만들 1024 * 1024 바이트, 즉 100 만
[] = arrServerRecMsg 새로운 새 바이트 [1024 * 1024 바이트 위치;
// 것 수신 된 정보는 메모리 버퍼에 저장되며, 어레이의 바이트 길이 반환
은 try을
{
socketServer.Receive 길이 = INT (arrServerRecMsg는)

// 인간 판독 가능 스트링으로 기계 수신 바이트 배열
문자열 strSRecMsg = Encoding.UTF8.GetString (arrServerRecMsg 0 , 길이);

문자 // 전송 될 문자열 정보 입력란 txtMsg 부착
(: + GetCurrentTime () + socketServer.RemoteEndPoint "클라이언트"메시지 = + " 메시지"+ strSRecMsg + "\ R & LT \ N- ');
}
캐치 (예외 EX)
{
메시지 = ( "클라이언트 :"+ GetCurrentTime () + socketServer.RemoteEndPoint + "가 끊어졌습니다"+ "\ 연구 \ n" ); // 듣기 소켓 프롬프트 이상
//listBoxOnlineList.Items.Remove(socketServer.RemoteEndPoint.ToString ()); //리스트 박스 클라이언트에서 분리 제거
socketServer.Close (); // 밖으로 닫고 클라이언트 소켓 통신하기 전에 동의
휴식;
}
}


}


// 현재 시스템 시간 수
) (개인 GetCurrentTime 문자열
{
문자열 TIMESTR = System.DateTime.Now.ToString ( "YYYY, MM 달 날짜 DD하고 hh mm SS FFF 밀리 초.");
TIMESTR의 반환;
}

/// <요약>
///하는 클라이언트에 정보를 보내
// / </ 요약>
/// <PARAM NAME = "smallname"> </ PARAM>
/// <PARAM NAME = "SENDMSG"> 정보가 전송 될 </ PARAM>
공개 무효 SentMsg (엔드 포인트, 엔드 포인트, SENDMSG 문자열)
{

바이트 [] 바이트 = System.Text.Encoding.UTF8.GetBytes (sendMsg ) // 소켓 바이트의 형태로 데이터를 전송하기 때문에 상기 정보는 바이트 배열로 전송 될가 송신
DIC [종점] .Send ( 바이트) // 데이터를 전송할
"메시지"메시지 = (GetCurrentTime () SENDMSG + + + + 엔드 포인트 "\ R & LT \ N- ');
}
}
}

상기 시스템을 이용하여;
네임 스페이스 TcpIpServer
{
클래스 프로그램
{
정적 무효 메인 (문자열 []에 args)
{
S = 새로운 새 TcpIpServerEx TcpIpServerEx ();
그동안 (true로)
{
문자열 strSend Console.ReadLine = (),
IF (strSend == "출구") BREAK;
Console.WriteLine ( "s.dic.Count"+ s.dic. COUNT)
IF (s.dic.Count> 0)
{
s.SentMsg (s.RemoteEndPoint, strSend);
}
}
}
}
}
클라이언트는
상기 시스템을 사용하여,
상기 System.Collections.Generic을 사용함;
다루려면 System.Text를 사용하여,
상기 시스템을 사용. ; 스레딩
, 사용 System.Net.Sockets을
System.Net을 사용하여;

네임 스페이스 TcpIpClint
{
공용 클래스 TcpIpClintEx
{
// 클라이언트 소켓을 만들고 요청은 서버 스레드 모니터링에 대한 책임이
스레드 threadclient = NULL을;
소켓 = null의 소켓;
목록 <IPEndPoint로> = mlist 새로운 새로운 목록 <IPEndPoint로> ();
개인 모두 StringBuilder 모두 StringBuilder 새로운 새로운 MSG = ();
공공 문자열 메시지
{
GET msg.ToString {반환 ();}
개인 SET
{
msg.AppendLine (값 )
Console.WriteLine (값 + "\ R & LT \ N- ');
}
}

공개 TcpIpClintEx (문자열 IP 포트 = 11000 INT)
{
// 소켓 리스너 정의
소켓 = 새로운 소켓 (AddressFamily.InterNetwork, SocketType.Stream , ProtocolType.Tcp);
// 바인딩 네트워크 노드에서 획득 한 IP 주소와 포트 번호
IPEndPoint로 IPEndPoint로 새로운 새로운 포인트 = (의 IPAddress.Parse (IP), 포트);
메시지가 = + IP + ""서버에 연결 " "포트 +;

은 try
{
연결하여 네트워크 노드에 연결된 클라이언트 소켓 //
를 Socket.connect (포인트);
}
캐치 (예외)
{
; 메시지가 = ( "연결 \ R & LT \ N- 실패")
반환;
}

스레드를 threadclient 새로운 새 =합니다 (RECV)
threadclient.IsBackground = true로;
threadclient.Start ();
}

@ 서버에 의해 전송 된 정보를 수신하는 방법
개인 무효 RECV는 () //
{
그동안 (true로) // 서버 연속적으로 전송 된 메시지 모니터링
{
시도
{
// 임시 저장을위한 1M 버퍼 메모리의 정의 상기 수신 된 메시지의
바이트 [] = arrRecvmsg 새로운 새 바이트 [1024 * 1024];

// 클라이언트 소켓은 메모리 버퍼에 데이터를 수신 및 길이 구하는
INT 길이 = Socket.Receive (arrRecvmsg를)

// 인간의 인수 문자열로 소켓 배열은 이해할 수있는
문자열 strRevMsg = Encoding.UTF8.GetString (arrRecvmsg, 0 , 길이);

메시지 = ( "서버"+ GetCurrentTime () + " IP"+ socket.RemoteEndPoint + " 메시지"+ strRevMsg + "\ R & LT \ N- \ N- ');
}
캐치 (예외 EX)
{
MSG = ( ] + "\ R & LT \ N-") "원격 서버가 분리 된"
체류;
}
}
}

현재 시스템 시간 얻기 //
개인 GetCurrentTime 문자열 ()
{
TIMESTR = System.DateTime.Now.ToString의 문자열 ( "YYYY, MM-DD mm 분율 일 HH의 SS는 밀리 초 FFF ");시
TIMESTR의 반환;
}

// 서버 프로세스로 문자 정보를 전송
) (공공 공극 ClientSendMsg 문자열 SENDMSG을
{
콘텐츠 // 문자열 입력 바이트가 시스템을 식별 할 수있는 변환하여 어레이
바이트 [] = arrClientSendMsg Encoding.UTF8.GetBytes (SENDMSG는)
// 바이트 전송 클라이언트 소켓 배열 호출
socket.Send (arrClientSendMsg);
}
}
}
시스템을 사용하여;
System.Collections.Generic을 사용함;
System.Text을 사용함;

네임 스페이스 TcpIpClint
{
클래스 프로그램
{
정적 무효 메인 (문자열 []에 args)
{
TcpIpClintEx tcpIpClintEx = 새로운 TcpIpClintEx ( "122.112.226.109");

(참) 동안
{
문자열 strSend = Console.ReadLine ();
경우 (strSend == "출구") 휴식;
tcpIpClintEx.ClientSendMsg (strSend);
}
}
}
}
----------------

原文链接: HTTPS : //blog.csdn.net/u013628121/article/details/82968706

추천

출처www.cnblogs.com/zhengguangITelite/p/11388386.html