日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

原生JAVA的TCP/UDP编程

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

一、TCP/UDP對比

二、TCP編程

  • TCP字節(jié)流編程
    - Server端:
  • public class TCPServerStream {public static void main(String[] args) {/** 1.在本機的 9999 端口監(jiān)聽,等待連接* 2.當(dāng)沒有客戶端鏈接9999端口時,程序會阻塞,等待鏈接* 3.通過socket.getInputStream()讀取客戶端寫入到數(shù)據(jù)通道的數(shù)據(jù),顯示*///注意細(xì)節(jié):則個ServerSocket可以通過accept()返回多個Socket[多個客戶端鏈接服務(wù)器的并發(fā)]try (ServerSocket serverSocket = new ServerSocket(9999)) {System.out.println("server start at port:9999....");//有鏈接時返回socket對象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,通過socket.getOutputStream()* 3.將數(shù)據(jù)寫入到數(shù)據(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)的輸出流對象,發(fā)送信息try (OutputStream outputStream = socket.getOutputStream();InputStream inputStream=socket.getInputStream()) {//發(fā)送完一個消息后,要有結(jié)束標(biāo)記(socket.shutdownOutput();),不然會阻塞outputStream.write(("hello server".getBytes()));//非buffer字節(jié)流,無需flush//outputStream.flush();//單方向關(guān)閉client端的輸出流(不會關(guān)閉socket),不然會阻塞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()方法,底層會告知服務(wù)端我這邊已經(jīng)寫完了,那么服務(wù)端收到消息后,就能知道已經(jīng)讀取完消息,如果服務(wù)端有要返回給客戶的消息那么就可以通過服務(wù)端的輸出流發(fā)送給客戶端,如果沒有,直接關(guān)閉Socket。
    • 這種方式通過關(guān)閉客戶端的輸出流,告知服務(wù)端已經(jīng)寫完了,雖然可以讀到服務(wù)端發(fā)送的消息,但是還是有一點缺點:不能再次發(fā)送消息給服務(wù)端,如果再次發(fā)送,需要重新建立Socket連接這個缺點,在訪問頻率比較高的情況下將是一個需要優(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)行寫操作,不像我這樣讀寫切換的話,好像是會因為自動close而自動flush。//比如我server端里面,因為寫操作是在讀操作后面的,所以try resource自動close后也能正常運行。//但像我client里面,因為寫操作后,try resource段還沒運行完,就必須手動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)行寫操作,不像我這樣讀寫切換的話,好像是會因為自動close而自動flush。比如我server端里面,因為寫操作是在讀操作后面的,所以try resource自動close后也能正常運行。但像我client里面,因為寫操作后,try resource段還沒運行完,就必須手動flush,才能提交。

    總結(jié)

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

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