[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
안녕하세요, 루키스님 유익한 강의 제공해주셔서 감사합니다 항상 감사한 마음으로 수강하고 열심히 프로젝트를 진행해보고 있습니다. 현재 프로젝트에서 메인 서버에서는 모든 클라 게임 접속을 받고 로그인 및 방 입장 등을 관리합니다. 클라가 게임룸을 생성하면 해당 클라에 Host라는 오브젝트가 생성되고, 해당 오브젝트는 서버 코드를 유니티에 호환되도록 수정을 거친 상황입니다. 타 클라(로컬 네트워크 환경에서만 테스트 해보았습니다.)에서 방 목록에서 방을 선택하고 입장하면 중앙 서버에서가 호스트와 클라 사이에서 IP와 포트를 알려주는 중개 역할을 하며 두 클라이언트가 연결됩니다. 해당 게임의 사이클이 끝나 게임이 종료되면, 클라이언트들은 로비로 돌아가며 1~3의 단계가 계속해서 반복됩니다. 현재 프로젝트의 조건을 위와 같이 설정하였고, 3번까지는 테스트를 완료했고, 정상적으로 동작하는 것을 확인했습니다. 하지만 4번에서 문제가 발생하는데, 다시 방을 생성하면 클라와 호스트 사이에 패킷 전송이 되지 않는 것 같습니다. 디버깅을 통해 확인해볼 때에는 호스트측의 OnConnected 메서드는 호출되는 것으로 보아서는 클라측에서 연결에 문제가 발생하는 것 같은데, 구글링과 디버깅을 통해 여러가지 해결책을 시행해봤습니다. 연결 종료 시 완전히 소켓이 종료되도록 세션 Disconnect()를 했습니다. 소켓이 같은 주소의 포트 번호를 공유할 수 있도록 Connector와 Listener 코드의 소켓 설정 코드에 Socket socket = new Socket(endPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp); socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); 이렇게 ReuseAddress 설정을 추가했습니다. (중앙 서버 세션과 호스트 세션은 클라에서 개별적으로 다루고 있습니다)호스트 세션의 연결이 종료될 때, 호스트 세션의 _disconnected 변수를 다시 0으로 만들어, 다음 연결 시 RegisterRecv등의 코드에서 if(_disconnected == 1) return;의 조건문에 걸리지 않도록 코드를 수정해보았습니다. 2번의 방법을 시행해보기 전에는 '같은 주소의 포트를 사용할 수 없습니다?'와 같은 오류가 발생했었는데, 2번을 시행한 뒤에는 오류는 발생하지 않지만 연결이 되지 않는 것은 마찬가지인 상태입니다. 그 외에도 잡다하게 정말 많은 시도를 해보았는데, 전혀 실마리가 보이지 않아 질문합니다..ㅠㅠ
LotteGenerator 클래스에서 private final Random random = new Random(); 에서 이것만 final로 처리한 이유가 있을까요? import java.util.Random; public class LotteGenerator { private final Random random = new Random(); private int[] lotteNumbers; private int count; public int[] generate () { lotteNumbers = new int[6]; // 배열 6칸 생성 count = 0; while (count < 6) { // 1부터 45 사이의 숫자 생성 int number = random.nextInt(45) + 1; // number에 random 번호 넣기 // 중복되지 않는 경우에만 배열에 추가 if (isUnique(number)) { lotteNumbers[count] = number; count++; } } return lotteNumbers; } // 이미 생성된 번호와 중복되는지 검사 private boolean isUnique(int number) { for (int i = 0; i < count; i++) { if (lotteNumbers[i] == number) { return false; } } return true; } }
안녕하세요~ 우선 질 좋은 강의에 감사인사드립니다! 다름이 아니라 VPN 강의 속에서 VPN Tunneling to GtoG 부분을 설명해주시면서 아래와 같은 그림을 작성해주셨고, 이 때 "PC A, B가 DB 서버에 접근이 가능하지만 PC A,B 는 외부 인터넷을 사용하지 못한다" 라고 하셨는데요! 그런데 보통 회사(주로 사기업..)에서 일하다 보면 회사에서 오프라인으로 출근한 뒤(오프라인으로 출근했다 = 회사 내부 망을 이용), 회사의 내부 문서에서도 접근할 수 있게 되지만 그와 동시에 구글링도 보통 가능한데요!? (물론 회사에 따라 개인정보와 같은 매우 민감한 데이터들에 접근하기 위해서 VDI 같은 것들을 이용해서 더 깊은(?) 내부망으로 접근하면 해당 내부망에선 외부 인터넷이 안되긴 하더라구요) 이러한 경우는 어떻게 네트워크를 구성한 건가요..? 대략적으로 구조만 알려주셔도 감사하겠습니다! 또 공공기관 같은 경우는 강의에서 말씀하신 것처럼 회사 내부 망을 이용할 때는 DB 서버에 접근할 수 있되 인터넷은 접근이 안된다는 것을 지인을 통해서 들었습니다. 이 2개의 케이스의 각 네트워크 구조에서 가장 큰 차이점이 무엇인지 설명 부탁드려도 될까요? 미리 감사드립니다 🙂
안녕하세요! 카일스쿨님! battle 테이블을 영상 그대로 만들었는데도, 계속 battle 테이블에 관한 데이터에 관한 정보를 볼 수가 없어요! 빠진것 없이 최대한 꼼꼼히 다시 체크했는데도 모르겠습니다. 혹시 제가 어떤 실수를 했을지 도와주실 수 있나요? 아래는 스키마 정보와, 제가 테이블 만들때 과정을 이미지로 첨부했습니다. 감사합니다.
프로젝트 압축파일입니다. https://drive.google.com/file/d/1IRv3FX6UTERveIoq1KaZY7N_DyVLGv0b/view?usp=sharing <회원 리포지토리 테스트 케이스 작성> 강의 9:40 경에 findByName() 메서드 실행시 java.util.NoSuchElementException: No value present at java.base/java.util.Optional.get(Optional.java:143) at hello.hellospring.repository.MemoryMemberRepositoryTest.findByName(MemoryMemberRepositoryTest.java:45) at java.base/java.lang.reflect.Method.invoke(Method.java:568) at java.base/java.util.ArrayList.forEach(ArrayList.java:1511) at java.base/java.util.ArrayList.forEach(ArrayList.java:1511) 라는 오류가 발생합니다. 이 오류로 인해 findAll() 메서드까지 실행이 되지 않는 것 같습니다. get()과 관련된 오류 같아 구글링해보아도 해결이 어려워 문의남깁니다. 답변 부탁드립니다. 감사합니다.
회원 정보 수정 API를 구현하며 dirty checking을 이용한 회원 정보 update를 사용했습니다. service의 update 메소드를 호출하기 전과 후를 controller단에서 로그를 찍어보니 정보가 잘 변경되는데 DB에는 반영이 되지 않아 애를 먹었습니다. serviceImpl단의 update 메소드에 @Transactional을 붙여서 해결했습니다. 그 전에는 service단의 update 메소드에 @Transactional을 붙였더니 안되더라구요. service단의 메소드에 붙이는 @Transactional와 serviceImpl단의 메소드에 붙이는 @Transactional이 다른 트랜잭션으로 작동하는건지, 그렇다면 어디에 @Transactional을 붙이는게 맞는건지 궁금합니다.
안녕하세요 MySQL 사용하고있는데요 조인하려는 테이블이 PK가 없는 단일 값인데요 메인 select 절에 있는 컬럼이 pk 테이블에 있는 단일컬럼에 포함되는 값이 있는지 regexp_like 함수로 확인하고싶은데요 pk값이 없다보니 join 을 어떻게 할지.. 모르겠습니다 using 으로 연결해보려 했는데 (natural join은 지원안됨) 컬럼절에 regexp_like (a.테이블 컬럼, pk 없는 테이블 컬럼) 이렇게 조건을 거니까 에러가 떠서요.. 방법이 있을까요? 요약 : left join으로 pk 테이블이 없는 단일 컬럼과 같다는 조건으로 연결 시, regexp_like 를 사용해도 똑같은 값만 불러오는 에러가 발생 ex. pk 테이블이 없는 컬럼에 '사과' 라는 단어가 있다고 가정, '사과와당근' 이라는 메인 테이블의 컬럼값이 pk 테이블의 '사과' 단어가 매칭되는지 아래 조건으로 걸면 null 값으로 반환. regexp_like('사과와당근', pk 없는 테이블) - > '사과'가 포함되지만 조인조건 때문에 사과와 당근을 매칭해서 불러오지 못함.
/Hello World/WebConetnt/WEB-INF/lib/mysql-connector-j-8.3.0.jar 해당드라이버 lib 폴더에 넣고 실행하였는데 No value specified for parameter 2 에러가 발생합니다. ===== at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException( SQLError.java:130 ) at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException( SQLExceptionsMapping.java:122 ) at com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdateInternal( ClientPreparedStatement.java:1077 ) at com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdateInternal( ClientPreparedStatement.java:1003 ) at com.mysql.cj.jdbc.ClientPreparedStatement.executeLargeUpdate( ClientPreparedStatement.java:1312 ) at com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdate( ClientPreparedStatement.java:988 ) at user.UserDAO.join( UserDAO.java:17 ) ==== package user; import java.sql.Connection; import java.sql.PreparedStatement; import util.DatabaseUtil; public class UserDAO { public int join(String userID, String userPassword) { String SQL = "INSERT INTO USER VALUES (?,?)"; try { Connection conn = DatabaseUtil. getConnection (); PreparedStatement pstmt = conn.prepareStatement(SQL); // SQL에 ID와 PW를 넣어 줄 수 있도록 Setting pstmt.setString(1, userID); pstmt.setString(1, userPassword); return pstmt.executeUpdate(); // INSERT 구문을 실행해서 나온 결과를 반환하도록 해준다. // 반환값 : INSERT된 데이터 갯수 } catch (Exception e){ e.printStackTrace(); } return -1; } }
안녕하세요! 하나의 엔티티에 @ElementCollection 붙은 필드가 두 개 있는 경우를 시험해 보고 있습니다. @EntityGraph(attributePaths = {"a", "b"}) 이런 식으로 해서 테스트를 돌리면 org.hibernate.loader.MultipleBagFetchException: cannot simultaneously fetch multiple bags 과 같은 오류가 나는데 ElementCollection 두 개가 있는 경우는 하나의 쿼리로 모두 가져오는 방법은 없나요?
안녕하세요 피그마 Professional plan 으로 Design seat 4구좌로 결제를 했는데요 팀 여러개를 만들어서 동일한 사용자들에게 edit 권한을 주면 추가 결제 안되나요? A팀 1번~4번 Edit 권한 부여 B팀 1번~4번 Edit 권한 부여 C팀 1번~4번 Edit 권한 부여 한 팀에 4명에게만 Edit 권한 부여 가능한건지 궁금해서 문의드립니다.
해당 오류와 함께 유저 프로필 페이지 접속시 게시글을 불러오지 못합니다...!! 콘솔창에서는 해당 메시지와 함께 오류가 출력되는데 맨 밑에 d는 UserPosts.tsx 컴포넌트에서 찍어본 useQuery로 패칭한 데이터 찍어본것 입니다. getUserPosts.ts에서 받아온 res 값을 콘솔에 찍어봤습니다 제로초님 코드와 동일한데 어떤 이유에선지 유저 프로필 페이지 게시글을 못불러오는지 잘 모르겠어서 낑낑대다가 질문 드렸습니다...ㅠㅠ 감사합니다
type JsonBody = { success: boolean; data: any; }; declare global { namespace Express { export interface Response { json: (body: JsonBody) => this; test: (body: JsonBody) => this; } } } export {}; 라이브러리 버전 express 4.18.2 @types/express 1.17.17 get, post 등 모든 요청에서 응답으로 res.status(200).json({success:true, data: []}) 이런 형식으로 코드 자동완성 기능 이용하려고 위와 같이 Express Response에 json 타입을 오버로딩 했는데 res.status(200).json 코드를 입력하면 오버로딩한 타입은 자동완성추천에 뜨지않고 express 자체에서 작성해둔 타입 json(body?: any): Response<any, Record<string, any>, number> 이런 타입만 뜹니다. json 아래에 작성한 test는 res.status(200).test 작성시 자동완성 추천도 잘되고 객체에 success랑 data 입력하게 자동완성 기능이 잘 동작하는데 json만 동작이 안됩니다. 어떻게하면 해결할 수 있을까요?
안녕하세요, Client Socket과 이벤트를 select 하실때 FD_READ | FD_WRITE | FD_CLOSE 3가지를 동시에 바인딩하시는 이유가 궁금합니다 강의중 언급하신 'TCP 논 블로킹 소켓에서, 데이터를가 분할되서 송신될 수 있다. 하지만 웬만하면 일어나지 않는다.' 의 상황에 대응하기 위하여 send 함수 호출 시 각 인자를 수정하셨는데, FD_WRITE는, 만약 위와 같은 상황이 발생했을때, 다음 프레임에서 이벤트를 감지하기 위함이신지, 만약, 위와 같은 데이터 분할 송신이 절대 일어나지 않는경우라고 가정하면 FD_READ | FD_CLOSE 2개의 플래그만으로도 목표하신 에코서버 구현이 가능할것인지 이 궁금합니다.
강의자료에 있는 스크립트를 그대로 올려도 오류가 발생합니다. GUI Error: Invalid GUILayout state in SkillSystemWindow view. Verify that all layout Begin/End calls match UnityEngine.GUIUtility:ProcessEvent (int,intptr,bool&) -> DrawDatabase(databaseTypes[toolbarIndex]);부분 NullReferenceException: Object reference not set to an instance of an object ->drawdatabase함수의 dataType.BaseType.GetField ~~~ 부분)
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 자바 파일 다운 후 압축을 풀고 강의을 진행 후 파일을 열었는데 pdf 제목들이 한글로 뜹니다