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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java中Socket通信-服务端和客户端双向传输字符串实现

發布時間:2025/3/19 java 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java中Socket通信-服务端和客户端双向传输字符串实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

場景

什么是socket

在計算機通信領域,socket 被翻譯為“套接字”,它是計算機之間進行通信的一種約定或一種方式。通過 socket 這種約定,一臺計算機可以接收其他計算機的數據,也可以向其他計算機發送數據。

socket 的典型應用就是 Web 服務器和瀏覽器:瀏覽器獲取用戶輸入的 URL,向服務器發起請求,服務器分析接收到的 URL,將對應的網頁內容返回給瀏覽器,瀏覽器再經過解析和渲染,就將文字、圖片、視頻等元素呈現給用戶。

那么在Java中怎樣使用import java.net.Socket;來構建服務端和客戶端并進行通信傳輸字符串?

注:

博客:
https://blog.csdn.net/badao_liumang_qizhi
關注公眾號
霸道的程序猿
獲取編程相關電子書、教程推送與免費下載。

實現

ServerSocket類能創建Socket(套接字)的服務端,Socket類能創建Socket的客戶端。

在代碼層面使用的方式就是使用Socket類去連接ServerSocket類,也就是客戶端要主動連接服務端。

ServerSocket類中的public Socket accept()方法的作用是偵聽并接受此套接字的連接。此方法在連接傳人之前一直阻塞。public Socket accept()方法的返回值是Socket類型。

那么什么時候不阻塞呢?有客戶端連接到服務端時就不再出現阻塞了,服務端的程序會繼續運行。

除了ServerSocket類中的accept()方法具有阻塞特性外,InputStream類中的read()方法也同樣具有阻塞特性。

通過使用Socket類的getlnputStream()方法可以獲得輸人流,從輸人流中獲取從對方發送過來的數據

客戶端向服務端發送字符串數據

首先新建一個Java項目SocketServer作為服務端

然后編寫其main方法,在main方法中調用接收并讀取字符串的方法

package com.badao;import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.ServerSocket; import java.net.Socket;public class Main {public static void main(String[] args) {//接受并讀取客戶端發送的字符串getStringFromClient();}//接受并讀取客戶端發送的字符串public static? void getStringFromClient(){try {char[] charArray = new char[10];//創建Socket服務端,開放端口8088ServerSocket serverSocket = new ServerSocket(8088);System.out.println("accept begin = " + System.currentTimeMillis());//調用accept方法,此時會堵塞Socket socket = serverSocket.accept();System.out.println("accept end =" + System.currentTimeMillis());//獲取客戶端發送的數據的輸入流InputStream inputStream = socket.getInputStream();//讀取輸入流InputStreamReader inputStreamReader = new InputStreamReader(inputStream);System.out.println("read begin =" + System.currentTimeMillis());int readLength = inputStreamReader.read(charArray);while (readLength != -1) {String newString = new String(charArray, 0, readLength);System.out.println(newString);readLength = inputStreamReader.read(charArray);}System.out.println("read end =" + System.currentTimeMillis());inputStreamReader.close();inputStream.close();socket.close();serverSocket.close();} catch (IOException e) {e.printStackTrace();}} }

然后在新建一個Java項目SocketClient作為客戶端,同樣新建一個main方法,并在main方法中調用發送字符串數據

到服務端的方法

package com.badao;import java.io.IOException; import java.io.OutputStream; import java.net.Socket;public class Main {public static void main(String[] args) throws IOException, InterruptedException {//客戶端向服務端發送字符串sendStringToServer();}//客戶端向服務端發送字符串public static void sendStringToServer() throws IOException, InterruptedException {System.out.println("socket begin ="+System.currentTimeMillis());//新建客戶端并請求服務端的ip為localhost 端口為8088Socket socket = new Socket("localhost",8088);System.out.println("socket end ="+System.currentTimeMillis());//休眠3秒Thread.sleep(3000);//獲取客戶端的輸出流 即向服務端發送的數據OutputStream outputStream = socket.getOutputStream();//向輸出流中寫入要發送的字符串數據outputStream.write("公眾號:霸道的程序猿".getBytes());outputStream.close();socket.close();} }

然后運行服務端的main方法

?

此時服務端會一直堵塞在accept方法這里,一直等待客戶端發送數據。

然后運行客戶端的main方法,實現客戶端向服務端發動字符串數據,此時服務端接收到客戶端的字符串數據

?

服務端向客戶端發送數據

在服務端的項目中新建向客戶端發送字符串數據的方法

??? //服務端向客戶端發送字符串數據public static void sendStringToClient() throws IOException {//新建Socket 服務端 并開放8088 端口ServerSocket serverSocket = new ServerSocket(8088);System.out.println("server堵塞開始 =" + System.currentTimeMillis());//獲取socketSocket socket = serverSocket.accept();System.out.println("server堵塞結束 ="+System.currentTimeMillis());//socket發送數據OutputStream outputStream = socket.getOutputStream();outputStream.write("來自服務端-公眾號:霸道的程序猿".getBytes());outputStream.close();socket.close();serverSocket.close();}

然后在main方法中取消運行上面的方法,改為運行此方法

??? public static void main(String[] args) throws IOException {//接受并讀取客戶端發送的字符串//getStringFromClient();//服務端向客戶端發送字符串數據sendStringToClient();}

然后再客戶端項目中新建接受服務端數據的方法

??? //客戶端接收來自服務端的數據public? static void getStringFromServer() throws IOException {System.out.println("client連接準備就緒 =" + System.currentTimeMillis());Socket socket = new Socket("localhost",8088);System.out.println("client連接成功結束 ="+System.currentTimeMillis());char[] charArray = new char[10];//獲取客戶端發送的數據的輸入流InputStream inputStream = socket.getInputStream();//讀取輸入流InputStreamReader inputStreamReader = new InputStreamReader(inputStream);System.out.println("read begin =" + System.currentTimeMillis());int readLength = inputStreamReader.read(charArray);while (readLength != -1) {String newString = new String(charArray, 0, readLength);System.out.println(newString);readLength = inputStreamReader.read(charArray);}System.out.println("read end =" + System.currentTimeMillis());inputStreamReader.close();inputStream.close();socket.close();}

然后在main方法中取消運行上面的方法,改為運行此方法。

首先運行服務端的main方法

?

此時服務端會堵塞,直接運行客戶端的main方法啟動客戶端之后

?

總結

以上是生活随笔為你收集整理的Java中Socket通信-服务端和客户端双向传输字符串实现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。