每當我在標題中的任何編寫器(誰在封裝OutputStreamWriter)上調用.flush()
時,刷新的數據不是發送;但是,在寫入器上調用.close()
時,它會刷新並且服務器可以讀取數據。我不知道我是否錯誤地撥打.write()
或.readLine()
,或者如果由於讀取操作已被阻止,那是問題所在?我需要找到一種方法來刷新數據而不關閉套接字(我將在另一個程序中使用它)。在我所有的SSCCE中,都有System.out.println()
用於調試。在客戶端,它會去「檢查4」,並在沒有任何事情的時候循環(它在實際的程序中做了更多的讀寫操作,在示例中不能關閉它)。在服務器中,它將進入「檢查2」並在reader.readLine()
處阻止。我已經閱讀過所有這些,但是我想到的是readLine()
對於網絡程序來說並不是一個好主意,而且我應該實現我自己的協議;然而,沒有一篇文章指向一個很好的教程網站,或者其他任何具有良好網絡編碼教程的文章。下面是SSCCEs:BufferedWriter/PrintWriter/OutputStreamWriter在調用.close()之前不會刷新緩衝區(通過套接字輸出流)
客戶SSCCE
package testClient;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.KeySpec;
import java.util.Random;
import javax.crypto.Cipher;
import javax.crypto.CipherOutputStream;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.PBEKeySpec;
import javax.crypto.spec.SecretKeySpec;
public class Client {
public static void main(String[] args) {
try {
Socket s = new Socket("127.0.0.1",48878);
System.out.println("check 1");
PrintWriter pw = new PrintWriter(new OutputStreamWriter(s.getOutputStream(),"UTF-8"));
System.out.println("check 2");
pw.write("Hello StackOverFlow.");
System.out.println("check 3");
pw.flush();
System.out.println("check 4");
while(true){}
} catch (IOException e) {
e.printStackTrace();
}
}
}
服務器SSCCE
package testServer;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
public static void main(String[] args) {
try {
ServerSocket ss = new ServerSocket(48878);
Socket client = ss.accept();
System.out.println("check 1");
BufferedReader reader = new BufferedReader(new InputStreamReader(client.getInputStream(),"UTF-8"));
System.out.println("check 2");
byte[] buffer = new byte[20];
int i = 0;;
int x;
while((x=reader.read())!=-1) {
buffer[i] += (byte)x;
i = i++;
}
String text = new String(buffer,"UTF-8");
System.out.println("check 3");
System.out.println(text);
client.close();
ss.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
謝謝。我一定忽略了Javadoc關於它必須是println,printf或格式方法的一部分。+1 – Levi