본문 바로가기
프로그래밍/Java

[자바]소켓 서버-클라이언트 통신 실습

by 청량리 물냉면 2021. 8. 19.
반응형

Server.java

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {
	public static void main(String[] args) throws IOException {
		ServerSocket server = new ServerSocket();	//서버소켓 객체 생성. client의 접속요청 받는 소켓
		server.bind(new InetSocketAddress("localhost", 6000));	//서버소켓 객체 메소드. 바인드, 5000=소켓 address port number
		System.out.println("Server start...");
		
		Socket socket = server.accept();	//client가 connect 호출할 때까지 block(대기) 상태
		System.out.println("Connected");	//여기부터 client와 통신 내용
		
		InputStream is = socket.getInputStream();
		OutputStream os = socket.getOutputStream();
		DataInputStream dis = new DataInputStream(is);
		DataOutputStream dos = new DataOutputStream(os);
		
		String str = dis.readUTF();	//문자열 읽어들이기. client가 write할 때까지 대기
		int value = dis.readInt();
		
		System.out.println(str);
		System.out.println(value);	//통신 내용 종료
		socket.close();
		server.close();
	}
}

 

코드 설명

서버 소켓 생성 및 바인딩

ServerSocket server = new ServerSocket();
server.bind(new InetSocketAddress("localhost", 6000));

 

접속 대기

Socket socket = server.accept();
  • accept(): 연결 요청이 오면 새로운 Socket 객체 반환
  • 새로 만들어진 Socket 객체를 통해 클라이언트와 통신
  • ServerSocket 클래스는 Socket 클래스와 달리 주어진 연결에 대해 입출력 스트림을 만들어주는 메소드가 없음

 

네트워크 입출력 스트림 생성

InputStream is = socket.getInputStream();
OutputStream os = socket.getOutputStream();
DataInputStream dis = new DataInputStream(is);
DataOutputStream dos = new DataOutputStream(os);
  • accept() 메소드에서 얻은 Socket 객체의 getInputStream()과 getOutputStream() 메소드를 이용하여 데이터 스트림 생성
  • 일반 스트림 입출력 방식과 동일하게 네트워크 데이터 입출력

 

클라이언트로부터 데이터 수신

String str = dis.readUTF();
int value = dis.readInt();

//클라이언트로 데이터 전송
//dos.writeInt(1000);

readUTF / readInt : 블로킹 함수. client가 connect 호출할 때까지 block(대기) 상태 유지

 

네트워크 접속 및 서버 응용프로그램 종료

socket.close();
server.close();

 

 


 

Client.java

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.net.Socket;

public class Client {

	public static void main(String[] args) throws IOException {
		Socket socket = new Socket();	//일반 소켓
		socket.connect(new InetSocketAddress("localhost", 6000)); //accept() 상태에서 대기 중인 서버소켓을 awake. 접속하고자 하는 소켓의 ip주소와 port number
		System.out.println("Connect");	
		
		InputStream is = socket.getInputStream();
		OutputStream os = socket.getOutputStream();
		DataInputStream dis = new DataInputStream(is);
		DataOutputStream dos = new DataOutputStream(os);
		
		dos.writeUTF("map");	//쓰기. server의 dis.readUTF와 대응
		dos.writeInt(2021);	//쓰기. server의 dis.readInt와 대응
		
		socket.close();
	}
}

 

코드 설명

쿨라이언트 소켓 생성 및 서버에 접속

Socket socket = new Socket();
socket.connect(new InetSocketAddress("localhost", 6000));

 

소켓으로부터 데이터를 전송할 입출력 스트림 생성

InputStream is = socket.getInputStream();
OutputStream os = socket.getOutputStream();
DataInputStream dis = new DataInputStream(is);
DataOutputStream dos = new DataOutputStream(os);

 

서버로 데이터 전송

dos.writeUTF("map");
dos.writeInt(2021);

 

네트워크 접속 종료

socket.close();

 

 


 

실행화면

좌: 서버 / 우: 클라이언트 콘솔

반응형