완전히 투명하기 만하면됩니다. 첫 번째소켓 용 버퍼링 된 리더가 준비되지 않음
- 노드 A 텍스트 파일 노드 A가 전송
- 텍스트 파일에서 읽기 (마이너스 :
는 할 더있다,하지만 지금 난 그냥 다음 얻으려고 라인)
- 노드 B는 말했다 소켓에서 읽어 소켓을 사용하여 B를 노드로, 콘솔
에 인쇄 그것을 밖으로 그러나 지금은 정보 하나가 전송되지 않는 것 같습니다, 또는 그것은 상응하는 것으로 읽히지 않는다. ctly 노드 B에 의해
내 메인 클래스에서, 나는이 같은 노드 설정 :
NodeA nodeA = new NodeA();
NodeB nodeB = new NodeB();
new Thread(nodeA).start();
new Thread(nodeB).start();
노드 A에서를, 나는 이렇게 :
//Open a socket for talking with NodeB
Socket mySocket = new Socket(InetAddress.getLocalHost(), portNum);
//Set up the socket's output
PrintWriter out = new PrintWriter(mySocket.getOutputStream(), true);
//Loop through the lines of the confA file, writing them to the socket
String line = bufferedReader.readLine();
while (line != null)
{
//Write the line to the socket, get the next line
out.println(line); //updated to println, this flushes and fixes another problem
out.flush();
line = bufferedReader.readLine();
}
//Close the socket
mySocket.close();
주를 그 노드 A의 루프 작품 벌금. 영원히 반복하지 않으며 인쇄 문을 테스트 할 때 의도 한 텍스트 행을 반복합니다.
그런 다음, 노드 B의 끝에 : 현재 노드 B 코드 in.ready 그러나
//Open the socket
ServerSocket mySocket = new ServerSocket(portNum);
Socket connectionSocket = mySocket.accept();
//Set up a reader on the socket to get what's coming from it
BufferedReader in = new BufferedReader(new InputStreamReader(connectionSocket.getInputStream()));
String line = in.readLine(); //hang occurs here
while(line != null) {
System.out.println(line);
line = in.readLine();;
}
에게, 보여 업데이트 () 결코 사실이다. 나는 while 루프를 사용하여 그 일이 일어나기를 기다리려고했지만 결코 발생하지 않습니다.
저는 이유가 확실하지 않습니다. 정확히 바르게 설정하면 소켓을 제대로 설정했는지 전혀 알지 못합니다.
나는 A를 듣고있는 서버에 B를 만드는 것이 가장 합리적이라고 생각했습니다. . 나는 그것이 옳기를 바랍니다. 그것은 내가 SO에 대한 몇 가지 다른 예를 본 것과 비슷하게 보입니다.
감사합니다. 나는 소켓, 포트, 듣기 등등에 익숙하지 않기 때문에 처음에는 당신의 제안을 이해하지 못한다면 나를 용서해주십시오. 내가 간다는 것을 이해하기 위해 최선을 다할 것입니다.
문제가있는 곳에서 더 읽기 쉽고 명확하게 코드를 작성하는 것을 자제했으나 자세한 정보가 필요하면 언제든지 물어보십시오. 제공 해드릴 수 있도록 최선을 다할 것입니다.
1)'ServerSocket.accept()'가 돌아올 때마다 서버와 클라이언트 사이에 연결된 소켓이 있습니다. 연결에 대해서는'ServerSocket.accept()'를 다시 호출하지 않습니다. 2) 클라이언트에서 PrintWriter는 데이터를 내부적으로 버퍼링합니다. 'out.print (line);을 호출 한 결과를 즉시 네트워크에서 볼 수있게하려면 다음 문으로 out.flush()를 호출해야합니다. –
'ready()'는 다음 읽기가 즉시 리턴 될지 여부를 리턴합니다. [설명서] (https://docs.oracle.com/javase/9/docs/api/java/io/Reader.html#ready--)를 참조하십시오. – VGR