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

歡迎訪問 生活随笔!

生活随笔

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

java

Java:socket服务端,socket服务端支持多连接,socket客户端,socket客户端支持发送和接受

發布時間:2025/4/5 java 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java:socket服务端,socket服务端支持多连接,socket客户端,socket客户端支持发送和接受 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、Java之socket服務端

新建一個Java工程

命名

給他先創建一個類

在類里面我們做一個main

這里面也需要,創建套接字,IP號,端口號

但是java中有一個類?????????ServerSocket,

你在實例化????????ServerSocket 的時候,

帶一個整型數的構造方法,這個就是端口號

?

?我們把端口號設置為8801,

這樣子就把以前的繁雜的配置結束了

?

?這面波浪線的意思,我們按下ctrl + 1

?這面波浪線的意思,我們按下ctrl + 1

?這面波浪線的意思,我們按下ctrl + 1

?這面需要try catch ,因為他可能會出錯

他可能產生一個io 異常,網絡連接可能產生一個受查異常

?對于受查異常,我們必須處理,要不然它編譯通不過

我們做一個調試

?回憶一下我們是如何連接的

,socket對象里面有一個accept

當你能夠走到這一步的時候?????????? ?socket.accept();? ?

就說明有客戶端連接上來了

?可以加一句????????System.out.println("有客戶端接入");? ? ? ? 第14行

?有客戶端接入的時候,我們一定要進行通信

所以這個連接通道我們要給他留著????????Socket con = socket.accept();? ? ? ? 第13行

也就是說accept的返回值,我們要給他拿出手

Socket? ? ? ? 第13行不認識? ,我們CTRL? ?+? ? ? shirt? ? +? ? o? 打包

接下來我們就是讀取數據?

這個連接通道里面我們可以????????con.getInputStream();????????獲取輸入流,用來讀取數據

這個輸入流的返回值是什么呢?????????InputStream in =con.getInputStream();????????這個流我們要給他拿到手,拿到手就可以讀取數據

我們要把讀取的數據放在byte里面

?然后要在main 里面做一個數組?????????? ?byte[] data = new byte[128];

?讀取到數據以后,我們還得輸出?????

???System.out.println("讀到消息:"+new String(data));? ? ? ? 第22行
?? ??? ?????????????????

?運行一下

顯示套接字創建成功

?然后打開我們的網絡調試助手

?先修改一下協議類型

?端口號改一下

點擊一下連接,然后這面就顯示? ? ? ? 有客戶端接入

?發送一句話

?另一面接受到的

后面有一堆亂碼

?這些亂碼的原因是因為?????????? ?byte[] data = new byte[128];? ? ? ?data128個字節? ? ? 沒有初始化

我們通過data構建字符串的時候????????System.out.println("讀到消息:"+new String(data));? ?可以把沒用的地方去掉

read 它的返回值是一個整形數????????in.read(data);

到底讀了多少個,內容是可以獲得的??????????? ?int len = 0;? ? ? ? len 的初始值我們給他弄成0

可以把? ?read? 的返回值放在? ?len里面來

System.out.println("讀到消息:"+new String(arg0, arg1, arg2));

?第一個參數就是我們要轉化的data? ? ? ,從哪里開始? ,從第byte 里面0個字節開始? ?,一直到? len

?在運行一下

?這面顯示有客戶端接入

?在發送一下?????????bingtanglizi? 這句話

?結果

?但是這樣有個弊端,我發送一次以后,

程序就結束了

?未結束的情況(有個紅色的)

按照以前我們的經驗,需要創建線程

這節課的思路:????????ServerSocket這個類,這個類創造連接以后調用accept

然后連接通道里面有一個????????getInputStream();

這個輸入流里面有一個read? ? ?API? ?來讀取函數

消息讀出來的時候,我們要做一個byte到字符串的轉換????????System.out.println("讀到消息:"+new String(data, 0, len));
?? ??? ?

二、Java之socket服務端支持多連接

上面有一個弊端,我們客戶端還沒斷開,服務端就先斷開了

?根據以前的經驗,當有客戶端介入的時候,我們可以創建一個子線程對接

那么accept? ? 這面可以來一個? ?while? ?循環

?不斷的連接,當有客戶端新接入的時候

開辟一個線程對接?????????? ?new Thread().start();

那? ? ? ? ?Thread 里面要干活是不是? ?

?你要干的活????????InputStream in =con.getInputStream();//獲取輸入流,用來讀取數據?? ??? ??? ?
?? ??? ??? ?????????????????len = in.read(data);
?? ??? ??????????????????? ?System.out.println("讀到消息:"+new String(data, 0, len));

要放在

我們要做的是con不能報錯,讓這個Len不能報錯

我們先把?? ??? ?int len = 0; 搞到

因為? ? try? ? catch? 以后會改變變量的作用域

然后解決data作用域的問題

?con 這面有一個解決方案

final Socket con = socket.accept();? ?

?我們把鼠標放在波浪線上面,還有解決方案

點擊

?因為獲取輸入流,用來獲取數據的時候,在線程里面可能會產生一些異常

?所以我們把????????int len = 0;
?? ??? ??? ??????????? ??? ?byte[] data = new byte[128];
?? ??? ??? ??? ??????????? ?len = in.read(data);
?? ??? ??? ??? ??????????? ?System.out.println("讀到消息:"+new String(data, 0, len));

放到try那面

?看一下思路

main函數一進來的時候,我們就創建一個套接字

·?????????????????????????? ?ServerSocket socket = new ServerSocket(8802);
?? ??????????????????? ?System.out.println("socket套接字創建成功,等待連接");

套接字創建成功,我們死循環的接受客戶端的接入,一但有客戶端接入的時候呢,我們創建一個線程來對接,這樣我就又回到循環的部分,等待客戶端的接入,又有接入又要讀

? ? ? ??

?運行一下

?只能一次發送一條消息

?想連續發就點擊斷開,再點擊連接,一次只能發送一次

?因為我一個客戶端連接讀完以后,

其實單連接的線程·

public void run() {
?? ??? ??? ??? ??? ?// TODO Auto-generated method stub
?? ??? ??? ??? ??? ?InputStream in;
?? ??? ??? ??? ??? ?try {
?? ??? ??? ??? ??? ??? ?in = con.getInputStream();
?? ??? ??? ??? ??? ??? ?int len = 0;
?? ??? ??? ??? ??? ??? ?byte[] data = new byte[128];
?? ??? ??? ??? ??? ??? ?len = in.read(data);
?? ??? ??? ??? ??? ??? ?System.out.println("讀到消息:"+new String(data, 0, len));
?? ??? ??? ??? ??? ?} catch (IOException e) {
?? ??? ??? ??? ??? ??? ?// TODO Auto-generated catch block
?? ??? ??? ??? ??? ??? ?e.printStackTrace();
?? ??? ??? ??? ??? ?}//獲取輸入流,用來讀取數據?? ?

他已經結束了,(不讓他永久的連接)

? ? ? ?

三、Java之socket客戶端

新建一個工程來寫一下,這個客戶端到后面要整到androidAPP當中去

然后?

起個名字

?完成

選擇這個構造方法

?第一個是Ip地址,第二個是端口號

?IP地址是????????"192.168.70.1",端口號是????????8801。

? ? ??

波浪線?????????這面需要try? catch??

? ??

? 變成這樣

要進行異常的捕獲

?既然有個io 總異常捕獲的話、

catch (UnknownHostException e) {
?? ??? ??? ?// TODO Auto-generated catch block
?? ??? ??? ?e.printStackTrace();
?? ??? ?}?

這個可以去掉? ?

? ? catch 一個大的異常就ok了

現在就是連接上了

?連接上如何發送數據呢?

同樣的? ? ?接收數據是InputStream

發送數據就是????????client.getOutputStream();

它的返回值就是????????OutputStream

OutputStream ?out = client.getOutputStream(); 這樣我們就獲得了一個向外輸出的通道

那向外輸出,我們要輸出什么數據呢?????????Scanner sc = new Scanner(arg0) ;? ? ?

? ? ,到時候這面的東西是Android? ?App ,是設置好的? ?

,我們這面模擬的話,用鍵盤輸入????????Scanner sc = new Scanner(System.in);


?? ??? ??? ?

獲取一個字符串用????????String message = sc.next();?

字符串有了以后,我們是不是還要往外面發呀

我們要把我們獲得的string 轉化成? ?byte

它的返回值就是btye 這樣的一個數組

?

然后我們把服務端和客戶端運行一下

服務端完整的代碼

?

?運行一下服務端,創建成功

輪到客戶端了

端口被占用?

?

改一下端口號在運行

?我們這面需要去找一找,是哪個終端

找到以后,打出hello world? 然后按一下回車

?下面就會顯示

?這里面要注意next();? ?空格會隔斷

我們還是用網絡助手來試一下

?發送過去,發現空格后面沒了

四、java 之 socket 客戶端支持發送和接收

那我客戶端和服務端已經能通信了,但是客戶端只能發,也可以收

這個out是我們的發送通道,他從client這面獲得???????

?OutputStream ?out = client.getOutputStream();? ? ? ? //獲得數據發送通道

? ? ? ? ?

獲得數據接收通道????????client.getInputStream();

?那么我如何接收數據呢?

????????????????int len;
?? ??? ??? ?byte[] data = new byte[128];

通過getInputStream();的返回值

InputStream in =client.getInputStream();//獲得數據接收通道、

? 讀到data里面來

in.read(data);

讀了多少????????len = in.read(data);

System.out.println("獲得服務端返回數據是:"+new String(data,0, len));

現在這個客戶端,可以接收,可以發送

?運行一下

這面收到的數據?

?

?然后我回復幾句話

?這面接收到

?(記得網絡調試助手和服務端的端口號要一樣)

《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

總結

以上是生活随笔為你收集整理的Java:socket服务端,socket服务端支持多连接,socket客户端,socket客户端支持发送和接受的全部內容,希望文章能夠幫你解決所遇到的問題。

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