こんにちは、ソケットからデータを読み取る単純な Java プログラムを作成していますが、入力のたびに多くのスペースが存在するという問題に遭遇しました。
目的: クライアント ソケットから正しいデータを読み取ることができる単純なサーバー ソケットを作成します。
これまでのところ、ソケットから読み取るコードを記述でき、データを読み取ることもできましたが、最後にたくさんのスペースができました。
そのため、最終的にスペースを管理するためにトリム()を使用する必要がありましたが、これが正しいか間違っているかはまだわかりません。
これに関する意見をいただければ幸いです。
注: Windows7 telnet サービスを使用してソケットに接続しています。
readSocket() {
System.out.println(client_socket);
try {
System.out.println("reading socket");
/*BufferedReader brIn = new BufferedReader(new InputStreamReader(client_socket.getInputStream()));
String inputLine = null;
while ((inputLine = brIn.readLine()) != null) {
System.out.println(inputLine);
}*/
InputStream is = client_socket.getInputStream();
byte[] byteArr = new byte[1024];
int inputsize = -1;
int currentPos = 0;
StringBuffer sb = new StringBuffer(11111);
/*while((inputsize = is.read(byteArr)) != -1) {
String processed = new String(byteArr);
sb.append(processed);
}*/
int BUFFER_SIZE = 1024;
int read;
byte[] buffer = new byte[BUFFER_SIZE];
String processed = "";
while ((read = is.read(byteArr, 0, BUFFER_SIZE)) != -1) {
String current = new String(byteArr);
//os.write(buffer, 0, read);
System.out.println("current Process "+current);
//processed +=current;
sb.append(current.toString().trim());
}
System.out.println("Socket input is : "+sb.toString());
System.out.println("Sending response to client "+processed.toString());
//client_socket.getOutputStream().write(sb.toString().getBytes());
//client_socket.getOutputStream().close();
FileOutputStream fos = new FileOutputStream(new File("C:\\Users\\himanshu2100\\eee.txt"));
fos.write(processed.getBytes());
fos.close();
is.close();
client_socket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
Roger Lindsjö と mprivat の両方の提案をうまく利用して、ストリームから読み取る部分を再設計しました。
readSocket() {
System.out.println(client_socket);
try {
System.out.println("reading socket");
InputStream is = client_socket.getInputStream();
byte[] byteArr = new byte[1024];
int read;
int BUFFER_SIZE = 1024;
ByteArrayOutputStream baos = new ByteArrayOutputStream();
while ((read = is.read(byteArr, 0, BUFFER_SIZE)) != -1) {
baos.write(byteArr, 0, read); //This is an optimized design, instead of having so many strings
}
System.out.println("Output is :"+new String(baos.toByteArray()));
baos.close();
is.close();
client_socket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
これがより良い解決策であることを願っているので、投稿してください。提案を歓迎します。