1. 소켓 클래스
import java.net.* 패키지에서 소켓프로그래밍 관련된 API를 제공하고 있습니다.
해당 패키지에는 소켓패키지가 정의가 되있습니다.
client 소켓에는 accept()가 있고 server 소켓에서는 ServerSocket이라는 것에서 지원하고 있습니다.
참고로 UDP 소켓은 DatagramSocket을 사용한다.
1-1. java.net.Socket
클라이언트 소켓을 얻을 수 있습니다. 다음과 같은 기능을 사용할 수 있는데요.
Socket(String host, int port) : 소켓 객체를 만들 수 있습니다.
InputStream getInputStream()
OutputStream getOutputStream()
close()
1-2. java.net.ServerSocket
ServerSocket(int port) : 포트번호를 이용해 서버 소켓을 생성하고 특정 포트번호에 바인드 됩니다.
Socket Accept()
1-3. 클라이언트 전용 소켓 생성하기
다음과 같이 welcoming socket과 accept를 하면, 클라이언트와 메세지를 주고 받을 수 있는 소켓이 하나 생성됩니다.
다음과 같이 소켓을 생성할 수 있는데요. (여러 방법)
Socket(InetAddress server, int port);
Socket(String hostname, int port); //대표적
Socket(InetAddress server, int port, InetAddress local, int localport);
1-4. IP 얻어오기
– static InetAddress getByName(String host)
– static InetAddress[] getAllByName(String host) : 여러개 호스트에 맵핑되는 IP주소를 얻어올 수 있습니다.
– static InetAddress getLocalHost() : 자신의 PC의 IP주소를 얻을 수 있습니다.
예시
InetAddress x = InetAddress.getByName( “sw.gachon.ac.kr”);
x는 소켓을 생성할 때 매개로 보낼 수 있습니다.
예외처리
Throws UnknownHostException : IP주소를 못 얻어 올 때
try {
InetAddress ad = InetAddress.getByName(hostname); System.out.println(hostname + ":" +
ad.getHostAddress()); } catch (UnknownHostException e) {
}
System.out.println("No address found for " + hostname);
1-5. 클라이언트 구현 : 127.0.0.1
import java.io.*;
import java.net.*;
USE: 127.0.0.1
class TCPClient {
public static void main(String argv[]) throws Exception
{
String modifiedSentence;
Socket clientSocket = new Socket("hostname", 6789);
BufferedReader inFromUser =
new BufferedReader(new InputStreamReader(System.in));
DataOutputStream outToServer =
new DataOutputStream(clientSocket.getOutputStream());
BufferedReader inFromServer = new BufferedReader(new
InputStreamReader(clientSocket.getInputStream())); sentence = inFromUser.readLine(); outToServer.writeBytes(sentence + '\ n'); modifiedSentence = inFromServer.readLine(); System.out.println("FROM SERVER: " + modifiedSentence); clientSocket.close();
} }
hostname에 127.0.0.1(루프 백 아이피 주소)을 적게된다면 내 로컬 호스트 안에서 네트워킹이 일어나게끔 지원합니다. 즉, PC 1대에서 클라이언트 서버 모두 구현할 수 있습니다.
바인딩된 소켓의 인풋 아웃풋 스트림을 여는 것을 볼 수 있습니다.
같은 PC 내에서 IP주소는 필요 없지만 그렇게 흉내낼 수 있는 IP주소로 127.0.0.1을 쓰는 것이다.
1-6. 서버 구현 : 127.0.0.1
import java.io.*;
import java.net.*;
class TCPServer {
public static void main(String argv[]) throws Exception{
String clientSentence; String capitalizedSentence;
ServerSocket welcomeSocket = new ServerSocket(6789);
while(true) {
Socket connectionSocket = welcomeSocket.accept();
BufferedReader inFromClient = new BufferedReader(new InputStreamReader(connectionSocket.getInputStream()));
}
DataOutputStream outToClient =new DataOutputStream( connectionSocket.getOutputStream());
clientSentence = inFromClient.readLine(); capitalizedSentence = clientSentence.toUpperCase() + '\ n'; outToClient.writeBytes(capitalizedSentence);
}}}
이 때 클라이언트와 똑같은 포트 번호를 사용합니다.
2. Thread
스레드는 프로세스 내에서 flow of control 입니다.
또한 다른 스레드와 동시에 동작할 수 있는 코드의 조각입니다.
각각의 스레드는 각각의 call stack을 가지고 있습니다.
각각의 virtual machine 하나는 적어도 하나의 메인 스레드를 가지고 있습니다. 만약 하나의 스레드를 생성을 하면 main thread + work thread 인 것 입니다.
1:다 프로그램을 만드려면 스레드를 이용해야합니다. 스레드는 소켓프로그래밍과 세트라고 볼 수 있습니다.
로컬스레드는 동시에 일을 처리하는 것처럼 자원을 나눠서 사용합니다.
싱글스레드는 하나의 일이 순차적으로 진행되지만, 멀티스레드는 한 프로세스에서 여러개의 일들이 수행됩니다.
2-1. 서버가 많은 스레드를 동시에 처리하려면?
해당 코드는 클라이언트 하나가 메세지를 보내면 block되기 때문에 다른 클라이언트의 메세지를 읽을 수 없습니다.
때문에 서버에서는 여러개의 스레드를 클라이언트 단위로 생성해줘야 합니다.
2-2. 스레드를 생성하는 방법
1) Thread class를 extends하는 방법
스레드를 상속해서 새로운 스레드를 정의합니다. 그 후 run 메소드를 재정의해줍니다. (34:00)
2) Runnable을 implements하는 방법
'CS > 컴퓨터 네트워크' 카테고리의 다른 글
컴퓨터 네트워크 14일차 : fast retransmit / flow control / connection management (0) | 2021.10.18 |
---|---|
컴퓨터 네트워크 13일차 : TCP/IP, ACK time out 시퀀스넘버 (0) | 2021.10.13 |
컴퓨터 네트워크 11-2일차 : 소켓프로그래밍 (0) | 2021.10.06 |
컴퓨터 네트워크 11-1일차 : Pipelined protocol (GO-BACK-N / Selective Repeat) (0) | 2021.10.06 |
컴퓨터 네트워크 10일차 : transport layer rdt / 9일차 복습 (0) | 2021.10.03 |