日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

原生JAVA的TCP/UDP编程

發(fā)布時(shí)間:2025/3/15 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 原生JAVA的TCP/UDP编程 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一、TCP/UDP對(duì)比

二、TCP編程

  • TCP字節(jié)流編程
    - Server端:
  • public class TCPServerStream {public static void main(String[] args) {/** 1.在本機(jī)的 9999 端口監(jiān)聽(tīng),等待連接* 2.當(dāng)沒(méi)有客戶端鏈接9999端口時(shí),程序會(huì)阻塞,等待鏈接* 3.通過(guò)socket.getInputStream()讀取客戶端寫(xiě)入到數(shù)據(jù)通道的數(shù)據(jù),顯示*///注意細(xì)節(jié):則個(gè)ServerSocket可以通過(guò)accept()返回多個(gè)Socket[多個(gè)客戶端鏈接服務(wù)器的并發(fā)]try (ServerSocket serverSocket = new ServerSocket(9999)) {System.out.println("server start at port:9999....");//有鏈接時(shí)返回socket對(duì)象Socket accept = serverSocket.accept();System.out.println("client has already connected");try (InputStream inputStream = accept.getInputStream();OutputStream outputStream = accept.getOutputStream()) {byte[] bytes=new byte[1024];int text;while ((text=inputStream.read(bytes))!=-1){System.out.println(new String(bytes,0,text));}//發(fā)送給client端信息outputStream.write("hello client".getBytes());System.out.println("server exit...");}} catch (IOException e) {e.printStackTrace();};} }
    • client端
    public class TCPClientStream {public static void main(String[] args) {/** 1.鏈接服務(wù)端(ip+port)* 2.連接上后,生成Socket,通過(guò)socket.getOutputStream()* 3.將數(shù)據(jù)寫(xiě)入到數(shù)據(jù)通道*///鏈接本機(jī):9999 端口System.out.println("client connecting......");try (Socket socket = new Socket(InetAddress.getLocalHost(), 9999)) {System.out.println("client connected......");//得到與socket相關(guān)聯(lián)的輸出流對(duì)象,發(fā)送信息try (OutputStream outputStream = socket.getOutputStream();InputStream inputStream=socket.getInputStream()) {//發(fā)送完一個(gè)消息后,要有結(jié)束標(biāo)記(socket.shutdownOutput();),不然會(huì)阻塞outputStream.write(("hello server".getBytes()));//非buffer字節(jié)流,無(wú)需flush//outputStream.flush();//單方向關(guān)閉client端的輸出流(不會(huì)關(guān)閉socket),不然會(huì)阻塞socket.shutdownOutput();byte[] bytes=new byte[1024];int text;while ((text=inputStream.read(bytes))!=-1){System.out.println(new String(bytes,0,text));}System.out.println("client exit...");}} catch (IOException e) {e.printStackTrace();}} }

    注意:

    • 這里調(diào)用Socket的shutdownOutput()方法,底層會(huì)告知服務(wù)端我這邊已經(jīng)寫(xiě)完了,那么服務(wù)端收到消息后,就能知道已經(jīng)讀取完消息,如果服務(wù)端有要返回給客戶的消息那么就可以通過(guò)服務(wù)端的輸出流發(fā)送給客戶端,如果沒(méi)有,直接關(guān)閉Socket。
    • 這種方式通過(guò)關(guān)閉客戶端的輸出流,告知服務(wù)端已經(jīng)寫(xiě)完了,雖然可以讀到服務(wù)端發(fā)送的消息,但是還是有一點(diǎn)缺點(diǎn):不能再次發(fā)送消息給服務(wù)端,如果再次發(fā)送,需要重新建立Socket連接這個(gè)缺點(diǎn),在訪問(wèn)頻率比較高的情況下將是一個(gè)需要優(yōu)化的地方。

    優(yōu)化文章

  • TCP字符流編程
    • server
    public class TCPServerCharacterStream extends Thread{private ServerSocket serverSocket;public static void main(String[] args) {TCPServerCharacterStream tcpServerCharacterStream=new TCPServerCharacterStream();tcpServerCharacterStream.start();}public TCPServerCharacterStream(){try{serverSocket = new ServerSocket(8888);}catch (Exception e){e.printStackTrace();}}@Overridepublic void run() {while (true){try {System.out.println("server waiting for connecting....");//阻塞等待連接Socket accept = serverSocket.accept();System.out.println("client has already connected....");try (BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(accept.getInputStream(), "UTF-8"));BufferedWriter bufferedWriter=new BufferedWriter(new OutputStreamWriter(accept.getOutputStream(),"UTF-8"))) {System.out.println("using socket is: "+accept);System.out.println("get message : "+bufferedReader.readLine());//給客戶端發(fā)送bufferedWriter.write("hello client from server");//結(jié)束標(biāo)志bufferedWriter.newLine();System.out.println("server exit....");}} catch (IOException e) {e.printStackTrace();}}} }
    • client
    public class TCPClientCharacterStream extends Thread{public static void main(String[] args) {System.out.println("client connecting......");try (Socket socket = new Socket(InetAddress.getLocalHost(), 8888)) {System.out.println("client connected......");try (BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), "UTF-8"));BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream(),"UTF-8"))){System.out.println("start to send message....");//給服務(wù)端發(fā)送System.out.println("using socket is: "+socket);bufferedWriter.write("sending: hello server from client");System.out.println("ending send message...");//結(jié)束標(biāo)記,要求接收方使用readLine()讀取;bufferedWriter.newLine();//try resource模式下,如果只是進(jìn)行寫(xiě)操作,不像我這樣讀寫(xiě)切換的話,好像是會(huì)因?yàn)樽詣?dòng)close而自動(dòng)flush。//比如我server端里面,因?yàn)閷?xiě)操作是在讀操作后面的,所以try resource自動(dòng)close后也能正常運(yùn)行。//但像我client里面,因?yàn)閷?xiě)操作后,try resource段還沒(méi)運(yùn)行完,就必須手動(dòng)flush,才能提交。bufferedWriter.flush();System.out.println(socket.isClosed());System.out.println("get message : "+bufferedReader.readLine());System.out.println("client exit...");}} catch (IOException e) {e.printStackTrace();}} }

    注意:

    try resource模式下,如果只是進(jìn)行寫(xiě)操作,不像我這樣讀寫(xiě)切換的話,好像是會(huì)因?yàn)樽詣?dòng)close而自動(dòng)flush。比如我server端里面,因?yàn)閷?xiě)操作是在讀操作后面的,所以try resource自動(dòng)close后也能正常運(yùn)行。但像我client里面,因?yàn)閷?xiě)操作后,try resource段還沒(méi)運(yùn)行完,就必須手動(dòng)flush,才能提交。

    總結(jié)

    以上是生活随笔為你收集整理的原生JAVA的TCP/UDP编程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。