JAVA TCP通信基础篇——对发消息【如何解决输入流假死状态】
為什么80%的碼農(nóng)都做不了架構(gòu)師?>>> ??
TCP(Transmission Control Protocol?傳輸控制協(xié)議)是一種面向連接的、可靠的、基于字節(jié)流的傳輸層通信協(xié)議.
面向連接:服務(wù)器創(chuàng)建一個(gè)連接端口,客戶端去連接服務(wù)器實(shí)現(xiàn)通信。
可靠的:tcp協(xié)議是是在連接成功之后才會(huì)發(fā)送數(shù)據(jù),而基于UDP的協(xié)議是事先不會(huì)征求對(duì)方意見(jiàn),直接將數(shù)據(jù)傳送出去,因此TCP協(xié)議傳輸中,數(shù)據(jù)更可靠,更安全。
基于字節(jié)流:tcp協(xié)議中傳遞的信息是以流的形式傳遞的,在java中可通過(guò)inputstream來(lái)捕獲,通過(guò)outputstream發(fā)送。
對(duì)于接收數(shù)據(jù)的時(shí)候出現(xiàn)假死的狀態(tài):
readLine()函數(shù)讀取一行,結(jié)尾需要"\n"才能結(jié)束,不然會(huì)一直卡死在這里,因此大家在用printwriter的時(shí)候要print一個(gè)"\n",然后把printwriter flush掉。就不會(huì)假死了!
這樣:pw.write("fuck you cient");?? ?//send to server
?? ??? ??? pw.write("\n");
?? ??? ??? pw.flush();
在java中,tcp協(xié)議是已經(jīng)封裝好的類(lèi),可直接供用戶使用。其中關(guān)鍵的兩個(gè)類(lèi)是
Socket類(lèi) ? ? ServerSocket類(lèi)。
ServerSocket類(lèi)用來(lái)創(chuàng)建服務(wù)器,具體用法請(qǐng)參照jdk文檔。常用用法是
ServerSocket ss = new ServerSocket((int)port) //傳入一個(gè)端口號(hào),用戶自定Socket用于控制兩端的連接,服務(wù)器的Socket可以和客戶端的Socket相連接:
socket可以使用inputstream和outputstream進(jìn)行相互通信。
(服務(wù)器中通常是將已將建立連接的socket丟給子線程通信,但是點(diǎn)對(duì)點(diǎn)可以讓服務(wù)器處理一個(gè)socket就行了,不需要再生成子線程進(jìn)行通信交流)
?
?
代碼分為三個(gè)文件。
程序運(yùn)行結(jié)果:
?
以下是代碼附上:
//package org.cat.Client;import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.PrintWriter; import java.net.Socket;public class MyClient {public static void main(String[] args){try {Socket s = new Socket("localhost", 12341);System.out.println("conneting to server successfully");//successfully connecting to server//Now sending some data to server//1.create outputStream and so on...OutputStream out = s.getOutputStream();PrintWriter pw = new PrintWriter(out);pw.write("fuck you server"); //send to serverpw.write("\n"); //importantpw.flush();System.out.println("I have sended to server");//2.receiving data from serverInputStream in = s.getInputStream();InputStreamReader inReader = new InputStreamReader(in);BufferedReader bfdReader = new BufferedReader(inReader);String tmp = "xxxx,receiving failed";while((tmp = bfdReader.readLine()) != null)System.out.println("server tells:"+tmp);//close allin.close();inReader.close();bfdReader.close();out.close();pw.close();} catch (IOException e) {System.out.println("connecting failed,have u opened server?");e.printStackTrace();}} }?
//package org.cat.Server;import java.io.IOException; import java.net.ServerSocket; import java.net.Socket;public class MyServer {public static void main(String[] args){try {@SuppressWarnings("resource")ServerSocket sers = new ServerSocket(12341);//then wait for client to connectSocket s;System.out.println("waiting for client to connect");s = sers.accept();new MyThread(s);} catch (IOException e) {System.out.println("set up server failed??");e.printStackTrace();}}}?
//package org.cat.Server;import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.PrintWriter; import java.net.Socket;public //service for every client class MyThread extends Thread{Socket s;public MyThread(Socket s) {this.s = s;start();//telling that connection has been settle up System.out.println("successed to connet with port of"+s.getLocalPort());//now receiving data and talk back to client//1.receivetry {InputStream in = s.getInputStream();InputStreamReader inReader = new InputStreamReader(in);BufferedReader bfdReader = new BufferedReader(inReader);String tmp = "xxxx,receiving failed";if((tmp = bfdReader.readLine()) != null)System.out.println("client tells:"+tmp);//anwser clientOutputStream out = s.getOutputStream();PrintWriter pw = new PrintWriter(out);pw.write("fuck you cient"); //send to serverpw.write("\n");pw.flush();System.out.println("I have sended to client");//close allout.close();pw.close();in.close();inReader.close();bfdReader.close();} catch (IOException e1) {System.out.println("get inputStream from client failed");e1.printStackTrace();}System.out.println("now to shut connection");try {s.close();System.out.println("shut down connection successfully");} catch (IOException e) {System.out.println("shut server failed,have u opened it?");e.printStackTrace();}}}?
轉(zhuǎn)載于:https://my.oschina.net/qkmc/blog/861499
總結(jié)
以上是生活随笔為你收集整理的JAVA TCP通信基础篇——对发消息【如何解决输入流假死状态】的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Git在服务器安装完成后续工作
- 下一篇: 线性选择算法的递归实现和循环实现