真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

如何理解Javasocket編程

本篇內(nèi)容介紹了“如何理解Java socket編程”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

成都創(chuàng)新互聯(lián)長期為上千余家客戶提供的網(wǎng)站建設(shè)服務(wù),團隊從業(yè)經(jīng)驗10年,關(guān)注不同地域、不同群體,并針對不同對象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺,與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為灣里企業(yè)提供專業(yè)的網(wǎng)站設(shè)計、網(wǎng)站建設(shè),灣里網(wǎng)站改版等技術(shù)服務(wù)。擁有10年豐富建站經(jīng)驗和眾多成功案例,為您定制開發(fā)。

介紹

    socket通常也被稱作”套接字“,用于描述IP地址和端口,是一個通信鏈的句柄;同時 socket 的通信是基于TCP/IP 網(wǎng)絡(luò)層上的一種傳送方式,我們通常把TCP和UDP稱為傳輸層 。 下面就通過 socket通信的基本原理和示例帶大家認(rèn)識一下吧!

socket通信基本原理 

    上面介紹說了,socket通信是基于TCP/IP 協(xié)議,屬于傳輸層協(xié)議,如下圖所示:

     如何理解Java socket編程

同時socket是基于應(yīng)用服務(wù)與TCP/IP通信之間的一個抽象,他將TCP/IP協(xié)議里面復(fù)雜的通信邏輯進(jìn)行分裝,對用戶來說,只要通過一組簡單的API就可以實現(xiàn)網(wǎng)絡(luò)的連接。首先,服務(wù)端初始化ServerSocket,然后對指定的端口進(jìn)行綁定,接著對端口及進(jìn)行監(jiān)聽,通過調(diào)用accept方法阻塞;此時,如果客戶端有一個socket連接到服務(wù)端,那么服務(wù)端通過監(jiān)聽和accept方法可以與客戶端進(jìn)行連接。如下圖所示:

如何理解Java socket編程

基本示例

    服務(wù)器端 :監(jiān)聽一個端口,等待連接的到來

import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class SocketServer {
 public static void main(String[] args) throws Exception {
   // 監(jiān)聽指定的端口
   int port = 55533;
   ServerSocket server = new ServerSocket(port);
   
   // server將一直等待連接的到來
   System.out.println("server將一直等待連接的到來");
   Socket socket = server.accept();
   // 建立好連接后,從socket中獲取輸入流,并建立緩沖區(qū)進(jìn)行讀取
   InputStream inputStream = socket.getInputStream();
   byte[] bytes = new byte[1024];
   int len;
   StringBuilder sb = new StringBuilder();
   while ((len = inputStream.read(bytes)) != -1) {
     //注意指定編碼格式,發(fā)送方和接收方一定要統(tǒng)一,建議使用UTF-8
     sb.append(new String(bytes, 0, len,"UTF-8"));
   }
   System.out.println("get message from client: " + sb);
   inputStream.close();
   socket.close();
   server.close();
 }
}

客戶端:通過ip和端口,連接到指定的server,然后通過Socket獲得輸出流,并向其輸出內(nèi)容,服務(wù)器會獲得消息。最終服務(wù)端控制臺打印消息

import java.io.OutputStream;
import java.net.Socket;

public class SocketClient {
 public static void main(String args[]) throws Exception {
   // 要連接的服務(wù)端IP地址和端口
   String host = "127.0.0.1";
   int port = 55533;
   // 與服務(wù)端建立連接
   Socket socket = new Socket(host, port);
   // 建立連接后獲得輸出流
   OutputStream outputStream = socket.getOutputStream();
   String message="你好";
   socket.getOutputStream().write(message.getBytes("UTF-8"));
   outputStream.close();
   socket.close();
 }
}

上面這個例子是單向的發(fā)送消息的例子,通常是有問必答,是雙向的。可參考如下例子:

雙向通信-服務(wù)器端:比上面不同的是當(dāng)讀取完客戶端的消息后,打開輸出流,將指定消息發(fā)送回客戶端

import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class SocketServer {
 public static void main(String[] args) throws Exception {
   // 監(jiān)聽指定的端口
   int port = 55533;
   ServerSocket server = new ServerSocket(port);
   
   // server將一直等待連接的到來
   System.out.println("server將一直等待連接的到來");
   Socket socket = server.accept();
   // 建立好連接后,從socket中獲取輸入流,并建立緩沖區(qū)進(jìn)行讀取
   InputStream inputStream = socket.getInputStream();
   byte[] bytes = new byte[1024];
   int len;
   StringBuilder sb = new StringBuilder();
   //只有當(dāng)客戶端關(guān)閉它的輸出流的時候,服務(wù)端才能取得結(jié)尾的-1
   while ((len = inputStream.read(bytes)) != -1) {
     // 注意指定編碼格式,發(fā)送方和接收方一定要統(tǒng)一,建議使用UTF-8
     sb.append(new String(bytes, 0, len, "UTF-8"));
   }
   System.out.println("get message from client: " + sb);

   OutputStream outputStream = socket.getOutputStream();
   outputStream.write("Hello Client,I get the message.".getBytes("UTF-8"));

   inputStream.close();
   outputStream.close();
   socket.close();
   server.close();
 }
}

雙向通信-客戶器端  :比上面不同的是在發(fā)送完消息時,調(diào)用關(guān)閉輸出流方法,然后打開輸出流,等候服務(wù)端的消息

import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;

public class SocketClient {
 public static void main(String args[]) throws Exception {
   // 要連接的服務(wù)端IP地址和端口
   String host = "127.0.0.1";
   int port = 55533;
   // 與服務(wù)端建立連接
   Socket socket = new Socket(host, port);
   // 建立連接后獲得輸出流
   OutputStream outputStream = socket.getOutputStream();
   String message = "你好  yiwangzhibujian";
   socket.getOutputStream().write(message.getBytes("UTF-8"));
   //通過shutdownOutput高速服務(wù)器已經(jīng)發(fā)送完數(shù)據(jù),后續(xù)只能接受數(shù)據(jù)
   socket.shutdownOutput();
   
   InputStream inputStream = socket.getInputStream();
   byte[] bytes = new byte[1024];
   int len;
   StringBuilder sb = new StringBuilder();
   while ((len = inputStream.read(bytes)) != -1) {
     //注意指定編碼格式,發(fā)送方和接收方一定要統(tǒng)一,建議使用UTF-8
     sb.append(new String(bytes, 0, len,"UTF-8"));
   }
   System.out.println("get message from server: " + sb);
   
   inputStream.close();
   outputStream.close();
   socket.close();
 }
}

注意事項

    在使用socket編程時,要注意告知對方已發(fā)送完命令,需使用如下方式:

    方式一:通過Socket關(guān)閉 (注:客戶端Socket關(guān)閉后,將不能接受服務(wù)端發(fā)送的消息,也不能再次發(fā)送消息;如果客戶端想再次發(fā)送消息,需要重現(xiàn)創(chuàng)建Socket連接);

    方式二:通過Socket關(guān)閉輸出流的方式;

    方式三:通過約定符號;

    方式四:通過特定長度;

“如何理解Java socket編程”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!


當(dāng)前標(biāo)題:如何理解Javasocket編程
URL網(wǎng)址:http://weahome.cn/article/gdcdco.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部