Java 소켓을 사용하는 데 수 백만 가지의 예제가 있습니다. 모든 클라이언트 소켓이 생성되고 일부 텍스트가 전송되고 소켓이 닫힌 것으로 표시됩니다.동일한 클라이언트 소켓을 사용하여 서버 소켓에 여러 메시지 보내기
일부 테스트 코드를 작성 중입니다. 제 클라이언트가 반복하여 메시지를 보내길 바랍니다. 매번 클라이언트 소켓을 닫고 다시 작성하는 것은 어리석은 것처럼 보입니다. 그래서 나는 하나의 클라이언트 소켓을 만들고, 루프를 반복하고 동일한 소켓에 데이터를 보낼 것이라고 생각했습니다. 문제는 - 내 서버 소켓은 클라이언트가 마지막 메시지를 보내고 클라이언트 소켓을 닫을 때까지받은 내용을 출력하지 않습니다.
서버 :
Socket sock;
ClientConnection client;
ServerSocket ss = new ServerSocket(portNumber);
ss.setSoTimeout(0); // 0=infinite
while (true) {
sock = ss.accept();
client = new ClientConnection(sock);
new Thread(client).start();
// ClientConnection reads from sock, prints, and closes sock
}
ClientConnection (서버 측에 별도의 클래스) :
이public class ClientConnection implements Runnable
{
private Socket m_socket;
private BufferedReader m_in = null;
public ClientConnection(Socket socket)
{
m_socket = socket;
try {
InputStream inStream = socket.getInputStream();
m_in = new BufferedReader(new InputStreamReader(inStream));
}
catch (IOException ioe) {
ioe.printStackTrace();
}
}
public String getMessage()
{
String line = null;
StringBuffer completeMessage = new StringBuffer();
try {
while ((line = m_in.readLine()) != null)
{
completeMessage.append(line);
}
}
catch (IOException ioe) {
ioe.printStackTrace();
return "";
}
return completeMessage.toString();
}
public void run()
{
try {
String message = getMessage();
System.out.println("Received: " +message);
}
finally
{
try {
m_socket.close();
}
catch (IOException ioe) {
ioe.printStackTrace();
}
}
}
}
클라이언트 :
socket = new java.net.Socket(m_destination, m_portNumber);
outputStream = socket.getOutputStream();
printStream = new java.io.PrintStream(outputStream);
while (more-stuff-to-send)
{
printStream.print(text);
printStream.print("\n");
printStream.flush();
}
prinStream.close();
socket.close();
ClientConnection이 서버에 의해 생성 내가 시작할 때 클라이언트로 전송되지만 클라이언트가 전송을 마칠 때까지 전송 된 내용은 인쇄되지 않습니다.
내가 어딘가에 줄을 따라 놓치고있는 것처럼 느껴진다. 채팅 예제는 매우 일반적입니다. 따라서 채팅 클라이언트가 있다면 채팅 서버에 보내려는 모든 메시지는 클라이언트 소켓을 만들고 메시지를 보내며 소켓을 닫습니다. 어떻게 든 옳은 것처럼 보이지 않습니다.
감사합니다.
ClientConnection이 어떻게 생겼습니까? IOException을 숨길 때 소켓 스트림을 감싸는 PrintStream을 사용하지 마십시오. – jtahlborn
ClientConnection 코드는이 문제를 해결하는 데 반드시 필요한 정보입니다. 아마도 SSCCE을 게시 할 수 있습니까? – Jeremy