Java는 1995년 5월 Sun Microsystems가 출시한 고급 프로그래밍 언어입니다. Java는 Windows, Mac OS 및 기타 UNIX 버전의 시스템과 같은 여러 플랫폼에서 실행될 수 있습니다. 정적 객체지향 프로그래밍 언어의 대명사인 자바 언어는 객체지향 이론을 완벽하게 구현하고 프로그래머가 복잡한 프로그래밍을 우아한 사고방식으로 수행할 수 있도록 해준다. "Geek Academy Java 비디오 튜토리얼"은 얕은 것부터 깊은 것까지, 기본부터 고급까지 Java 언어 세계로 안내합니다.
강의 재생 주소: http://www.php.cn/course/275.html
선생님의 강의 스타일:
선생님의 강의는 간단하고 깊이 있고 명확합니다. 논리적 사고력을 사용하여 학생들의 관심을 끌고 이성을 사용하여 교실 교육 과정을 제어합니다. 선생님의 강의를 들으면서 학생들은 지식을 배울 뿐만 아니라 사고력 훈련도 받으며 선생님의 엄격한 학문적 태도에 영향을 받고 영향을 받습니다
이 영상에서 더 어려운 점은 Java에서의 소켓 통신입니다:
첫째, 네트워크 프로그래밍에는 두 가지 주요 문제가 있습니다
하나는 네트워크에서 하나 이상의 호스트를 정확하게 찾는 방법이고, 다른 하나는 호스트를 찾은 후 안정적이고 효율적으로 데이터를 전송하는 방법입니다.
TCP/IP 프로토콜에서 IP 계층은 주로 네트워크 호스트의 위치 지정과 데이터 전송 라우팅을 담당합니다. IP 주소는 인터넷에서 호스트를 고유하게 결정할 수 있습니다.
TCP 계층은 애플리케이션 중심의 신뢰할 수 있는(TCP) 또는 신뢰할 수 없는(UDP) 데이터 전송 메커니즘을 제공합니다. 이는 네트워크 프로그래밍의 주요 목적입니다. 일반적으로 IP 계층이 데이터를 처리하는 방식에 신경 쓸 필요가 없습니다.
현재 더 널리 사용되는 네트워크 프로그래밍 모델은 클라이언트/서버(C/S) 구조입니다. 즉, 통신 당사자 중 하나가 서버 역할을 하며 클라이언트의 요청과 응답을 기다립니다. 고객은 서비스가 필요할 때 서버에 신청합니다. 서버는 일반적으로 항상 데몬 프로세스로 실행되어 네트워크 포트를 수신합니다. 일단 고객 요청이 있으면 서비스 프로세스를 시작하여 고객에 응답하고 동시에 서비스 포트를 계속 모니터링합니다. 고객은 적시에 서비스를 받을 수도 있습니다.
두 번째, 두 가지 유형의 전송 프로토콜: TCP; UDP
TCP는 Transfer Control Protocol의 약어로, 안정적인 전송을 보장하는 연결 지향 프로토콜입니다. TCP 프로토콜을 통해 전송되면 순차적이고 오류 없는 데이터 스트림이 얻어집니다. TCP 프로토콜을 기반으로 통신하려면 송신자와 수신자의 두 소켓 사이에 연결이 설정되어야 합니다. 한 소켓(보통 서버 소켓)이 연결 설정을 기다리고 있으면 다른 소켓이 연결을 요청할 수 있습니다. 연결, 이 두 소켓이 연결되면 양방향 데이터 전송을 수행할 수 있으며 두 당사자 모두 전송 또는 수신 작업을 수행할 수 있습니다.
UDP는 User Datagram Protocol의 약어입니다. 각 데이터그램은 완전한 소스 주소 또는 대상 주소를 포함하는 독립적인 정보이므로 네트워크의 가능한 모든 경로를 통해 전송됩니다. , 목적지 도달 능력, 목적지 도착 시간, 내용의 정확성 등은 보장할 수 없습니다.
비교:
UDP: 1, 각 데이터그램에 완전한 주소 정보가 제공되므로 발신자와 수신자 간에 연결을 설정할 필요가 없습니다.
2. UDP가 데이터를 전송할 때 크기 제한이 있으며, 전송되는 각 데이터그램은 64KB로 제한되어야 합니다.
3. UDP는 신뢰할 수 없는 프로토콜입니다. 송신자가 보낸 데이터그램은 반드시 동일한 순서로 수신자에게 도착하지 않습니다.
TCP: 1. 소켓 간 데이터 전송 전에 사용해야 하는 연결 지향 프로토콜입니다. 연결, TCP에서 연결하는 데
시간이 걸립니다.
2. TCP 전송 데이터 크기 제한 일단 연결이 설정되면 양쪽 소켓은 대용량
데이터를 통일된 형식으로 전송할 수 있습니다.
3. TCP는 수신자가 발신자가 보낸 모든 데이터를 완전하고 정확하게 얻을 수 있도록 보장하는 신뢰할 수 있는 프로토콜입니다.
응용 프로그램:
1. TCP는 네트워크 통신에 강한 생명력을 가지고 있습니다. 예를 들어 원격 연결(Telnet) 및 파일 전송(FTP)은 가변 길이의 데이터를 안정적으로 전송해야 합니다. 그러나 안정적인 전송에는 대가가 따릅니다. 데이터 내용의 정확성을 확인하려면 필연적으로 컴퓨터 처리 시간과 네트워크 대역폭이 필요합니다. 따라서 TCP 전송은 UDP만큼 효율적이지 않습니다.
2. UDP는 작동이 간단하고 감독이 덜 필요하므로 일반적으로 근거리 통신망에서 신뢰성이 높은 분산 시스템의 클라이언트/서버 애플리케이션에 사용됩니다. 예를 들어, 화상 회의 시스템은 연속성이 보장되는 한 오디오 및 비디오 데이터가 절대적으로 정확할 것을 요구하지 않습니다. 이 경우 UDP를 사용하는 것이 분명히 더 합리적입니다.
셋, 소켓 기반의 Java 네트워크 프로그래밍
1. 소켓이란? 네트워크상의 두 프로그램은 양방향 통신 연결을 통해 데이터를 교환합니다. 소켓은 일반적으로 클라이언트와 서버 간의 연결을 구현하는 데 사용됩니다. 소켓은 TCP/IP 프로토콜을 위한 매우 널리 사용되는 프로그래밍 인터페이스입니다. 소켓은 IP 주소와 포트 번호에 의해 고유하게 결정됩니다.
그러나 소켓에서 지원하는 프로토콜 유형은 TCP/IP에만 국한되지 않으므로 둘 사이에 필요한 연결이 없습니다. Java 환경에서 소켓 프로그래밍은 주로 TCP/IP 프로토콜을 기반으로 하는 네트워크 프로그래밍을 의미합니다.
2. 소켓 통신 과정
서버는 특정 포트에 연결 요청이 있는지 확인합니다. 클라이언트는 서버에 Connect 요청을 보내고, 서버는 클라이언트에게 다시 Accept 메시지를 보냅니다. 연결이 설정되었습니다. 서버 측과 클라이언트 측 모두 보내기, 쓰기 및 기타 방법을 통해 서로 통신할 수 있습니다.
완전히 작동하는 소켓의 경우 다음 기본 구조를 포함해야 하며 작업 프로세스에는 다음 네 가지 기본 단계가 포함됩니다.
(1) 소켓 생성
(2) 소켓에 연결된 입력/출력 스트림 열기 ;
(3) 특정 프로토콜에 따라 소켓에서 읽기/쓰기 작업을 수행합니다.
(4) 소켓을 닫습니다. (많은 기사에서 권장하지만 표시된 닫기는 사용되지 않습니다. 경우에 따라 프로그램 자체가 상대적으로 단순하고 요구사항이 높지 않아 별 영향이 없을 수도 있습니다.)
3. Create Socket
Create Socket
java에서는 Socket과 ServerSocket이라는 두 가지 클래스를 제공합니다. 패키지 java.NET. 양방향 연결의 클라이언트와 서버를 각각 나타내는 데 사용됩니다. 이들은 매우 잘 캡슐화된 두 가지 클래스이며 사용하기 매우 편리합니다.
Socket(InetAddress address, int port); Socket(InetAddress address, int port, boolean stream); Socket(String host, int prot); Socket(String host, int prot, boolean stream); Socket(SocketImpl impl) Socket(String host, int port, InetAddress localAddr, int localPort) Socket(InetAddress address, int port, InetAddress localAddr, int localPort) ServerSocket(int port); ServerSocket(int port, int backlog); ServerSocket(int port, int backlog, InetAddress bindAddr)
여기서 주소, 호스트, 포트는 각각 양방향 연결에서 상대방의 IP 주소, 호스트 이름, 포트 번호이며, 스트림은 소켓이 스트림 소켓인지 데이터그램인지를 나타냅니다. 소켓, localPort는 로컬 호스트의 포트 번호를 나타내고, localAddr 및 binAddr은 로컬 시스템의 주소(ServerSocket의 호스트 주소)이며, impl은 serverSocket과 Socket을 모두 생성하는 데 사용할 수 있는 소켓의 상위 클래스입니다. . count는 서버가 지원할 수 있는 최대 연결 수를 나타냅니다. 예: 학습 비디오 네트워크 http://www.php.cn
Socket client = new Socket("127.0.01.", 80); ServerSocket server = new ServerSocket(80);
포트를 선택할 때 주의해야 합니다. 각 포트는 특정 서비스를 제공합니다. 올바른 포트를 제공해야만 해당 서비스를 얻을 수 있습니다. 0부터 1023까지의 포트 번호는 시스템에 의해 예약되어 있습니다. 예를 들어 http 서비스의 포트 번호는 80, telnet 서비스의 포트 번호는 21, ftp 서비스의 포트 번호는 23입니다. 포트 번호를 선택하려면 충돌을 방지하기 위해 1023보다 큰 포트 번호를 선택하는 것이 가장 좋습니다.
소켓 생성 시 오류가 발생하면 IOException이 발생하며 이를 프로그램에서 처리해야 합니다. 따라서 Socket 또는 ServerSocket을 생성할 때 예외를 포착하거나 발생시켜야 합니다.
4, 간단한 클라이언트/서버 프로그램
1. 클라이언트 프로그램
import java.io.*; import java.net.*; public class TalkClient { public static void main(String args[]) { try{ Socket socket=new Socket("127.0.0.1",4700); //向本机的4700端口发出客户请求 BufferedReader sin=new BufferedReader(new InputStreamReader(System.in)); //由系统标准输入设备构造BufferedReader对象 PrintWriter os=new PrintWriter(socket.getOutputStream()); //由Socket对象得到输出流,并构造PrintWriter对象 BufferedReader is=new BufferedReader(new InputStreamReader(socket.getInputStream())); //由Socket对象得到输入流,并构造相应的BufferedReader对象 String readline; readline=sin.readLine(); //从系统标准输入读入一字符串 while(!readline.equals("bye")){ //若从标准输入读入的字符串为 "bye"则停止循环 os.println(readline); //将从系统标准输入读入的字符串输出到Server os.flush(); //刷新输出流,使Server马上收到该字符串 System.out.println("Client:"+readline); //在系统标准输出上打印读入的字符串 System.out.println("Server:"+is.readLine()); //从Server读入一字符串,并打印到标准输出上 readline=sin.readLine(); //从系统标准输入读入一字符串 } //继续循环 os.close(); //关闭Socket输出流 is.close(); //关闭Socket输入流 socket.close(); //关闭Socket }catch(Exception e) { System.out.println("Error"+e); //出错,则打印出错信息 } } }
2. 서버측 프로그램
import java.io.*; import java.Net.*; import java.applet.Applet; public class TalkServer{ public static void main(String args[]) { try{ ServerSocket server=null; try{ server=new ServerSocket(4700); //创建一个ServerSocket在端口4700监听客户请求 }catch(Exception e) { System.out.println("can not listen to:"+e); //出错,打印出错信息 } Socket socket=null; try{ socket=server.accept(); //使用accept()阻塞等待客户请求,有客户 //请求到来则产生一个Socket对象,并继续执行 }catch(Exception e) { System.out.println("Error."+e); //出错,打印出错信息 } String line; BufferedReader is=new BufferedReader(new InputStreamReader(socket.getInputStream())); //由Socket对象得到输入流,并构造相应的BufferedReader对象 PrintWriter os=newPrintWriter(socket.getOutputStream()); //由Socket对象得到输出流,并构造PrintWriter对象 BufferedReader sin=new BufferedReader(new InputStreamReader(System.in)); //由系统标准输入设备构造BufferedReader对象 System.out.println("Client:"+is.readLine()); //在标准输出上打印从客户端读入的字符串 line=sin.readLine(); //从标准输入读入一字符串 while(!line.equals("bye")){ //如果该字符串为 "bye",则停止循环 os.println(line); //向客户端输出该字符串 os.flush(); //刷新输出流,使Client马上收到该字符串 System.out.println("Server:"+line); //在系统标准输出上打印读入的字符串 System.out.println("Client:"+is.readLine()); //从Client读入一字符串,并打印到标准输出上 line=sin.readLine(); //从系统标准输入读入一字符串 } //继续循环 os.close(); //关闭Socket输出流 is.close(); //关闭Socket输入流 socket.close(); //关闭Socket server.close(); //关闭ServerSocket }catch(Exception e){ System.out.println("Error:"+e); //出错,打印出错信息 } } }
5, 다중 클라이언트를 지원하는 클라이언트/서버 프로그램
이전 클라이언트/서버 프로그램은 Server Conversation만 구현할 수 있습니다. 클라이언트와 함께. 실제 응용 프로그램에서는 종종 서버에서 영구 프로그램이 실행되어 여러 다른 클라이언트로부터 요청을 받고 해당 서비스를 제공할 수 있습니다. 서버 측에서 여러 고객에게 서비스를 제공하는 기능을 구현하려면 위 프로그램을 수정해야 하며 멀티 스레딩을 사용하여 멀티 클라이언트 메커니즘을 구현해야 합니다. 서버는 지정된 포트에 고객 요청이 있는지 항상 모니터링합니다. 고객 요청이 모니터링되면 서버는 고객의 요청에 응답하기 위해 특별한 서비스 스레드를 시작하고, 스레드 시작 후 서버 자체는 즉시 청취 상태로 들어갑니다. . 다음 고객이 도착하기를 기다리고 있습니다.
위 내용은 Geek Academy Java 비디오 튜토리얼 리소스 공유의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!