我想基于老師的代碼,實(shí)現(xiàn)聊天的功能,請(qǐng)問該怎么寫啊?
我發(fā)覺, 我像老師那樣寫,必須 ?socket.shutdownOutput();
否則,數(shù)據(jù)根本發(fā)不過去。 ?
但是一旦關(guān)閉了 輸出流, 又無法重新打開輸出流,從而導(dǎo)致只能輸一次話。。
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();//添加了寫一行操作,??服務(wù)端勉強(qiáng)能接收消息了 ????????????????bw.flush(); ????????????} ????????} ????????catch?(IOException?e) ????????{ ????????????e.printStackTrace(); ????????} ????} }
/* ?*服務(wù)端接收 ?*/ public?class?Server?{ public?static?void?main(String[]?args)?{ //1.創(chuàng)建一個(gè)服務(wù)器端Socket,指定綁定端口 try?{ ServerSocket?server=new?ServerSocket(8886); System.out.println("服務(wù)器啟動(dòng),等待客戶端連接"); 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){//說是勉強(qiáng),因?yàn)槲野l(fā)覺必須把if語句去掉后,?才能收到消息,請(qǐng)問是怎么回事??? System.out.println(br.readLine()); } } }?catch?(IOException?e)?{ //?TODO?Auto-generated?catch?block e.printStackTrace(); } } }
1.當(dāng)客戶端不加newLine()的時(shí)候,沒接收到消息過。除非shutdownOutput()才能輸出一次,看了API,關(guān)閉輸出流的時(shí)候把數(shù)據(jù)發(fā)送過去了。 所以說是沒法過去的原因。\t\n之類的也知道一點(diǎn),但是,為何加newLine()有機(jī)會(huì)收到?
2.說是有機(jī)會(huì)收到,因?yàn)槲以诳蛻舳思恿薾ewLine(),去掉服務(wù)端的 If 才能收到,我完全部知道為什么能在客戶端讀到,為什么又讀不到
if((br.readLine())!=null){
System.out.println(br.readLine());
}
感覺沒錯(cuò)啊, 為啥上面的代碼不能輸出, 去掉If就能輸出了,因?yàn)閕f是有問題可以肯定, 但是具體錯(cuò)在哪兒了?
3. 如何設(shè)置IP才能放在朋友那里執(zhí)行客戶端, 能夠跟我通信, ?直接百度得到我的IP,但是朋友根本連不上這個(gè)IP。
public void newLine()
? ? ? ? ? ? throws IOException
寫入一個(gè)行分隔符。行分隔符字符串由系統(tǒng)屬性 line.separator 定義,并且不一定是單個(gè)新行 ('\n') 符。?
2015-05-29
用其他包裝流 寫出來了。 但是這個(gè)問題還是沒搞懂。