서버와 클라이언트 클래스가 있고 서버와 클라이언트가 서로 메시지를 교환합니다. 이 코드는 테스트 목적으로 만들어진 다소 어리 석으며 작동하는 방식은 다음과 같습니다. 파티 (클라이언트/서버)가 메시지를 보낼 때 상대방이 지금까지 보낸 모든 메시지를받습니다 (InputStream 비었다). 이를 구현하는 코드의 조각, 루프 서버의를 클라이언트의 동안 내부에 위치하며 :소켓 출력이 수신되지 않습니다.
이가 클라이언트 :
public class ClientSocketRunner {
private static String ip="localhost";
private static int port=440;
private static String client="Client";
private static String server="Server";
public static void main(String[] args) throws Exception
{
ClientSocketRunner socket_runner=new ClientSocketRunner();
socket_runner.run();
}
private void run() throws Exception
{
Socket client_socket=new Socket(ip, port);
OutputStream os=client_socket.getOutputStream();
InputStream is=client_socket.getInputStream();
PrintStream make_output=new PrintStream(os);
BufferedReader read_input=new BufferedReader(new
InputStreamReader(is));
make_output.println("Hello, I'm the Client");
System.out.println(read_input.readLine());
System.out.println("my port: "+client_socket.getLocalPort());
String line=null;
BufferedReader user_input=new BufferedReader(new
InputStreamReader(System.in));
while (!(line=user_input.readLine()).equals("-1"))
{
make_output.println(client+": "+line);
make_output.flush();
System.out.println("sent");
while (is.available()>0)
{
System.out.println(read_input.readLine());
}
System.out.println("bytes: "+is.available());
}
while (is.available()>0)
{
System.out.println(read_input.readLine());
}
}
[서버 :
public class ServerSocketRunner {
private static int port=440;
private static String client="Client";
private static String server="Server";
public static void main(String[] args) throws Exception
{
ServerSocketRunner ssRunner=new ServerSocketRunner();
ssRunner.run();
}
public void run() throws Exception
{
ServerSocket server_socket=new ServerSocket(port);
Socket socket=server_socket.accept();
InputStream sin=socket.getInputStream();
OutputStream sout=socket.getOutputStream();
BufferedReader read_input=new BufferedReader(new InputStreamReader(sin));
PrintStream make_output=new PrintStream(sout);
System.out.println(read_input.readLine());
make_output.println("Good to meet you, I'm the Server");
System.out.println("my port: "+socket.getLocalPort());
String line;
BufferedReader user_input=new BufferedReader(new InputStreamReader(System.in));
for (line=user_input.readLine(); !(line.equals("-1")); line=user_input.readLine())
{
make_output.println(server+": "+line);
make_output.flush();
System.out.println("sent");
while (sin.available()>0)
{
System.out.println(read_input.readLine());
}
}
}
}
그러나이 작동하지 않습니다 예상대로 . 여러 줄 입력을 만들면 각 줄마다 인쇄 ("보낸")되지만 상대방에게 가서 예상되는 입력이 나타나지 않는 줄을 보내십시오. 당사자 간의 다음 상호 작용이있을 때까지. 무엇이 문제인가?
당신은 제대로 끝 스트림 확인되지 않습니다 당신은 NPE를 얻을 것이고, 당신은'available()'의 고전적인 오용을 가지고 있습니다. 그들은 완전한 라인을 사용할 수 없다면'readLine()'에서 여전히 블록킹 할 것이므로 무의미합니다. – EJP
@EJP, 그래서 문제는, 나는 너무 짧은 줄을 입력하기 때문에 다른 쪽에서는 읽을 수 없습니까? 그러나이 문제는 단순히 다음과 같이 사용자 입력을 읽고 표시 할 때 왜 발생하지 않습니까? 'BufferedReader user_input = new BufferedReader (new InputStreamReader (System.in));, while (! (line = user_input.readLine()) .equals ("- 1")),'System.out.println ("User :"+ line); 가장 짧은 줄까지도 정확하고 즉각적으로 표시됩니다. – parsecer
아니요. 문제가 무엇인지는 말하지 않았습니다. 나는 * 당신이'available()'을 무의미하게 호출하고 있다고 * 주석을 달았습니다. 그것을 제거하십시오. – EJP