개인 자료란 (JE)

  서버 커뮤니티

Profile HAN1110 대표칭호 없음

HAN1110 9899e780ba984d89824a90ee8deb7cb2

Profile

커뮤니티 소통 개발하기 프로그래밍

[Java] 자바로 서버 만들기 #2 - 서버 개발 완전 집합!

2021.11.18 조회 수 762 추천 수 0

출처는 여기에 있습니다


주의! 해당 강좌는 이 게시글을 봐주신 분들을 기준으로 제작되였습니다. 보지 않았으면 보고 와주세요.


안녕하세요! HAN1110 입니다!

오늘은 자바로 서버를 만들어보겠습니다. (찐입니다. 기초 아닙니다)

일단 클래스부터 만듭시다.


전 그때 그 KOR V1 라이브러리 (정확힌 B1.5) 있는 프로젝트에

net.koreaminecraft.other

이라는 패키지를 만들고

그 패키지에 client 와 server 을 만들었습니다.


일단 Server 라는 클래스를 만들게요.

package net.other.koreaminecraft.Client;

public class Client {
    public Client() {

    }

    public static void main(String[] args) {

    }
}

이렇게 해뒀습니다. (+ 이게 서버인건 죄송해요!)

자 , 이제 try catch 문을 넣을겁니다 하기전에 일단 client 를 해둘게요(?)

제 뜻이 이해 안되는분들을 위해 소스코드를 보여드리자면

package net.other.koreaminecraft.Client;

public class Client {
    public Client() {

    }

    public static void main(String[] args) {
        new Client();
    }
}

로 했습니다.

이제 서버소캣을 생성해줍시다.

아 맞다. 이제 Client 메소드에서만 활동할겁니다. 그렇게 알고계세요.

아 서버소캣 하기전에 try catch 문을 만듭시다.

try {

} catch (Exception e) {
    
}

이유는 어떤 에러가 나든 일단 해결하기 위해서에요.

catch 는 try 가 끝난 뒤에합시다.

try 부터!

서버소캣을 생성합시다.

try {
    ServerSocket server;
} catch (Exception e) {

}

어라?????
또 오류가 나네요?

당연합니다.

살펴볼까요?

54493484118e2fd0334a76a955287b7f.png

왜일까요?

ServerSocket 은 java.net(링크라고 생각하지 마세요. 링크 어쩌다 걸린거에요) 패키지에 있답니다~

package net.other.koreaminecraft.Client;

import java.net.ServerSocket;

public class Client {
    public Client() {
        try {
            ServerSocket server;
        } catch (Exception e) {

        }
    }

    public static void main(String[] args) {
        new Client();
    }
}

이렇게 됩니다.

좋아요 , 이제 Socket 과 BufferedReader 을 다시 넣어줍시다.

아 맞다 , 소캣들 빼고는 다 java.io 패키지에요.

알고가세요!

ServerSocket server;
Socket connection;
BufferedReader in;

쉽죠?

메시지를 받아야하니 String 문자열을 만들어둡시다.

ServerSocket server;
Socket connection;
BufferedReader in;
String msg;

이제 String 빼고 다 값을 null 로 설정해줄거에요.

초기에 설정해줘도 되는데 글 길이 때문에 (ㅎㅎ;;;;;;;)

ServerSocket server;
Socket connection;
BufferedReader in;
String msg;

server = null;
connection = null;
in = null

쉽죠?

이제 try catch 문을 달아줄겁니다.

바로 달러갑시다.

ServerSocket server;
Socket connection;
BufferedReader in;
String msg;

server = null;
connection = null;
in = null;
try {
    
} catch (IOException ioe) {
    
}

어라? 또 에러가 나네요.

사실 이건 서버와 관련된 정보가 없어서 에러가 나는겁니다.

저희는 사실 여기에 5000 포트로 서버소캣을 생성하려고 왔어요.

에러가 나면 "소캣을 생성하지 못했습니다" 라고 할게요.

ServerSocket server;
Socket connection;
BufferedReader in;
String msg;

server = null;
connection = null;
in = null;
try {
    server = new ServerSocket(5000);
} catch (IOException ioe) {
    System.out.println("소캣을 생성하지 못했습니다.");
}

이제 및으로 가서 메시지를 기다리는중이라고 출력할게요. ( + 그냥 풀소스 공유!)


//Server 클래스
package net.other.koreaminecraft.Server;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {
    public Server() {
        try {
            ServerSocket server;
            Socket connection;
            BufferedReader in;
            String msg;

            server = null;
            connection = null;
            in = null;
            try {
                server = new ServerSocket(5000);
            } catch (IOException ioe) {
                System.out.println("소캣을 생성하지 못했습니다.");
            }

            System.out.println("메시지를 기다리는중");

            in = new BufferedReader(new InputStreamReader(connection.getInputStream())); //소켓에서 입력스트림을 가져옵니다

            while ((msg = in.readLine()) != null) { // 클라이언트에서 입력된 메시지를 받습니다
                System.out.println("받은 메시지 : ");
            }

            System.out.println("서버 종료");

            in.close(); //각각의 기능을 닫습니다.
            connection.close();
            server.close();
        } catch (Exception e) {

        }
    }

    public static void main(String[] args) {
        new Server();
    }
}
package net.other.koreaminecraft.Client;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;

public class Client {
    public Client() {
        try {
            Socket client;
            PrintWriter out;
            Scanner in = new Scanner(System.in);
            String msg;

            client = null;
            out = null;

            try {
                client = new Socket();
                System.out.println("서버와 연결 시도중");
                client.connect(new InetSocketAddress("localhost",5000),3000);
                System.out.println("서버와 연결 성공");
            } catch (Exception e) {
                System.out.println("알수없는 오류");
            }

            out = new PrintWriter(client.getOutputStream(), true);

            System.out.println("메시지를 보내시요");
            while((msg = in.nextLine()) != null) {
                if (!msg.equals(null)) {
                    break;
                }
                out.println(msg);
                System.out.println("보낼 메시지가 더 있으면 더 보내세요");
            }

            System.out.println("클라이언트가 종료되였습니다.");
            out.close();
            in.close();
            client.close();
        } catch (Exception e) {
            System.out.println("[Exception] 알수없는 오류로 인한 클라이언트 종료");
        }
    }

    public static void main(String[] args) {
        new Client();
    }
}

서버를 먼저 실행하고 클라이언트를 실행하면..!

저도 모르지만 서버가 종료됩니다.

일단 제 컴의 문제지 님들 컴의 문제는 아니에요.

다음엔 GUI 강좌로 찾아뵙겠습니다!

ㅂㅂ

23개의 댓글

허두
2021.11.18

선생님..! 여기 connection = server.accept(); 구문 빠진것같아요..!

HAN1110
2021.11.18
@허두

으어ㅓㅓㅓ! 정확하네요! 진짜 빠짐. ㄷㄷㄷㄷㄷ.

근데 문제는 BufferedReader 에서 오류가 난다는점.

해결 부탁드려요

허두
2021.11.18
@HAN1110

아잌ㅋㅋㅋㅋㅋㅋㅋㅋ 무슨 오류가 나는데요?

HAN1110
2021.11.19
@허두

connection = server.accept();

가 없어서 일어나는 문제요

허두
2021.11.19
@HAN1110

? 그거 넣어주시면 해결 아닌가용

HAN1110
2021.11.20
@허두

예.

허두
2021.11.20
@HAN1110

??? 저만 이해 안되는거 아니져?

HAN1110
2021.11.20
@허두

맞을걸요?

전 귀찮아서 netty 배웁니다 ㅋㅋㅋㅋㅋㅋ

HAN1110
2021.11.18
@하이라이트|highright

그게 뭐에요?

@HAN1110

언블로킹 비동기 이벤트식 네트워킹 프레임워크입니다

속도도 더 빠르고 전 netty부터 배워서 ㅋㅋ

HAN1110
2021.11.29
@하이라이트|highright

비동기가 무어지.....

@HAN1110

많이 배우시고 오시면 됩니다~

명이
2021.11.19

패키지 이름이 대문자요?

:\

HAN1110
2021.11.19
@명이

예?

첫글자가 대문자만 아니면 됩니다

명이
2021.11.19
@HAN1110

패키지 네임에 소문자를 사용하는것은 권고사항이긴 하지만, 국제적인 규칙이긴 해서...

HAN1110
2021.11.19
@명이

국제적 규칙이요?

명이
2021.11.19
@HAN1110

ㅖ...

그리고, 보통 패키지 이름은 자신이 소유한 도메인을 사용합니다.

만약 본인이 koreaminecraft.net을 소유하고 계시다면 net.koreaminecraft.~~로 사용하실 수 있습니다.

프로젝트
2021.11.19
@명이

그리고 패키지에는 대문자가 절때로 들어가지 않는것이 규칙이구요,

HAN1110
2021.11.19
@프로젝트

예ㅖㅖㅖㅖㅖㅖㅖㅖㅖ???????????????????????????????

망.했.다.

HAN1110
2021.11.19
@명이

전 한마포에 올리려고 저렇게 하고있었는데요?

따로 이유가 있으니 그건 무시해주시고 ㅋㅋ

명이
2021.11.19
@HAN1110

net.other.koreaminecraft가 거슬렸을뿐입니당

HAN1110
2021.11.19
@명이

엨ㅋㅋㅋㅋㅋㅋㅋ

뉴스 및 창작물
/files/thumbnails/762/770/003/262x150.crop.jpg?20240418073724

레드스톤

T.B.H (고민중독) | 노트블럭 버전 | NoteBlock Cover [한국어 영어 중국어 가사 추가]

노트블럭전문가

2024-04-18

0

/files/thumbnails/218/767/003/262x150.crop.jpg?20240412130213

레드스톤

우리의 꿈 - 원피스 오프닝

노트블럭전문가

2024-04-12

0

/files/thumbnails/505/766/003/262x150.crop.jpg?20240411122306

레드스톤

기동전사 건담 수성의 마녀 | 노트블럭 커버 1

노트블럭전문가

2024-04-11

1

/files/thumbnails/932/765/003/262x150.crop.jpg?20240410124459

레드스톤

마인크래프트 노트블록으로 만든 『 밤양갱 (Bam Yang Gang) 』

노트블럭전문가

2024-04-10

0

/files/thumbnails/403/765/003/262x150.crop.jpg?20240409190538

레드스톤

마인크래프트 노트블록으로 만든 『 밤양갱 (Bam Yang Gang) 』

Sonttukk

2024-04-09

4