国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

基于Tcp協(xié)議的簡單Socket通信實例(JAVA)

2019-11-14 21:43:12
字體:
供稿:網(wǎng)友
基于Tcp協(xié)議的簡單Socket通信實例(java

好久沒寫博客了,前段時間忙于做項目,耽誤了些時間,今天開始繼續(xù)寫起~

今天來講下關(guān)于Socket通信的簡單應(yīng)用,關(guān)于什么是Socket以及一些網(wǎng)絡(luò)編程的基礎(chǔ),這里就不提了,只記錄最簡單易懂實用的東西。

1、首先先來看下基于TCP協(xié)議Socket服務(wù)端和客戶端的通信模型:

Socket通信步驟:(簡單分為4步)

1.建立服務(wù)端ServerSocket和客戶端Socket

2.打開連接到Socket的輸出輸入流

3.按照協(xié)議進行讀寫操作

4.關(guān)閉相對應(yīng)的資源

2、相關(guān)聯(lián)的API:

1.首先先來看下ServerSocket

類 ServerSocket

此類實現(xiàn)服務(wù)器套接字。服務(wù)器套接字等待請求通過網(wǎng)絡(luò)傳入。它基于該請求執(zhí)行某些操作,然后可能向請求者返回結(jié)果。

服務(wù)器套接字的實際工作由 SocketImpl 類的實例執(zhí)行。應(yīng)用程序可以更改創(chuàng)建套接字實現(xiàn)的套接字工廠來配置它自身,從而創(chuàng)建適合本地防火墻的套接字。

一些重要的方法:(具體大家查看官方api吧)

ServerSocket(int port, int backlog) 利用指定的 backlog 創(chuàng)建服務(wù)器套接字并將其綁定到指定的本地端口號。

bind(SocketAddress endpoint, int backlog)ServerSocket 綁定到特定地址(ip 地址和端口號)。

accept() 偵聽并接受到此套接字的連接

getInetAddress() 返回此服務(wù)器套接字的本地地址。

close() 關(guān)閉此套接字。

2.再來看下Socket

類 Socket  

此類實現(xiàn)客戶端套接字(也可以就叫“套接字”)。套接字是兩臺機器間通信的端點。

套接字的實際工作由 SocketImpl 類的實例執(zhí)行。應(yīng)用程序通過更改創(chuàng)建套接字實現(xiàn)的套接字工廠可以配置它自身,以創(chuàng)建適合本地防火墻的套接字。

一些重要的方法:(具體大家查看官方api吧)

Socket(InetAddress address, int port) 創(chuàng)建一個流套接字并將其連接到指定 IP 地址的指定端口號。

getInetAddress() 返回套接字連接的地址。

shutdownInput() 此套接字的輸入流置于“流的末尾”。

shutdownOutput() 禁用此套接字的輸出流。

close() 關(guān)閉此套接字。

3、代碼實現(xiàn):(注釋很全,這里就不詳細(xì)多說了)

服務(wù)端Server.java

1.創(chuàng)建ServerSocket對象,綁定并監(jiān)聽端口

2.通過accept監(jiān)聽客戶端的請求

3.建立連接后,通過輸出輸入流進行讀寫操作

4.關(guān)閉相關(guān)資源

 1 import java.io.BufferedReader; 2 import java.io.IOException; 3 import java.io.InputStream; 4 import java.io.InputStreamReader; 5 import java.io.OutputStream; 6 import java.io.PRintWriter; 7 import java.net.ServerSocket; 8 import java.net.Socket; 9 10 11 public class Server {12 13     /**14      * Socket服務(wù)端15      */16     public static void main(String[] args) {17         try {18             ServerSocket serverSocket=new ServerSocket(8888);19             System.out.println("服務(wù)端已啟動,等待客戶端連接..");20             Socket socket=serverSocket.accept();//偵聽并接受到此套接字的連接,返回一個Socket對象21             22             23             //根據(jù)輸入輸出流和客戶端連接24             InputStream inputStream=socket.getInputStream();//得到一個輸入流,接收客戶端傳遞的信息25             InputStreamReader inputStreamReader=new InputStreamReader(inputStream);//提高效率,將自己字節(jié)流轉(zhuǎn)為字符流26             BufferedReader bufferedReader=new BufferedReader(inputStreamReader);//加入緩沖區(qū)27             String temp=null;28             String info="";29             while((temp=bufferedReader.readLine())!=null){30                 info+=temp;31                 System.out.println("已接收到客戶端連接");32                 System.out.println("服務(wù)端接收到客戶端信息:"+info+",當(dāng)前客戶端ip為:"+socket.getInetAddress().getHostAddress());33             }34             35             OutputStream outputStream=socket.getOutputStream();//獲取一個輸出流,向服務(wù)端發(fā)送信息36             PrintWriter printWriter=new PrintWriter(outputStream);//將輸出流包裝成打印流37             printWriter.print("你好,服務(wù)端已接收到您的信息");38             printWriter.flush();39             socket.shutdownOutput();//關(guān)閉輸出流40             41             42             43             //關(guān)閉相對應(yīng)的資源44             printWriter.close();45             outputStream.close();46             bufferedReader.close();47             inputStream.close();48             socket.close();49             50         } catch (IOException e) {51             e.printStackTrace();52         }53     }54 55 }

客戶端Client.java

1.創(chuàng)建Socket對象,指定服務(wù)端的地址和端口號

2.建立連接后,通過輸出輸入流進行讀寫操作

3.通過輸出輸入流獲取服務(wù)器返回信息

4.關(guān)閉相關(guān)資源

 1 import java.io.BufferedReader; 2 import java.io.IOException; 3 import java.io.InputStream; 4 import java.io.InputStreamReader; 5 import java.io.OutputStream; 6 import java.io.PrintWriter; 7 import java.net.Socket; 8 import java.net.UnknownHostException; 9 10 11 public class Client {12 13     /**14      * Socket客戶端15      */16     public static void main(String[] args) {17         try {18             //創(chuàng)建Socket對象19             Socket socket=new Socket("localhost",8888);20             21             //根據(jù)輸入輸出流和服務(wù)端連接22             OutputStream outputStream=socket.getOutputStream();//獲取一個輸出流,向服務(wù)端發(fā)送信息23             PrintWriter printWriter=new PrintWriter(outputStream);//將輸出流包裝成打印流24             printWriter.print("服務(wù)端你好,我是Balla_兔子");25             printWriter.flush();26             socket.shutdownOutput();//關(guān)閉輸出流27             28             InputStream inputStream=socket.getInputStream();//獲取一個輸入流,接收服務(wù)端的信息29             InputStreamReader inputStreamReader=new InputStreamReader(inputStream);//包裝成字符流,提高效率30             BufferedReader bufferedReader=new BufferedReader(inputStreamReader);//緩沖區(qū)31             String info="";32             String temp=null;//臨時變量33             while((temp=bufferedReader.readLine())!=null){34                 info+=temp;35                 System.out.println("客戶端接收服務(wù)端發(fā)送信息:"+info);36             }37             38             //關(guān)閉相對應(yīng)的資源39             bufferedReader.close();40             inputStream.close();41             printWriter.close();42             outputStream.close();43             socket.close();44         } catch (UnknownHostException e) {45             e.printStackTrace();46         } catch (IOException e) {47             e.printStackTrace();48         }49 50     }51 52 }

4、效果截圖:

服務(wù)端:

客戶端:

以上代碼實現(xiàn)了單客戶端和服務(wù)端的連接,若要實現(xiàn)多客戶端操作,需要涉及到多線程,只要你把每個接收到的Socket對象單獨開一條線程操作,然后用一個死循環(huán)while(true)去監(jiān)聽端口就行,這邊直接給代碼了

線程操作類:SocketThread.java

 1 import java.io.BufferedReader; 2 import java.io.IOException; 3 import java.io.InputStream; 4 import java.io.InputStreamReader; 5 import java.io.OutputStream; 6 import java.io.PrintWriter; 7 import java.net.Socket; 8  9 /**10  * Socket多線程處理類 用來處理服務(wù)端接收到的客戶端請求(處理Socket對象)11  */12 public class SocketThread extends Thread {13     private Socket socket;14 15     public SocketThread(Socket socket) {16         this.socket = socket;17     }18 19     public void run() {20         // 根據(jù)輸入輸出流和客戶端連接21         try {22             InputStream inputStream = socket.getInputStream();23             // 得到一個輸入流,接收客戶端傳遞的信息24             InputStreamReader inputStreamReader = new InputStreamReader(25                     inputStream);// 提高效率,將自己字節(jié)流轉(zhuǎn)為字符流26             BufferedReader bufferedReader = new BufferedReader(27                     inputStreamReader);// 加入緩沖區(qū)28             String temp = null;29             String info = "";30             while ((temp = bufferedReader.readLine()) != null) {31                 info += temp;32                 System.out.println("已接收到客戶端連接");33                 System.out.println("服務(wù)端接收到客戶端信息:" + info + ",當(dāng)前客戶端ip為:"34                         + socket.getInetAddress().getHostAddress());35             }36 37             OutputStream outputStream = socket.getOutputStream();// 獲取一個輸出流,向服務(wù)端發(fā)送信息38             PrintWriter printWriter = new PrintWriter(outputStream);// 將輸出流包裝成打印流39             printWriter.print("你好,服務(wù)端已接收到您的信息");40             printWriter.flush();41             socket.shutdownOutput();// 關(guān)閉輸出流42 43             // 關(guān)閉相對應(yīng)的資源44             bufferedReader.close();45             inputStream.close();46             printWriter.close();47             outputStream.close();48         } catch (IOException e) {49             e.printStackTrace();50         }51 52     }53 54 }

服務(wù)端類:Server.java

 1 import java.io.IOException; 2 import java.net.ServerSocket; 3 import java.net.Socket; 4  5 public class Server { 6  7     /** 8      * Socket服務(wù)端 9      */10     public static void main(String[] args) {11         try {12             ServerSocket serverSocket = new ServerSocket(8888);13             System.out.println("服務(wù)端已啟動,等待客戶端連接..");14 15             while (true) {16                 Socket socket = serverSocket.accept();// 偵聽并接受到此套接字的連接,返回一個Socket對象17                 SocketThread socketThread = new SocketThread(socket);18                 socketThread.start();19             }20 21         } catch (IOException e) {22             e.printStackTrace();23         }24     }25 26 }

客戶端類:Client.java

 1 import java.io.BufferedReader; 2 import java.io.IOException; 3 import java.io.InputStream; 4 import java.io.InputStreamReader; 5 import java.io.OutputStream; 6 import java.io.PrintWriter; 7 import java.net.Socket; 8 import java.net.UnknownHostException; 9 10 11 public class Client {12 13     /**14      * Socket客戶端15      */16     public static void main(String[] args) {17         try {18             //創(chuàng)建Socket對象19             Socket socket=new Socket("localhost",8888);20             21             //根據(jù)輸入輸出流和服務(wù)端連接22             OutputStream outputStream=socket.getOutputStream();//獲取一個輸出流,向服務(wù)端發(fā)送信息23             PrintWriter printWriter=new PrintWriter(outputStream);//將輸出流包裝成打印流24             printWriter.print("服務(wù)端你好,我是客戶1");25             printWriter.flush();26             socket.shutdownOutput();//關(guān)閉輸出流27             28             InputStream inputStream=socket.getInputStream();//獲取一個輸入流,接收服務(wù)端的信息29             InputStreamReader inputStreamReader=new InputStreamReader(inputStream);//包裝成字符流,提高效率30             BufferedReader bufferedReader=new BufferedReader(inputStreamReader);//緩沖區(qū)31             String info="";32             String temp=null;//臨時變量33             while((temp=bufferedReader.readLine())!=null){34                 info+=temp;35                 System.out.println("客戶端接收服務(wù)端發(fā)送信息:"+info);36             }37             38             //關(guān)閉相對應(yīng)的資源39             bufferedReader.close();40             inputStream.close();41             printWriter.close();42             outputStream.close();43             socket.close();44         } catch (UnknownHostException e) {45             e.printStackTrace();46         } catch (IOException e) {47             e.printStackTrace();48         }49 50     }51 52 }

看下效果實現(xiàn)圖:

這里只是拋磚引玉,在實際開發(fā)中,基于Socket編程,一般傳遞的并非字符串,很多情況下是對象,我們可以使用ObjectOutputStream將輸出流對象序列化。

例如:

1             OutputStream outputStream = socket.getOutputStream();2             ObjectOutputStream objectOutputStream=new ObjectOutputStream(outputStream);3             User user=new User("admin","123456");4             objectOutputStream.writeObject(user);

作者:Balla_兔子出處:http://m.survivalescaperooms.com/lichenwei/本文版權(quán)歸作者和博客園共有,歡迎轉(zhuǎn)載,但未經(jīng)作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接。正在看本人博客的這位童鞋,我看你氣度不凡,談吐間隱隱有王者之氣,日后必有一番作為!旁邊有“推薦”二字,你就順手把它點了吧,相得準(zhǔn),我分文不收;相不準(zhǔn),你也好回來找我!


上一篇:Hibernate4Maven

下一篇:centos下安裝nginx

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 封丘县| 巴塘县| 福泉市| 射洪县| 丹凤县| 永定县| 三河市| 齐齐哈尔市| 武陟县| 徐闻县| 神木县| 西城区| 曲阳县| 上杭县| 汉沽区| 石河子市| 赞皇县| 布尔津县| 巨鹿县| 山阴县| 陕西省| 鹤壁市| 青海省| 鲁山县| 乌恰县| 沐川县| 屏东市| 即墨市| 芒康县| 平谷区| 武威市| 治多县| 丹阳市| 枣强县| 紫云| 孟津县| 海盐县| 思茅市| 西丰县| 廉江市| 安康市|