묻고 답해요
156만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨기초 탄탄! 독하게 시작하는 Java Part 3(하) : 소켓과 파일 I/O
reader.readLine() == null 의미
TCP 에코 서버 실습하던 와중에 반복문 조건에서 궁금한게 있어서 질문 남김니다. while((msg = reader.readLine()) != null) { // 로직 }Q. 클라이언트가 연속적으로 msg를 보낼 의도가 있고 그렇게 보낸다고 해도 저 서버쪽의 반복문 안에서 로직을 처리하고 다시 조건을 확인하는 cycle이 엄청 빠를텐데 1. 만약 클라이언트는 여러번 메시지를 보낼 꺼지만, 서버입장에선 1cycle을 돌고 .readLine()으로 했을 때 reader(inputStream)가 비어있으면 null이지 않나요??2. 저런 조건에서 null 조건이 성립하려면 EOF일 때만 null이되서 반복문을 빠져나오는건가요? 3. 아니면 애초에 null일 상황은 없지만 무한 루프를 만들기 위한 장치 인가요??
-
해결됨기초 탄탄! 독하게 시작하는 Java Part 3(하) : 소켓과 파일 I/O
윈도우 IOCP 가 DMA 랑 다른 개념인가요?
영상만 보면 네트워크 하드웨어에서 VMS 메모리 공간으로 바로 보내주는거로 보이는데 이게 DMA 랑 다른 개념인가 싶어서 질문 남깁니다.
-
해결됨기초 탄탄! 독하게 시작하는 Java Part 3(하) : 소켓과 파일 I/O
소켓의 본질은 파일이다.
안녕하세요! 강의 잘 보고 있습니다.강의 내용중 - "File + a"가 있고 - "a"에 해당되는 내용이 네트워크(port번호, IP주소)가 되면 - "file + a" == 소켓이다.이렇게 말씀하셨는데 그러면 앞에서 쭉 강의 하셨던 내용을 토대로 생각해보면 제가 작성한 A,B가 맞는 내용인가요? 아니면 C가 맞는 내용인가요? 아래 그림도 첨부했습니다!A. "a"에 해당하는 네트워크 정보가 있기 때문에 서버와 클라이언트는 각 소켓을 통해 데이터를 주고 받고가 가능.B. 이때 클라이언트에서 hello!라는 mgs를 소켓을 통해 전송하면 : 로컬(서버)에 "file"이라는 1차원 선형 공간에는 data(그림의 경우 클라이언트가 전송한 String타입의 data)이 저장되고 해당 file을 콘솔에 출력하거나, txt로 저장하거나 할 수 있다.C. A,B 둘 다 아니고 소켓은 (장치파일 + a(네트워크 정보))이고 소켓에 send,recv 행위를 하는 것은 장치파일에 write,read 하는 것과 같은 행위이다. 그림에서 클라이언트의 msg를 서버에서 recv 하면 장치파일에 [hello]가 저장되고 그것을 콘솔에 출력하거나 별도의 파일로 저장할 수 있는 것 이라는 의미인가요...??
-
해결됨기초 탄탄! 독하게 시작하는 Java Part 3(하) : 소켓과 파일 I/O
파일 접근 오류 (경쟁 조건) <-- Lock 관련 질문
해당 로직을 보니깐 리엔트리 락을 사용 하고 있는 것을 보여집니다.그런데 말씀 하신 내용 처럼 T1 스레드가 "Hello"T2 스레드가 "World" 특정 파일에 쓰기를 동시적으로 여러번 하는데HWellorl <-- 이렇게 단어가 혼잡되어서 쓰기가 되지 않는 이유에 대해서 이해가 안가서 질문 드립니다. 1번 쓰레드가 writeData("Hello");2번 쓰레드가 writeData("World"); 이렇게 멀티스레드로 실행하게 된다면 writeData 메소드를 구현하신 내용을 보면 FileWriter writer = new FileWriter("C:/Tmp/test.txt");이렇게 새롭게 인스턴스를 새롭게 만들어서 각각 실행하기 때문에 this.lock해당 lock 객체를 호출 할때 각각 스레드 수준에서 ThreadSafe 한 것이 아닌가요? (제가 잘못 알고 있을 수도 있습니다! ) 그러니깐 만약 이렇게FileWriter writer = new FileWriter("C:/Tmp/test.txt"); Thread t1 = new Thread(new Runnable() { @Override public void run() { try { writer.write("World");("Hello"); } catch (IOException e) { throw new RuntimeException(e); } } }); Thread t2 = new Thread(new Runnable() { @Override public void run() { try { writer.write("World"); } catch (IOException e) { throw new RuntimeException(e); } } }); writer 전역 변수를 만약에 T1 쓰레드하고 T2 쓰레드가 동일하게 참조해서 사용한다면 이해가 갈텐데선생님께서 만들어주신 코드는 지역 변수로 FileWriter 객체를 생성하고 지역 변수 내에서 소멸되기 때문에 T1, T2 하고 동시화 기법에는 동작 하지 않을 것 같아서 질문 드립니다.
-
해결됨기초 탄탄! 독하게 시작하는 Java Part 3(하) : 소켓과 파일 I/O
확장자에 대하여.. 문득 깨달은게 맞는지 확인.
제가 예전에 파일의 확장자를 임의로 바꾸니까 바뀌어진적이 있었거든요..그런것과 배운것을 유추해보건데... 사실 저장되어있는 "파일 덩어리" 그자체만 봤을때이거를 어떻게 읽어야하는지 알수가없는거죠?그러니까 동영상파일이든 word 파일이든 다 저장은 010101 이렇게 되어있어서 그것 자체만으로는 구분이 불가능하고... 이거를 어떻게 해석해야하는지 운영체제에게 알려주기위해서 확장자가 있는걸까요?
-
해결됨기초 탄탄! 독하게 시작하는 Java Part 3(하) : 소켓과 파일 I/O
게임과 스트림에 대해서 (이해한게 맞는지 확인 질문)
음.. 제가 이해한게 맞는지 확인차 질문드립니다. 1) 컴퓨터가 켜지고 게임파일을 읽으면 inputStream이라는 걸로 파일을 설정한 단위로 읽어온다.2) 그런데 게임은 항상 순차적으로 진행되는건 아니니.. 필요한 부분을 offset으로 해당하는 부분을 찾아서 읽어온다.3) 이게 실시간으로 잘되면 로딩없이 끊김없이 잘 굴러가는거고, 느리거나 파일이 너무크면 로딩등 딜레이가 생기는거다. 결론: 파일이 어떠한 레스토랑에 있는 모든 음식이라면.. cpu는 사람이고스트림은 "음식을 전달하는 파이프라인"이다. 이런느낌으로 이해하면되나요?
-
해결됨기초 탄탄! 독하게 시작하는 Java Part 3(하) : 소켓과 파일 I/O
mac 사용자 폴더 생성 경로 변경
String tmpPath = "C:/Tmp";mac은 예제에 있는 경로가 맞지 않아 아래 에러가 발생합니다.Caused by: java.io.IOException: No such file or directory그래서 올바른 홈 경로를 변경해줘야 합니다.아래의 경로로 변경String tmpPath = System.getProperty("user.home") + "/Temp";이렇게 경로를 바꿔주시면 /Users/{username} 경로에 정상적으로 생성됩니다. 혹시 모르는 분이 계실까봐 작성해둡니다.
-
해결됨기초 탄탄! 독하게 시작하는 Java Part 3(하) : 소켓과 파일 I/O
createNewFile() 멱등성
방금 예제를 여러번 실행하면 어떻게 되는지 궁금해서 몇번 실행해봤는데, 최초에 생성된 시간 그대로 파일이 유지돼있네요. 파일 생성만 하고 또 실행 -> 파일 바뀌지 않음생성된 파일 수정하고 또 실행 -> 파일 바뀌지 않음(수정한 내용이 그대로 있음) 확인해보니 createNewFile() 는 true와 false를 반환하여 false일 때에는 생성을 하지 않고 있네요.해당 함수는 멱등성을 보장한다고 해야되는지 아닌지 궁금합니다.그런데 멱등성을 보장한다고 하기엔 안에 내용을 유지시켜주지는 않는거 같네요. 완전한 멱등성이라고 하면 수정된 내용도 없어지고 아무것도 없는 파일로 바뀌어야 되는거 아닐까 생각이 들어서 명확하게 확신이 없어서 질문 드립니다.
-
해결됨기초 탄탄! 독하게 시작하는 Java Part 3(하) : 소켓과 파일 I/O
잘못 작성
잘못 작성
-
미해결C# TCP/IP 소켓 프로그래밍
프로젝트가 더 이상 지원되지 않는 .NET 6.0을 대상으로 할 때
안녕하세요-섹션5C# TCP/IP 소켓 프로그래밍 로그인 부분입니다.자료 다운 후 실행 시 아래와 같은 에러가 발생합니다이 때. 프로젝트 우측 클릭 -> 7 & 8 &9버전등으로 빌드 -> 재실행하였으나 동일한데요. 어떤 방향으로 해결하면 좋을까요?
-
미해결C# TCP/IP 소켓 프로그래밍
Tap강의에서 6분9초에 ReceiveAsync에 매개변수 e가 필요하다는 에러
안녕하세요Tap강의에서 6분 9초에 31번째 줄 내용이 궁금합니다. 저는 ReceiveAsync메서드에는 2개 인수를 쓰는 오버로드가 없다고 떠서, 어떻게 수정하면되는지 궁금합니다. -에러나는 내용ReceiveAsync메서드에는 2개 인수를 쓰는 오버로드가 없다 -제가 적은 코드 int n1 = await clientSocket.ReceiveAsync(buffer,SocketFlags.None); --전체 코드 using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Net;using System.Net.Sockets;using System.Threading;namespace Server{ class Program { static async Task Main(string[] args) { Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); IPEndPoint endPoint = new IPEndPoint(IPAddress.Parse("192.168.20.97"), 20000); serverSocket.Bind(endPoint); serverSocket.Listen(1000); //Tap( 작업기반 비동기 패턴) 작업짜기 while(true) { //서버 소켓에 어웨이트 소켓을 써라, 이 함수는 반환값이 <task>socket임 Socket clientSocket = await serverSocket.AcceptAsync(); // 제네릭한 값을 갖는 Task를 await하게하면 제네릭을 반환값으로 가질 수 있음 //스레드 풀에 일감을 던짐 , 즉 Readasync하라는거임 ThreadPool.QueueUserWorkItem(ReadAsync, clientSocket); } } /// <summary> /// 스레드풀에 들어갈 함수 , 클라이언트 소켓이 센더로 들어감 /// </summary> /// <param name="sender"></param> private static async void ReadAsync(object sender) { //클라이언트 소켓이 센더로 들어감 Socket clientSocket = (Socket)sender; //리시브 함수 루프 돌리기 while(true) { byte[] buffer = new byte[256]; int n1 = await clientSocket.ReceiveAsync(buffer,SocketFlags.None); //만약 0바이트면 종료된거니까 자원 해제하고 return으로 함수 종료 if (n1<1) { Console.WriteLine("Client disconnect"); clientSocket.Dispose(); return; } Console.WriteLine(Encoding.UTF8.GetString(buffer)); } } }}
-
미해결C# TCP/IP 소켓 프로그래밍
EAP강의에서 어떻게 여러개 클라이언트를 띄우는지 궁금합니다
제목과 내용이 같습니다.코드를 따라하며 진행중인데, 시연해주실때마다 클라이언트를 여러개 키는 모습을 보여주셨는데, 어떻게 하셨는지 궁금합니다.
-
해결됨C# TCP/IP 소켓 프로그래밍
22:38 메세지 박스가 안뜨는 문제
실습을 진행하다 22:38에 떠야하는 메시지 박스가 안뜨는 문제가 발생하여 글 남깁니다.디버깅을 통해서 알 수 있는 사실은 정상적으로 서버에서 SendAsync 한 데이터를 클라이언트 Singleton의 ReceiveAsync 메서드에서 받는다는 사실입니다. ( 스레드 풀의 작업자 스레드가 응답받습니다. )하지만, LoginForm의 주 스레드와 작업자 스레드는 병렬적으로 실행되며 LoginForm의 roomList.ShowDialog()가 호출되는 순간 ReceiveAsync 를 실행하던 작업자 스레드가 중단됩니다.결국, MessageBox.Show(packet.Code.ToString()); 가 호출되기 전에 작업자 스레드가 중단되며, 메시지 박스가 뜨지 않습니다.왜 해당 작업자 스레드가 종료되는 지 궁금합니다. header의 크기를 잘못 지정한 문제였습니다.header의 크기를 2로 지정하여 해당 크기만큼만 Receive 소켓에서 읽어야 했는데, 그 이상 읽어서 이후 ReceiveAsync에서 더 이상 읽을 데이터가 없기 때문에 스레드가 중단된 것이었습니다. ㅡㅜ
-
미해결C# TCP/IP 소켓 프로그래밍
에러 관련하여 질문 있습니다.
안녕하세요, 실습을 따라 진행하던 도중 질문드릴 것이 생겨 여쭤봅니다.해당 강의의 커리큘럼 중 채팅 프로그램 세션에서 로그인 강의를 끝까지 듣고 그대로 입력해 실행해 봤을 때, 강의 영상처럼 영어를 입력하면 입력값이 길든 짧든 오류가 나지 않습니다.그러나 한글로 입력하면 아래의 사진과 같이 아이디, 닉네임 이렇게 짧게만 입력해도 오류가 납니다. 왜 이런 것인지 이유와 그 해결책을 알고 싶습니다.감사합니다.
-
미해결C# TCP/IP 소켓 프로그래밍
에러에 관한 질문입니다.
************** 예외 텍스트 **************System.Net.Sockets.SocketException (10061): 대상 컴퓨터에서 연결을 거부했으므로 연결하지 못했습니다.at System.Net.Sockets.Socket.AwaitableSocketAsyncEventArgs.ThrowException(SocketError error, CancellationToken cancellationToken)at System.Net.Sockets.Socket.AwaitableSocketAsyncEventArgs.System.Threading.Tasks.Sources.IValueTaskSource.GetResult(Int16 token)at System.Threading.Tasks.ValueTask.ValueTaskSourceAsTask.<>c.<.cctor>b__4_0(Object state)--- End of stack trace from previous location ---at Client.Singleton.ConnectAsync() in P:\Chat\Client\Singleton.cs:line 36at Client.LoginForm.btn_login_Click(Object sender, EventArgs e) in P:\Chat\Client\LoginForm.cs:line 20at System.Threading.Tasks.Task.<>c.<ThrowAsync>b__128_0(Object state) 16:45초 로그인 할 때 이렇게 뜨네요 ㅠㅠ 해당 라인 가보면LoginForm.csawait Singleton.Instance.ConnectAsync(); Singleton.csawait Socket.ConnectAsync(endPoint);입니다. 아이피와 포트도 제대로 입력해주었습니다. 강사님이 올려주신 파일 통째로 받아서 해봤는데도 동일한 오류가 발생합니다. 어떻게 해결해야하나요?코드 첨부합니다.LoginForm.csusing Core;namespace Client;public partial class LoginForm : Form{ public LoginForm() { InitializeComponent(); } private async Task btn_login_Click(object sender, EventArgs e) { if (string.IsNullOrEmpty(tbx_id.Text) || string.IsNullOrEmpty(tbx_nickname.Text)) { MessageBox.Show("입력하세요"); return; } await Singleton.Instance.ConnectAsync(); LoginRequestPacket packet = new LoginRequestPacket(tbx_id.Text, tbx_nickname.Text); await Singleton.Instance.Socket.SendAsync(packet.Serialize(), System.Net.Sockets.SocketFlags.None); Singleton.Instance.Id = tbx_id.Text; Singleton.Instance.Nickname = tbx_nickname.Text; RoomList roomList = new RoomList(); roomList.ShowDialog(); }}Singleton.csusing System.Net;using System.Net.Sockets;namespace Client;/// <summary>/// 언제 어디서나 접근할 수 있는 객체./// 이 객체는 반드시 1개만 존재해야 한다./// </summary>internal class Singleton{ public string Id { get; set; } = null!; public string Nickname { get; set; } = null!; public Socket Socket { get; } = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); private static Singleton? instance; public static Singleton Instance { get { if (instance == null) instance = new Singleton(); return instance; } } private Singleton() { } public async Task ConnectAsync() { IPEndPoint endPoint = new IPEndPoint(IPAddress.Parse("192.168.219.106"), 20001); await Socket.ConnectAsync(endPoint); ThreadPool.QueueUserWorkItem(ReceiveAsync, Socket); } private async void ReceiveAsync(object? sender) { Socket socket = (Socket)sender!; byte[] headerBuffer = new byte[2]; while (true) { #region 헤더버퍼 가져옮 int n1 = await socket.ReceiveAsync(headerBuffer, SocketFlags.None); if (n1 < 1) { Console.WriteLine("client disconnect"); socket.Dispose(); return; } else if (n1 == 1) { await socket.ReceiveAsync(new ArraySegment<byte>(headerBuffer, 1, 1), SocketFlags.None); } #endregion #region 데이터버퍼 가져옮 short dataSize = IPAddress.NetworkToHostOrder(BitConverter.ToInt16(headerBuffer)); byte[] dataBuffer = new byte[dataSize]; int totalRecv = 0; while (totalRecv < dataSize) { int n2 = await socket.ReceiveAsync(new ArraySegment<byte>(dataBuffer, totalRecv, dataSize - totalRecv), SocketFlags.None); totalRecv += n2; } #endregion } }}
-
미해결C# TCP/IP 소켓 프로그래밍
크롬으로 서버에 접속은 되지만 response되지 않는 이유가 궁금합니다
pc에서 c#으로 http방식으로 response하는 server를 구축했습니다. 크롬을 클라이언트프로그램으로 삼아 서버에 접속했습니다. 이때 console.write(request)을 통해 접속된 것은 확인했습니다. 그러나 크롬화면에서는 err_empty_response만 뜹니다. 여러방식으로 테스트해 본 결과 크롬에서 http주소를 접속하면 공통적으로 나타나는 현상 같은데 어떻게 해야 할 지 모르겠습니다.
-
해결됨C# TCP/IP 소켓 프로그래밍
예제소스 제공 원합니다.
안녕하세요. 강의에서 타이핑 하신 Example Source를 제공받을 수 있을까요?
-
해결됨C# TCP/IP 소켓 프로그래밍
5:34 질문 있습니다.
안녕하세요 강의 복습중 궁금한점 생겨서 질문드립니다.21번줄에 client가 Accept한 이후 통신에 대한 함수(ReadAsync)를 ThreadPool에 추가하는 형태로 코딩을 하셨는데요ReadAsync함수에서는 while(true)내부에서 지속적으로 클라이언트와 통신을 해야하기 때문에 사실상 QueueUserWorkItem로인해 생성된 쓰레드풀의 쓰레드가 대기상태로 돌아가는 상황은 클라이언트가 연결을 종료했을 경우 말고는 없기 때문에쓰레드풀의 쓰레드1개 = 클라이언트1개로 이해했습니다.그렇다면 클라이언트가 connect요청을 하여 서버쪽에서accept를 할때마다 쓰레드풀의 쓰레드를 1개식 할당 하는 구조상클라이언트 100명만 접속하더라도 쓰레드풀의 쓰레드 100개를 사용하게 되는건데 성능상 문제가 생기진 않는걸까요? 아니면 비동기 방식이기 때문에 괜찮은건가요?혹은 쓰레드풀의 쓰레드1개 = 클라이언트1개 라는 조건이 틀린걸까요?제가 잘못 이해한 부분이 있는걸까요?
-
미해결C# TCP/IP 소켓 프로그래밍
방만들기, 방 목록 새로고침 강의 중 크로스스레드 문제
좋은 강의 감사드립니다. 방만들기, 방 목록 새로고침 강의 중 크로스스레드 문제 관련 질문드립니다.강의 중 RoomList 폼의 비하인드 코드에서 CreateRoomResponsed 함수에서 크로스스레드 문제가 발생합니다.코드 흐름상 해당 함수는 Singleton클래스에서 Invoke 되어 호출되는 구조이고 위에 붉은색으로 표시한 코드가 UI에 직접 접근하여 크로스스레드가 발생한 것으로 보입니다.정황상 크로스스레드가 발생하는게 맞는 상황인데, 강사님의 강의에서는 크로스스레드가 발생하지 않는것으로 보입니다.혹시 제가 놓친 부분이 있을까요?
-
해결됨C# TCP/IP 소켓 프로그래밍
9:45 질문 있습니다.
안녕하세요 강의보던중 궁금한점 생겨서 질문드립니다. 9분 45초에서 Receive용으로 사용하는 SocketAsyncEventArgs의 버퍼를 설정해주는데요, 이때 이 버퍼가 [입출력버퍼, 슬라이딩 윈도우] 강의에서 설명해주셨던 입력버퍼가 되는걸까요? 아니면 입력버퍼에 들어온 데이터를 넘겨받는 버퍼로 사용되는걸까요?