수색…


소개

소켓은 저수준 네트워크 인터페이스로, 동일한 컴퓨터에서 실행될 수도 있고 실행되지 않을 수도있는 두 프로그램 간의 클라이언트를 연결하는 데 도움이됩니다.

소켓 프로그래밍은 가장 널리 사용되는 네트워킹 개념 중 하나입니다.

비고

인터넷 프로토콜 트래픽에는 두 가지 유형이 있습니다.
1. TCP - 전송 제어 프로토콜 2. UDP - 사용자 데이터 그램 프로토콜

TCP는 연결 지향 프로토콜입니다.
UDP는 비 연결 프로토콜입니다.

TCP는 높은 신뢰성이 요구되는 어플리케이션에 적합하며, 전송 시간은 상대적으로 덜 중요합니다.

UDP는 게임과 같이 빠르고 효율적인 전송이 필요한 애플리케이션에 적합합니다. UDP의 무 상태 속성은 수많은 클라이언트의 작은 쿼리에 응답하는 서버에도 유용합니다.

더 간단한 단어 -
데이터를 잃어 버릴 여유가 없거나 데이터 송수신 시간이 중요하지 않은 경우 TCP를 사용하십시오. 느슨한 시간과 데이터 손실이 문제가되지 않을 때 UDP를 사용하십시오.

전송 된 데이터는 그대로 유지되며 TCP의 경우와 동일한 순서로 도착합니다.
UDP에서 보낸 메시지 나 패킷이 전혀 도달하지 않을 것이라는 보장은 없습니다.

간단한 TCP 에코 백 서버

우리의 TCP 에코 백 서버는 별도의 스레드입니다. 처음부터 간단합니다. 그것은 당신이 무엇을 보내고 대문자 형태로 되 돌리는 것입니다.

public class CAPECHOServer extends Thread{

    // This class implements server sockets. A server socket waits for requests to come 
    // in over the network only when it is allowed through the local firewall
    ServerSocket serverSocket;
    
    public CAPECHOServer(int port, int timeout){
        try {
            // Create a new Server on specified port.
            serverSocket = new ServerSocket(port);
            // SoTimeout is basiacally the socket timeout.
            // timeout is the time until socket timeout in milliseconds
            serverSocket.setSoTimeout(timeout);
        } catch (IOException ex) {
            Logger.getLogger(CAPECHOServer.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    
    @Override
    public void run(){ 
        try {
            // We want the server to continuously accept connections
            while(!Thread.interrupted()){
                
            }
            // Close the server once done.
            serverSocket.close();
        } catch (IOException ex) {
            Logger.getLogger(CAPECHOServer.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    
}

이제 연결을 수락하십시오. run 메서드를 업데이트하자.

@Override
public void run(){ 
    while(!Thread.interrupted()){
        try {
            // Log with the port number and machine ip
            Logger.getLogger((this.getClass().getName())).log(Level.INFO, "Listening for Clients at {0} on {1}", new Object[]{serverSocket.getLocalPort(), InetAddress.getLocalHost().getHostAddress()});
            Socket client = serverSocket.accept();  // Accept client conncetion
            // Now get DataInputStream and DataOutputStreams
            DataInputStream istream = new DataInputStream(client.getInputStream()); // From client's input stream
            DataOutputStream ostream = new DataOutputStream(client.getOutputStream());
            // Important Note
            /*
                The server's input is the client's output
                The client's input is the server's output
            */
            // Send a welcome message
            ostream.writeUTF("Welcome!");
            
            // Close the connection
            istream.close();
            ostream.close();
            client.close();
        } catch (IOException ex) {
            Logger.getLogger(CAPECHOServer.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    
    // Close the server once done
    
    try {
        serverSocket.close();
    } catch (IOException ex) {
        Logger.getLogger(CAPECHOServer.class.getName()).log(Level.SEVERE, null, ex);
    }
}

이제 텔넷을 열어 연결을 시도하면 환영 메시지가 나타납니다.

지정한 포트와 IP 주소로 연결해야합니다.

다음과 비슷한 결과가 나타납니다.

Welcome!

Connection to host lost.

연결을 끊은 이유는 연결을 끊었 기 때문입니다. 때때로 우리는 우리 자신의 TCP 클라이언트를 프로그램해야 할 것입니다. 이 경우 사용자로부터 입력을 요청하여 네트워크를 통해 전송하고 대문자로 입력해야하는 클라이언트가 필요합니다.

서버가 먼저 데이터를 보내는 경우, 클라이언트는 먼저 데이터를 읽어야합니다.

public class CAPECHOClient extends Thread{

Socket server;
Scanner key; // Scanner for input

    public CAPECHOClient(String ip, int port){
        try {
            server = new Socket(ip, port);
            key = new Scanner(System.in);
        } catch (IOException ex) {
            Logger.getLogger(CAPECHOClient.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    
    @Override
    public void run(){
        DataInputStream istream = null;
        DataOutputStream ostream = null;
        try {
            istream = new DataInputStream(server.getInputStream()); // Familiar lines
            ostream = new DataOutputStream(server.getOutputStream());
            System.out.println(istream.readUTF());  // Print what the server sends
            System.out.print(">");
            String tosend = key.nextLine();
            ostream.writeUTF(tosend);   // Send whatever the user typed to the server
            System.out.println(istream.readUTF());  // Finally read what the server sends before exiting.
        } catch (IOException ex) {
            Logger.getLogger(CAPECHOClient.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            try {
                istream.close();
                ostream.close();
                server.close();
            } catch (IOException ex) {
                Logger.getLogger(CAPECHOClient.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }
}

이제 서버를 업데이트하십시오.

ostream.writeUTF("Welcome!");
            
String inString = istream.readUTF();    // Read what the user sent
String outString = inString.toUpperCase();  // Change it to caps
ostream.writeUTF(outString);
            
// Close the connection
istream.close();

이제 서버와 클라이언트를 실행하면 다음과 비슷한 결과가 나옵니다.

Welcome!
>


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow