네트워크 애플리케이션 모델은 주로 다음과 같습니다.
www(World Wide Web)는 HTML 언어와 HTTP 프로토콜을 기반으로 하는 클라이언트/서버 모델 기반의 정보 검색 시스템으로 다양한 인터넷 서비스를 제공할 수 있습니다. 네트워크 정보는 호스트의 여러 위치에 배치되며 www 서버는 하이퍼텍스트 링크를 사용하여 다양한 정보를 연결합니다. www 클라이언트(브라우저)는 서버와의 연결 설정, 서버에 요청 보내기, HTML 하이퍼미디어 처리, 그래픽 사용자 인터페이스(GUI) 제공, 정보 표시 등을 담당합니다.
클라이언트/서버 작업 모드에서는 서버 측에서 여러 클라이언트 컴퓨터의 통신을 수락할 준비를 해야 합니다. 이를 위해 IP 주소를 사용하여 인터넷에서 컴퓨터를 식별하는 것 외에도 서버 측에서 백그라운드 서비스를 제공하는 스레드를 식별하기 위해 포트 번호도 도입되었습니다. 포트 번호와 IP 주소의 조합을 네트워크 소켓이라고 합니다.
Java 언어의 C/S 모드 구현에서 소켓은 두 가지 범주로 나뉩니다.
서버 시스템은 포트(버스 I/O 주소)를 통해 클라이언트 시스템에 서비스를 제공합니다. 서버 시스템은 여러 다른 포트에서 동시에 여러 가지 다른 서비스를 제공합니다. 클라이언트는 서버의 특정 포트에 접속하여 서버에게 이 포트를 통해 서비스를 제공하도록 요청합니다. 규정: 포트 번호 0~1023은 시스템 전용입니다. 예를 들어, HTTP 프로토콜은 포트 80에 있고 텔넷 프로토콜은 포트 23에 있습니다. 포트 1024~65535는 애플리케이션에서 사용됩니다.
클라이언트 프로그램과 서버 프로그램이 통신해야 하는 경우 Socket 클래스를 사용하여 소켓 연결을 설정할 수 있습니다. 소켓 연결을 전화 통화로 생각하십시오. 처음에는 클라이언트 프로그램이 통화를 설정하고 서버 프로그램은 통화가 완료된 후 듣고 있으면 언제든지 말할 수 있습니다.
스트리밍 소켓과 데이터그램 소켓이라는 두 당사자 간의 통신을 달성하는 두 가지 선택적 방법이 있습니다.
스트리밍 소켓은 클라이언트 프로그램과 서버 프로그램 간의 통신 채널을 설정합니다. 각 소켓은 읽기 및 쓰기 작업을 모두 수행할 수 있습니다. 어느 쪽이든 상대방과의 통신 세션 프로세스는 다음과 같습니다.
소켓 연결을 설정하고, 입력/출력 스트림을 얻고, 데이터를 읽고 쓰고, 통신이 완료된 후 소켓을 닫습니다(연결 해제).
소켓 생성자를 사용하면 클라이언트 측에서 서버에 대한 소켓 객체를 설정할 수 있습니다.
소켓(문자열 호스트, int 포트): 호스트는 서버의 IP 주소이고 포트는 포트 번호이며 미리 동의되어 있습니다.
예를 들어, 코드는 다음과 같습니다.
try{ Socket mySocket = new Socket(“http://www.weixueyuan.net” ,1860) }catch(IOException e){}
그런 다음, getInputStream() 메소드를 사용하여 입력 스트림을 얻고, 이 입력 스트림을 사용하여 서버가 "라인"에 입력한 정보를 읽고, getOutputStream() 메소드를 사용하여 출력 스트림을 얻고, 이 출력 스트림을 사용하여 "라인"에 정보를 씁니다.
ServerSocket 생성자를 사용하면 클라이언트 소켓을 허용하는 서버에 서버 소켓 개체를 만들 수 있습니다.
ServerSocket(int port): 포트 번호를 지정하고 ServerSocket 객체를 생성합니다. 포트번호는 고객이 호출한 포트번호와 동일해야 합니다. 이렇게 하려면 다음 형식의 코드를 사용하세요.
try{ ServerSocket serverSocket = new ServerSocket(1860) }catch(IOException e){}
서버 측 프로그램은 클라이언트 프로그램으로부터 서비스 요청을 받으면 해당 포트에 해당하는 클라이언트 프로그램과 통신하기 위한 소켓 객체를 생성합니다. 예를 들어, 위의 코드를 실행하여 서버 소켓 개체를 생성하고 개체 serverSocket을 설정한 후 accept() 메서드를 사용하여 소켓 개체를 얻고 mySocket 소켓에서 클라이언트 프로그램으로부터 정보를 받을 수 있습니다. 다음 코드에 표시된 대로:
try{ 소켓 sc = serverSocket.accept();//ac는 소켓 객체입니다}catch(IOException e){}
서비스를 취소하려면 소켓 객체 sc를 닫으면 됩니다.
sc.close();
[예시] C/S 모드의 클라이언트 애플리케이션. 이는 클라이언트측 스트리밍 소켓 통신의 간단한 예입니다. 이 코드는 클라이언트측 프로그램을 작성하는 방법을 보여줍니다. 예제에서 클라이언트 프로그램은 연결이 설정된 후 서버 호스트의 포트 4441에 요청하고 서버에 대한 읽기 및 쓰기를 완료합니다.
import java.io.*;import java.net.*;public class Client{ public static void main(String args[]){ String s = null;Socket mySocket; DataInputStream in = null;DataOutputStream out = null; = new Socket("localhost",4441); in = new DataInputStream(mySocket.getInputStream()); DataOutputStream(mySocket.getOutputStream()); out.writeUTF("좋은 서버!"); while(true){ s = in.readUTF(); else System.out.println(s ); } mySocket.close(); }catch(IOException e){ System.out.println(“연결할 수 없습니다.”) } }
[예시] 클라이언트 측 애플리케이션에 해당하는 서버 측 애플리케이션. 프로그램은 포트 4441에서 수신 대기합니다. 클라이언트 요청이 감지되면 "Customer, hello, I am the server"가 포함된 문자열이 생성되어 클라이언트에 출력됩니다.
import java.io.*;import java.net.*;public class Server{ public static void main(String args[]){ ServerSocket 서버 = null; String s = null; in = null; try{ 서버 = new ServerSocket(4441) }catch(IOException e1){ system.out.println("ERROR:" +e1); } 시도{ you = server.accept(); in = new DataInputStream(you.getInputStream()); out = new DataOutputStream(you.getOutputStream()){ s = in.readUTF( ); if(s!=null) break; } out.writeUTF("안녕하세요, 저는 서버입니다."); e){System.out.println("ERROR:"+e);} }}
컴퓨터의 병렬 작업 능력을 최대한 활용하기 위해 소켓 연결 작업을 하나의 스레드로 완료할 수 있습니다. 클라이언트가 서버에 서비스 제공을 요청하거나 서버가 고객의 서비스 요청을 받으면 정보통신을 완료하기 위한 전용 스레드를 시작하고 이 스레드에 입출력 스트림을 생성하여 클라이언트와 클라이언트 간의 정보 교환을 완료한다. 섬기는 사람.
[예제] 스레드에 소켓 연결 작업을 배치하는 클라이언트 애플릿입니다. 인터페이스에는 메시지 보내기 버튼, 텍스트 상자 및 텍스트 영역이 있습니다. 클라이언트 애플리케이션은 먼저 서버와의 소켓 연결을 설정합니다. 데이터 입력 스트림을 사용하여 서버가 라인에 입력한 정보를 반복적으로 읽고, 수신된 정보를 텍스트 영역에 표시합니다. 검색된 정보가 "End"이면 소켓 연결이 닫히고 프로그램이 종료됩니다. 사용자는 텍스트 상자에 정보를 입력하고 정보 전송 버튼을 누를 수도 있으며, 클라이언트 프로그램은 데이터 출력 스트림을 사용하여 텍스트 상자의 내용을 서버로 보냅니다.
import java.net.*;import java.io.*;import java.awt.*;import javax.swing.*;import java.awt.event.*;import java.applet.*;public 클래스 Aclient는 Applet 구현을 확장합니다. Runnable,ActionListener{ JTextField textF; 소켓 스레드 스레드; DataOutputStream out; public void init(){ setBackground(new Color(120,153,137)); setLayout(new BorderLayout()); Button = new JButton("정보 보내기") textA = new JTextArea( 20,30); setSize(450,350); JPanel p = new JPanel(); p.add(textF); p.add(button); add(p,"South"); public void start(); new Socket(this.getCodeBase().getHost(),4441); in = new DataInputStream(socket.getInputStream()); DataOutputStream(socket.getOutputStream()); }catch(IOException e){} if(thread==null){ thread = new Thread(this)(Thread.MIN_PRIORITY) } } 공개 무효 실행(){ 문자열 s = null; while(true){ try{ s = in.readUTF() }catch(IOException e){} if(s.equals("End")){ try{ 소켓.close();break; }catch(IOException e){} }else texA.append(s + "/n") } public void actionPerformed( ActionEvent e){ if(e.getSource()==button){ String s = textF.getText(); if(s! = null){ try{ out.writeUTF(s); }catch(IOException e1){} } else{ try{ out.writeUTF("말해 주세요") } catch(IOException e1){} } } }}
[예제] 프로그램은 클라이언트와 소켓 연결을 설정하기 위해 터미널 4441을 사용합니다. 서버는 클라이언트의 요청을 받은 후 클라이언트의 소켓으로 스레드를 생성하고 시작합니다. 고객 애플리케이션이 없는 경우 고객 애플리케이션을 계속 모니터링합니다. 스레드는 클라이언트 소켓에 따라 입력 데이터 스트림 입력과 출력 데이터 스트림 출력을 설정합니다. 스레드는 고객이 라인에 입력한 정보를 읽기 위해 in을 사용합니다. 수신된 정보가 "End"이면 서버는 "End"라고 응답한 다음 소켓 연결을 닫습니다. 그렇지 않으면 "나는 당신이 나에게 말한 서버입니다"라고 응답하고 서버가 받은 정보를 반환합니다.
import java.net.*;import java.io.*;import java.awt.*;import javax.swing.*;import java.awt.event.*;import java.applet.*;public 클래스 Aclient는 Applet 구현을 확장합니다. Runnable,ActionListener{ JTextField textF; 소켓 스레드 스레드; DataOutputStream out; public void init(){ setBackground(new Color(120,153,137)); setLayout(new BorderLayout()); Button = new JButton("정보 보내기") textA = new JTextArea( 20,30); setSize(450,350); JPanel p = new JPanel(); p.add(textF); p.add(button); add(p,"South"); public void start(); new Socket(this.getCodeBase().getHost(),4441); in = new DataInputStream(socket.getInputStream()); DataOutputStream(socket.getOutputStream()); }catch(IOException e){} if(thread==null){ thread = new Thread(this)(Thread.MIN_PRIORITY) } } 공개 무효 실행(){ 문자열 s = null; while(true){ try{ s = in.readUTF() }catch(IOException e){} if(s.equals("End")){ try{ 소켓.close();break; }catch(IOException e){} }else texA.append(s + "/n") } public void actionPerformed( ActionEvent e){ if(e.getSource()==button){ String s = textF.getText(); if(s! = null){ try{ out.writeUTF(s); }catch(IOException e1){} } else{ try{ out.writeUTF("말해주세요") }catch(IOException e1){} } } }}