Server
- ServerSocket
TCP소켓 통신을 위해 port번호를 지정하여 ServerSocket객체를 생성
> ServerSocket 서버소켓이름 = new ServerSocket( port번호 ); - accept() 메서드
==> Client에서 연결 요청이 올 때까지 계속 기다린다
==> 연결 요청이 오면 새로운 Socket객체를 생성해서 Client의 Socket과 연결한다
> Socket 소켓이름 = 서버소켓이름.accept(); - IP/ Port번호
- (접속한 사람) 소켓의 ip주소
> 소켓이름.getInetAddress().getHostAddress() - (접속한 사람) 소켓의 port번호
> 소켓이름.getPort() - (자신) ip 주소
> 소켓이름.getLocalAddress() - (자신) port번호
> 소켓이름.getLocalPort()
- (접속한 사람) 소켓의 ip주소
- Client가 보내준 메세지 받기
- Socket객체의 InputStream 객체를 이용한다
Socket의 getInputStream()메서드를 이용하여 InputStream객체를 구한다
> InputStream in = socket.getInputStream();
DataInputStream din = new DataInputStream(in);
- Socket객체의 InputStream 객체를 이용한다
- Client에서 받은 메세지를 그대로 다시 보내기
- Socket객체의 OutputStream객체를 이용한다
Socket의 getOutputStream()메서드를 이용하여 OutputStream객체를 구한다
> DataOutputStream dout = new DataOutputStream(socket.getOutputStream());
- Socket객체의 OutputStream객체를 이용한다
- 소켓과 서버는 스트림과 같이 close()를 해줘야함
더보기
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class TcpServer01 {
public static void main(String[] args) throws IOException {
// TCP소켓 통신을 위해 port번호를 지정하여 ServerSocket객체를 생성한다
ServerSocket server = new ServerSocket(7777);
System.out.println("서버가 접속을 기다립니다...");
System.out.println();
// accept() 메서드 ==> Client에서 연결 요청이 올 때까지 계속 기다린다
// ==> 연결 요청이 오면 새로운 Socket객체를 생성해서 Client의 Socket과 연결한다
Socket socket = server.accept();
// accept()메서드 호출 이후에는 접속이 완료된 후에 처리할 내용을 작성하면 된다
System.out.println("클라이언트가 연결되었습니다..");
System.out.println();
System.out.println("접속한 상대방 컴퓨터의 정보 확인");
System.out.println("IP 주소 : "+socket.getInetAddress().getHostAddress());
System.out.println("Port번호 : "+socket.getPort());
System.out.println();
System.out.println("현재 컴퓨터의 정보 확인");
System.out.println("IP 주소 : "+socket.getLocalAddress());
System.out.println("Port번호 : "+socket.getLocalPort());
System.out.println();
// Client가 보내준 메세지 받기
// ==> Socket객체의 InputStream 객체를 이용한다
// ==> Socket의 getInputStream()메서드를 이용하여 InputStream객체를 구한다
InputStream in = socket.getInputStream();
DataInputStream din = new DataInputStream(in);
// 클라이언트가 보낸 메세지를 받아서 출력한다
String str = din.readUTF(); // 수신 (입력)
System.out.println("Client로 부터 받은 메세지 : "+str);
System.out.println();
// Client에서 받은 메세지를 그대로 다시 보내기
// ==> Socket객체의 OutputStream객체를 이용한다
// ==> Socket의 getOutputStream()메서드를 이용하여 OutputStream객체를 구한다
DataOutputStream dout = new DataOutputStream(socket.getOutputStream());
// 상대방에게 메세지보내기
dout.writeUTF(str); // 송신 (출력)
System.out.println("클라이언트에게 메세지를 보냈습니다");
System.out.println();
// 스트림과 소켓 닫기
din.close();
dout.close();
socket.close();
server.close();
}
}
Client
- 접속할 서버의 IP주소(또는 컴퓨터이름)와 포트번호를 지정하여 Socket객체를 생성
> Socket scoket = new Socket("서버의 IP주소 또는 컴퓨터이름",포트번호);
(Socket 객체는 생성이 완료되면 지정한 서버로 요청 신호를 보낸다)
자신의 컴퓨터를 나타내는 방법
1) 원래의 IP주소 : 예) 192.168.145.20
2) 지정된 IP주소 : 127.0.0.1 (내 컴퓨터를 의미)
3) 원래의 컴퓨터 이름 : 예) DESKTOP-57ROHKQ
4) 지정된 컴퓨터 이름 : localhost
- Socket 객체가 생성된 이후엔 서버와 연결이 완료된 상태가 됨
- 서버로 부터 메세지를 보낸다면
- 보내기
DataOutputStream dout = new DataOutputStream( socket.getOutputStream() ); - 출력
DataInputStream din = new DataInputStream( socket.getInputStream() );
- 보내기
- 사용한 소켓과 스트림을 close()해준다
더보기
package kr.or.ddit.basic.tcp;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;
public class TcpClient01 {
public static void main(String[] args) throws UnknownHostException, IOException {
Scanner scan = new Scanner(System.in);
// 자신의 컴퓨터를 나타내는 방법
// 1) 원래의 IP주소 : 예) 192.168.145.20
// 2) 지정된 IP주소 : 127.0.0.1 (내 컴퓨터를 의미)
// 3) 원래의 컴퓨터 이름 : 예) DESKTOP-57ROHKQ
// 4) 지정된 컴퓨터 이름 : localhost
System.out.println("서버에 접속합니다");
// 접속할 서버의 IP주소(또는 컴퓨터이름)와 포트번호를 지정하여 Socket객체를 생성\
// Socket 객체는 생성이 완료되면 지정한 서버로 요청 신호를 보낸다
// Socket socket = new Socket("서버의 IP주소 또는 컴퓨터이름",포트번호);
Socket socket = new Socket("localhost",7777);
// Socket객체가 생성된 이후는 서버와 연결이 완료된 상태가 된다.
// 그러므로 서버에 연결된 상태에 처리할 내용을 작성하면 된다.
System.out.println("서버에 연결되었습니다");
System.out.println();
System.out.print("서버로 보낼 메세지 입력 >> ");
String str = scan.nextLine();
// 서버로 데이터(메세지) 보내기
OutputStream out = socket.getOutputStream();
DataOutputStream dout = new DataOutputStream(out);
dout.writeUTF(str);
System.out.println("메세지를 보냈습니다");
System.out.println();
// 서버가 보내준 메세지를 받아서 출력하기
DataInputStream din = new DataInputStream(socket.getInputStream());
System.out.println("서버로부터 받은 메세지 : "+din.readUTF());
// 스트림과 소켓 닫기
dout.close();
din.close();
socket.close();
}
}
cmd에서 각각의 java를 실행하기
해당 java 프로젝트를 실행한 폴더의 bin폴더로들어가 그 창에서 cmd입력 해당 폴더의 위치로 cmd가 실행이 된다
각각 서버와 클라이언트 프로젝트 자바를 java (package).java이름 으로 실행
(이 때 서버를 먼저 실행시켜야 정상 동작된다)
스레드를 활용하여 채팅 예제
Receiver 스레드 클래스
더보기
import java.io.DataInputStream;
import java.io.IOException;
import java.net.Socket;
import java.util.Scanner;
// 이 스레드 클래스는 소켓을 통해서 메세지를 받아서 화면에 출력하는 역할을 담당한다
public class Receiver extends Thread{
private Socket socket;
private DataInputStream din;
// 생성자
public Receiver(Socket socket) {
this.socket = socket;
// 스트림 객체 구하기
try {
din = new DataInputStream(this.socket.getInputStream());
} catch (Exception e) {
// TODO: handle exception
}
}
@Override
public void run() {
// 스레드가 처리할 내용은 사용자가 입력한 메세지를 이름과 같이 상대방에게 전송한다.
while(din!=null) {
try {
System.out.println(din.readUTF());
} catch (Exception e) {
// TODO: handle exception
}
}
}
}
Sender 스레드 클래스
더보기
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.util.Scanner;
// 이 스레드 클래스는 소켓을 이용하여 메세지를 보내는 역할을 담당한다
public class Sender extends Thread{
private Socket socket;
private DataOutputStream dout;
private String name;
private Scanner scan;
// 생성자
public Sender(Socket socket) {
this.socket = socket;
scan = new Scanner(System.in);
System.out.print("이름 입력 >> ");
name=scan.nextLine();
// 스트림 객체 구하기
try {
dout = new DataOutputStream(this.socket.getOutputStream());
} catch (Exception e) {
// TODO: handle exception
}
}
@Override
public void run() {
// 스레드가 처리할 내용은 사용자가 입력한 메세지를 이름과 같이 상대방에게 전송한다.
while(dout!=null) {
try {
dout.writeUTF(name + " : "+ scan.nextLine());
} catch (Exception e) {
// TODO: handle exception
}
}
}
}
Server 스레드
더보기
package kr.or.ddit.basic.tcp;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class TcpServer02 {
public static void main(String[] args) throws IOException {
// ServerSocket을 생성하고 클라이언트가 접속해오면
// 클라이언트와 연결된 Socket을 만들어서
// 메세지를 받는 스레드와 메세지를 보내는 스레드에 이 Socket을 주입해서 실행하면된다.
ServerSocket server = new ServerSocket(7777);
System.out.println("서버가 준비 중입니다");
System.out.println();
Socket socket = server.accept();
Sender sender = new Sender(socket);
Receiver receiver = new Receiver(socket);
sender.start();
receiver.start();
}
}
Client 스레드
더보기
package kr.or.ddit.basic.tcp;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;
public class TcpClient02 {
public static void main(String[] args) {
// Socket 객체를 생성하여 서버에 연결 요청을 하고
// 연결이 완료되면 이 Socket객체를
// 메세지를 받는 스레드와 메세지를 보내는 스레드에 이 Socket을 주입해서 실행하면된다.
System.out.println("서버에 접속합니다");
try {
Socket socket = new Socket("localhost", 7777);
System.out.println("서버에 연결되었습니다");
System.out.println();
Sender sender = new Sender(socket);
Receiver receiver = new Receiver(socket);
sender.start();
receiver.start();
} catch (Exception e) {
// TODO: handle exception
}
}
}
여러사람과 대화하고 싶다면 socket을 배열이나 collection에 저장하여 실행한다
'JAVA > HIGH JAVA' 카테고리의 다른 글
과제 - POI 라이브러리 (0) | 2024.05.10 |
---|---|
5/9 Homework - 네트워킹을 이용한 파일 복사 (0) | 2024.05.09 |
[JAVA] 네트워킹 - InetAddress, URL, URLConnection (0) | 2024.05.08 |
5/7 Homework - 전화번호 관리 + 데이터 (0) | 2024.05.08 |
[JAVA] 입출력 ( I/O ) - Buffered 스트림, Object 스트림, serialization (0) | 2024.05.07 |