서버 사이트에서 루프를 사용하여 클라이언트에서 보낸 데이터를 계속 읽지 만 클라이언트에서 데이터를 보내면 서버 사이트에서 예외가 발생합니다.계속 읽기 방법 InputStream in 루프 사용 소켓 연결?
서버 사이트에서 클라이언트의 데이터를 읽을 수있는 코드를 디버깅했지만 클라이언트에서 읽기가 완료되면 루프를 멈출 수 없습니다. 예외가 발생한 것 같습니다.
MAX_INPUT이 서버로 보내는 데이터보다 작을 때 서버에서 올바르게 읽을 수있을 때 어떻게 이러한 문제를 해결할 수 있습니까?
대답은 말하자면 클라이언트 사이트에 socket.close()
을 추가하고 finally 블록에 연결 재설정 문제가 수정되었습니다.
동시에 서버 사이트 MAX_INPUT = 8
을 설정하면 해당 서버에서 입력 바이트를 계속 읽고 클라이언트로 다시 보낼 수 있습니다.
Server's response is: This is
Server's response is: This is
Server's response is: This is Seq.0 request send to server!
Server's response is: This is Seq.3 request send to server!
Server's response is: This is Seq.4 request send to server!
또는 때때로 서버 사이트 던져 예외 같은 :
java.net.SocketException: Software caused connection abort: recv failed
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(Unknown Source)
at java.net.SocketInputStream.read(Unknown Source)
at java.net.SocketInputStream.read(Unknown Source)
at com.simple.server.Server$Handler.run(Server.java:44)
at java.lang.Thread.run(Unknown Source)
[서버 사이트 코드 :
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class Server implements Runnable {
public final static int port = 8080;
public final static String host = "127.0.0.1";
public final static int MAX_INPUT = 1024;
public void run() {
try {
ServerSocket serverSocket = new ServerSocket(port);
System.out.println("Server begin to listen to port to accept!\n");
while (!Thread.interrupted()) {
Socket socket = serverSocket.accept();
new Thread(new Handler(socket)).start();
}
} catch (IOException e) {
e.printStackTrace();
}
}
private static class Handler implements Runnable {
private Socket _socket;
Handler(Socket socket) {
_socket = socket;
}
public void run() {
try {
InputStream in = _socket.getInputStream();
OutputStream out = _socket.getOutputStream();
int read;
byte[] buf = new byte[MAX_INPUT];
// I use a loop to continue to read
// data from client
while ((read = in.read(buf)) != -1)
out.write(buf, 0, read);
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
_socket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
public static void main(String args[]) {
new Thread(new Server()).start();
}
}
그러나 결과는 클라이언트가 전체 데이터를 수신 할 수 없다는 것입니다 고객 사이트 코드 :
public class Client implements Runnable {
public final static String host = "127.0.0.1";
public final static int port = 8080;
public final static int MAX_INPUT = 1024;
private int seq;
Client(int seq) {
this.seq = seq;
}
public void run() {
try {
Socket client = new Socket(host, port);
OutputStreamWriter writer = new OutputStreamWriter(client.getOutputStream());
InputStreamReader reader = new InputStreamReader(client.getInputStream());
writer.write("This is Seq." + seq + " request send to server!");
writer.flush();
char[] buf = new char[MAX_INPUT];
int len = reader.read(buf);
String response = new String(buf, 0, len);
System.out.println("Server's response is: " + response);
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String args[]) {
Thread threads[] = {
new Thread(new Client(0)),
new Thread(new Client(1)),
new Thread(new Client(2)),
new Thread(new Client(3)),
new Thread(new Client(4))
};
for(Thread thread : threads)
thread.start();
}
}
투사 예외 :
java.net.SocketException: Connection reset
at java.net.SocketInputStream.read(Unknown Source)
at java.net.SocketInputStream.read(Unknown Source)
at java.net.SocketInputStream.read(Unknown Source)
at com.simple.server.Server$Handler.run(Server.java:44)
at java.lang.Thread.run(Unknown Source)
어떻게 서버 측에서 MAX_INPUT에 액세스하고 계십니까? – Jois
나는'public final static int MAX_INPUT = 1024;로 초기화한다. –
미안하다. – Jois