1. TCP/IP 소개
TCP/IP 프로토콜 패밀리는 인터넷에서 사용하는 프로토콜이며 독립적 인 개인 네트워크에서도 사용할 수 있습니다.
TCP/IP 프로토콜 패밀리에는 IP 프로토콜, TCP 프로토콜 및 UDP 프로토콜이 포함됩니다.
IP 프로토콜은 IP 주소를 사용하여 패킷을 배포하지만 최고의 효과 서비스이므로 패킷이 손실되거나 순서대로 반복 될 수 있습니다. TCP 및 UDP 프로토콜은 포트 번호를 IP 프로토콜에 추가하여 두 호스트의 응용 분야간에 투명한 연결을 설정합니다.
차이점은 TCP 프로토콜이 IP 계층 오류를 수정하여 핸드 셰이크 메시지를 통해 호스트 간의 연결을 설정한다는 것입니다.
그런 다음 메시지에 일련 번호를 추가하여 메시지의 오류가 복원됩니다. UDP는 단순히 IP 프로토콜을 확장합니다.
호스트 사이가 아닌 응용 프로그램간에 작동 할 수 있습니다.
IP 주소와 관련하여 호스트는 여러 네트워크 인터페이스를 가질 수 있으며 하나의 인터페이스에는 여러 주소가있을 수 있습니다.
일부 IP 주소에는 특별한 용도가 있습니다.
A. 루프백 주소 : 127.0.0.1은 항상 테스트에 사용되는 루프백 인터페이스에 할당됩니다.
B. 개인 주소 : 10, 192.168, 172로 시작합니다. (16-31), 개인 네트워크에 사용됩니다. NAT 장치가 메시지를 전달하면 한 인터페이스의 메시지 주소 포트 쌍을 다른 인터페이스의 공개 주소 포트 쌍에 매핑합니다. 이를 통해 소규모 호스트 그룹이 IP 주소 쌍을 공유 할 수 있습니다.
C. 멀티 캐스트 주소 : 첫 번째 숫자는 224에서 239 사이입니다.
2. 소켓 기본
1. 주소 얻기
public static void main (String [] args) {try {enumeration <NetworkInterface> interfaces = NetworkInterface.getNetWorkInterfaces (); while (interfaces.hasmoreElements ()) {NetworkInterface iface = interfaces.nextElement (); System.out.println ( "인터페이스 :" + iface.getName ()); 열거 <InetAddress> addrlist = iface.getInetAddresses (); if (! addrlist.hasmoreElements ()) system.out.println ( "주소 없음"); while (addrlist.hasmoreElements ()) {inetAddress address = addrlist.nextElement (); System.out.println ( "주소 :" + address.gethostaddress ()); }}} catch (socketexception e) {e.printstacktrace (); }}2.TCP 인스턴스 프로그램
하나의 write () 메소드 만 클라이언트 쪽에서 문자열을 보내는 데 사용되지만 서버 측은 여러 블록 에서이 정보를 수신 할 수 있습니다. 서버가 반환 될 때 피드백 문자열이 블록에 저장 되더라도 TCP 일 수 있습니다.
프로토콜은 여러 부분으로 나뉩니다.
tcpechoclienttest.java
public static void main (String [] args)은 ioexception {String server = args [0]; 바이트 [] data = args [1] .getBytes (); int port = 7; 소켓 소켓 = 새로운 소켓 (서버, 포트); System.out.println ( "서버에 연결되어 ..."); inputStream in = socket.getInputStream (); outputStream out = socket.getOutputStream (); out.write (데이터); int totalbytesrcvd = 0; int bytesrcvd; while (TotalBytesrcvd <data.length) {if ((bytesrcvd = in.read (data, totalbytesrcvd, data.length- totalbytesrcvd)) == -1) 새 소포 체크 ( "연결 폐쇄"); TotalBytesrcvd += bytesrcvd; } system.out.println ( "수신 :" + new String (data)); socket.close (); }tcpechoservertest.java
개인 정적 최종 INT BUFSIZE = 32; public static void main (String [] args)은 ioexception {serversocket serversocket = new Serversocket (7); int recvmsgsize; 바이트 [] lecebuf = new Byte [bufsize]; while (true) {소켓 소켓 = serversocket.accept (); System.out.println (원격 " + socket.getLocalSocketAddress ())에서 remote" + socket.getRemotesocketAddress () + "에서"취급 클라이언트 " +"; inputStream in = socket.getInputStream (); outputStream out = socket.getOutputStream (); while ((recvmsgsize = in.read (leccebuf))! = -1) {out.write (lecceBuf, 0, recvmsgsize); } socket.close (); }}새 소켓은 로컬 포트를 지정하지 않고 원격 서버가 청취하는 포트 번호를 지정하므로 기본 주소와 사용 가능한 포트 번호가 사용됩니다. 내 컴퓨터의 클라이언트 포트는 4593이며 서버의 포트 7에 연결되어 있습니다.
3. UDP 인스턴스 프로그램
UDP 프로토콜을 사용하는 이유는 무엇입니까? 애플리케이션이 소량의 데이터 만 교환하는 경우, TCP 연결의 설정 단계는 정보의 두 배 (및 왕복 시간의 두 배)를 전송합니다.
udpechoclienttest.java
public static void main (String [] args)은 ioexception {inetAddress serverAddress = inetAddress.getByName (args [0]); 바이트 [] bytestosend = args [1] .getBytes (); Datagramsocket Socket = 새로운 Datagramsocket (); Socket.setSotimeout (3000); Datagrampacket SendPacket = New Datagrampacket (ByTestOsend, ByTestOsend.length, ServerAddress, 7); Datagrampacket leceppacket = new Datagrampacket (new Byte [bytestosend.length], bytestosend.length); // 패킷이 손실 될 수 있으므로 int tries = 0을 계속 시도해야합니다. 부울 receptionResponse = false; do {socket.send (sendpacket); try {socket.receive (leccepacket); if (! leccePacket.getAddress (). Equals (ServerAddress)) 새 IoException ( "알 수없는 소스에서 수신"); receptionResponse = true; } catch (ioexception e) {++ 트리; System.out.println ( "타임 아웃, 다시 시도"); }} while (! receptionResponse && 트리 <5); if (receptionResponse) System.out.println ( "수신 :" + new String (leccePacket.getData ()); else system.out.println ( "응답 없음"); socket.close (); } udpechoservertest.java
개인 정적 최종 int echomax = 255; public static void main (String [] args)은 ioexception {datagramsocket socket = new Datagramsocket (7); Datagrampacket Packet = 새로운 Datagrampacket (New Byte [Echomax], echomax); while (true) {socket.receive (패킷); System.out.println ( "" + packet.getAddress ()의 클라이언트 처리; Socket.send (패킷); packet.setlength (echomax); }}이 예제를 이전 TCP 인스턴스와 비교하면 다음과 같은 차이점이 있습니다.
a.datagramsocket은 UDP가 연결을 설정할 필요가없고 각 데이터 패킷이 다른 대상 주소에서 보내거나 수신 할 수 있기 때문에 대상 주소가 생성 될 때 대상 주소를 지정할 필요가 없습니다.
B. TCP와 같은 read ()를 차단하고 기다리면 UDP 프로토콜이 단순히 IP 프로토콜을 확장하고 UDP 패킷이 손실 될 수 있기 때문에 영원히 차단 될 수 있습니다. 따라서 대기 차단을위한 시간 초과 시간을 설정해야합니다.
c.udp 프로토콜은 메시지의 경계 정보를 보유하고 각 chearch () 호출은 send () 메소드 호출에서 한 번만 보낸 데이터 만받을 수 있습니다.
D. UDP 패킷이 전송할 수있는 최대 데이터는 65507 바이트입니다. 초과 바이트는 자동으로 폐기되며 수신 프로그램에 대한 프롬프트가 없습니다. 따라서 캐시 어레이를 약 65,000 바이트로 설정하는 것이 안전합니다.
E. 동일한 Datagrampacket 인스턴스와 함께 수신 () 메소드가 반복적으로 호출되면 메시지의 내부 길이는 각 호출 전에 캐시의 실제 길이로 명시 적으로 재설정되어야합니다.