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客户端支持发送和接受的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 电脑怎么用大白菜修复引导 修复电脑引导大
- 下一篇: java简单通讯录的实现02person