我想基于老師的代碼,實現聊天的功能,請問該怎么寫啊?
我發覺, 我像老師那樣寫,必須 ?socket.shutdownOutput();
否則,數據根本發不過去。 ?
但是一旦關閉了 輸出流, 又無法重新打開輸出流,從而導致只能輸一次話。。
public?class?Client?{ public?static?void?main(String[]?args)?{ ????????try ????????{ ????????Socket?socket=new?Socket("localHost",8886); ????????????OutputStream?os?=?socket.getOutputStream(); ????????????BufferedWriter?bw=new?BufferedWriter(new?OutputStreamWriter(os)); ????????????while?(true) ????????????{ ????????????????BufferedReader?reader?=?new?BufferedReader( ????????????????????????new?InputStreamReader(System.in)); ????????????????String?line?=?reader.readLine(); ????????????????bw.write(line); ????????????????bw.newLine();//添加了寫一行操作,??服務端勉強能接收消息了 ????????????????bw.flush(); ????????????} ????????} ????????catch?(IOException?e) ????????{ ????????????e.printStackTrace(); ????????} ????} }
/* ?*服務端接收 ?*/ public?class?Server?{ public?static?void?main(String[]?args)?{ //1.創建一個服務器端Socket,指定綁定端口 try?{ ServerSocket?server=new?ServerSocket(8886); System.out.println("服務器啟動,等待客戶端連接"); Socket?socket=server.accept(); System.out.println("客戶端連接成功,"+socket.toString()); InputStream?is=socket.getInputStream(); while(true){ InputStreamReader?isr=new?InputStreamReader(is); BufferedReader?br=new?BufferedReader(isr); if((br.readLine())!=null){//說是勉強,因為我發覺必須把if語句去掉后,?才能收到消息,請問是怎么回事啊? System.out.println(br.readLine()); } } }?catch?(IOException?e)?{ //?TODO?Auto-generated?catch?block e.printStackTrace(); } } }
1.當客戶端不加newLine()的時候,沒接收到消息過。除非shutdownOutput()才能輸出一次,看了API,關閉輸出流的時候把數據發送過去了。 所以說是沒法過去的原因。\t\n之類的也知道一點,但是,為何加newLine()有機會收到?
2.說是有機會收到,因為我在客戶端加了newLine(),去掉服務端的 If 才能收到,我完全部知道為什么能在客戶端讀到,為什么又讀不到
if((br.readLine())!=null){
System.out.println(br.readLine());
}
感覺沒錯啊, 為啥上面的代碼不能輸出, 去掉If就能輸出了,因為if是有問題可以肯定, 但是具體錯在哪兒了?
3. 如何設置IP才能放在朋友那里執行客戶端, 能夠跟我通信, ?直接百度得到我的IP,但是朋友根本連不上這個IP。
public void newLine()
? ? ? ? ? ? throws IOException
寫入一個行分隔符。行分隔符字符串由系統屬性 line.separator 定義,并且不一定是單個新行 ('\n') 符。?
2015-05-29
用其他包裝流 寫出來了。 但是這個問題還是沒搞懂。
2015-05-29
public class Client {
public static void main(String[] args) {
? ? ? ? try
? ? ? ? {
? ? ? ? Socket socket=new Socket("localHost",8886);
? ? ? ? ? ? OutputStream os = socket.getOutputStream();
? ? ? ? ? ? BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(os));
? ? ? ? ? ? while (true)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? BufferedReader reader = new BufferedReader(
? ? ? ? ? ? ? ? ? ? ? ? new InputStreamReader(System.in));
? ? ? ? ? ? ? ? String line = reader.readLine();
? ? ? ? ? ? ? ? bw.write(line);
? ? ? ? ? ? ? ? bw.newLine();//添加了寫一行操作, ?服務端勉強能接收消息了
? ? ? ? ? ? ? ? bw.flush();
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? catch (IOException e)
? ? ? ? {
? ? ? ? ? ? e.printStackTrace();
? ? ? ? }
? ? }
}
/*
?*服務端接收
?*/
public class Server {
public static void main(String[] args) {
//1.創建一個服務器端Socket,指定綁定端口
try {
ServerSocket server=new ServerSocket(8886);
System.out.println("服務器啟動,等待客戶端連接");
Socket socket=server.accept();
System.out.println("客戶端連接成功,"+socket.toString());
InputStream is=socket.getInputStream();
while(true){
InputStreamReader isr=new InputStreamReader(is);
BufferedReader br=new BufferedReader(isr);
if((br.readLine())!=null){//說是勉強,因為我發覺必須把if語句去掉后, 才能收到消息,請問是怎么回事啊?
System.out.println(br.readLine());
}
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
當客戶端不加newLine()的時候,沒接收到消息過。除非shutdownOutput()才能輸出一次,看了API,關閉輸出流的時候把數據發送過去了。 所以說是沒法過去的原因。\t\n之類的也知道一點,但是,為何加newLine()有機會收到?
說是有機會收到,因為我在客戶端加了newLine(),去掉服務端的 If 才能收到,我完全部知道為什么能在客戶端讀到,為什么又讀不到
if((br.readLine())!=null){
System.out.println(br.readLine());
}
感覺沒錯啊, 為啥上面的代碼不能輸出, 去掉If就能輸出了,因為if是有問題可以肯定, 但是具體錯在哪兒了?
public void newLine()
? ? ? ? ? ? throws IOException
寫入一個行分隔符。行分隔符字符串由系統屬性 line.separator 定義,并且不一定是單個新行 ('\n') 符。?