一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

基于Tcp協(xié)議的簡(jiǎn)單Socket通信實(shí)例(JAVA)

 我的java之路 2016-12-22

好久沒(méi)寫(xiě)博客了,前段時(shí)間忙于做項(xiàng)目,耽誤了些時(shí)間,今天開(kāi)始繼續(xù)寫(xiě)起~

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

 

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

 

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

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

2.打開(kāi)連接到Socket的輸出輸入流

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

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

 

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

 

1.首先先來(lái)看下ServerSocket

類(lèi) ServerSocket 

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

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

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

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

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

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

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

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

 

2.再來(lái)看下Socket

類(lèi) Socket  

此類(lèi)實(shí)現(xiàn)客戶(hù)端套接字(也可以就叫“套接字”)。套接字是兩臺(tái)機(jī)器間通信的端點(diǎn)。

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

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

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

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

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

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

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

 

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

服務(wù)端Server.java

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

2.通過(guò)accept監(jiān)聽(tīng)客戶(hù)端的請(qǐng)求

3.建立連接后,通過(guò)輸出輸入流進(jìn)行讀寫(xiě)操作

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

復(fù)制代碼
 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ù)端已啟動(dòng),等待客戶(hù)端連接..");
20             Socket socket=serverSocket.accept();//偵聽(tīng)并接受到此套接字的連接,返回一個(gè)Socket對(duì)象
21             
22             
23             //根據(jù)輸入輸出流和客戶(hù)端連接
24             InputStream inputStream=socket.getInputStream();//得到一個(gè)輸入流,接收客戶(hù)端傳遞的信息
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("已接收到客戶(hù)端連接");
32                 System.out.println("服務(wù)端接收到客戶(hù)端信息:"+info+",當(dāng)前客戶(hù)端ip為:"+socket.getInetAddress().getHostAddress());
33             }
34             
35             OutputStream outputStream=socket.getOutputStream();//獲取一個(gè)輸出流,向服務(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)閉相對(duì)應(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 }
復(fù)制代碼

 

客戶(hù)端Client.java

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

2.建立連接后,通過(guò)輸出輸入流進(jìn)行讀寫(xiě)操作

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

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

復(fù)制代碼
 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客戶(hù)端
15      */
16     public static void main(String[] args) {
17         try {
18             //創(chuàng)建Socket對(duì)象
19             Socket socket=new Socket("localhost",8888);
20             
21             //根據(jù)輸入輸出流和服務(wù)端連接
22             OutputStream outputStream=socket.getOutputStream();//獲取一個(gè)輸出流,向服務(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();//獲取一個(gè)輸入流,接收服務(wù)端的信息
29             InputStreamReader inputStreamReader=new InputStreamReader(inputStream);//包裝成字符流,提高效率
30             BufferedReader bufferedReader=new BufferedReader(inputStreamReader);//緩沖區(qū)
31             String info="";
32             String temp=null;//臨時(shí)變量
33             while((temp=bufferedReader.readLine())!=null){
34                 info+=temp;
35                 System.out.println("客戶(hù)端接收服務(wù)端發(fā)送信息:"+info);
36             }
37             
38             //關(guān)閉相對(duì)應(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 }
復(fù)制代碼

 

4、效果截圖:

服務(wù)端:

客戶(hù)端:

 

 

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

 

線(xiàn)程操作類(lèi):SocketThread.java

復(fù)制代碼
 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多線(xiàn)程處理類(lèi) 用來(lái)處理服務(wù)端接收到的客戶(hù)端請(qǐng)求(處理Socket對(duì)象)
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ù)輸入輸出流和客戶(hù)端連接
21         try {
22             InputStream inputStream = socket.getInputStream();
23             // 得到一個(gè)輸入流,接收客戶(hù)端傳遞的信息
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("已接收到客戶(hù)端連接");
33                 System.out.println("服務(wù)端接收到客戶(hù)端信息:" + info + ",當(dāng)前客戶(hù)端ip為:"
34                         + socket.getInetAddress().getHostAddress());
35             }
36 
37             OutputStream outputStream = socket.getOutputStream();// 獲取一個(gè)輸出流,向服務(wù)端發(fā)送信息
38             PrintWriter printWriter = new PrintWriter(outputStream);// 將輸出流包裝成打印流
39             printWriter.print("你好,服務(wù)端已接收到您的信息");
40             printWriter.flush();
41             socket.shutdownOutput();// 關(guān)閉輸出流
42 
43             // 關(guān)閉相對(duì)應(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 }
復(fù)制代碼

 

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

復(fù)制代碼
 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ù)端已啟動(dòng),等待客戶(hù)端連接..");
14 
15             while (true) {
16                 Socket socket = serverSocket.accept();// 偵聽(tīng)并接受到此套接字的連接,返回一個(gè)Socket對(duì)象
17                 SocketThread socketThread = new SocketThread(socket);
18                 socketThread.start();
19             }
20 
21         } catch (IOException e) {
22             e.printStackTrace();
23         }
24     }
25 
26 }
復(fù)制代碼

 

客戶(hù)端類(lèi):Client.java

復(fù)制代碼
 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客戶(hù)端
15      */
16     public static void main(String[] args) {
17         try {
18             //創(chuàng)建Socket對(duì)象
19             Socket socket=new Socket("localhost",8888);
20             
21             //根據(jù)輸入輸出流和服務(wù)端連接
22             OutputStream outputStream=socket.getOutputStream();//獲取一個(gè)輸出流,向服務(wù)端發(fā)送信息
23             PrintWriter printWriter=new PrintWriter(outputStream);//將輸出流包裝成打印流
24             printWriter.print("服務(wù)端你好,我是客戶(hù)1");
25             printWriter.flush();
26             socket.shutdownOutput();//關(guān)閉輸出流
27             
28             InputStream inputStream=socket.getInputStream();//獲取一個(gè)輸入流,接收服務(wù)端的信息
29             InputStreamReader inputStreamReader=new InputStreamReader(inputStream);//包裝成字符流,提高效率
30             BufferedReader bufferedReader=new BufferedReader(inputStreamReader);//緩沖區(qū)
31             String info="";
32             String temp=null;//臨時(shí)變量
33             while((temp=bufferedReader.readLine())!=null){
34                 info+=temp;
35                 System.out.println("客戶(hù)端接收服務(wù)端發(fā)送信息:"+info);
36             }
37             
38             //關(guān)閉相對(duì)應(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 }
復(fù)制代碼

 

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

 

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

例如:

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

 

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

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶(hù)發(fā)布,不代表本站觀(guān)點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶(hù) 評(píng)論公約

    類(lèi)似文章 更多

    亚洲熟妇中文字幕五十路| 精品伊人久久大香线蕉综合 | 日韩高清毛片免费观看| 成人三级视频在线观看不卡| 午夜国产成人福利视频| 色哟哟精品一区二区三区| 精品国产亚洲av成人一区| 亚洲国产成人av毛片国产| 激情偷拍一区二区三区视频| 国产精品成人免费精品自在线观看| 精品国产av一区二区三区不卡蜜| 最新日韩精品一推荐日韩精品| 99久久国产亚洲综合精品| 日本一本不卡免费视频| 免费观看一级欧美大片| 中日韩美一级特黄大片| 亚洲精品国产福利在线| 国产欧洲亚洲日产一区二区| 麻豆国产精品一区二区三区| 国产精品丝袜一二三区| 国产伦精品一区二区三区精品视频| 欧美午夜国产在线观看| 丝袜人妻夜夜爽一区二区三区| 欧美又黑又粗大又硬又爽| 国产一区二区三区丝袜不卡| 久久99亚洲小姐精品综合| 亚洲中文字幕视频一区二区| 色哟哟哟在线观看视频| 日本人妻的诱惑在线观看| 国产精品午夜视频免费观看| 国产女同精品一区二区| 大香蕉久草网一区二区三区| 国产高清一区二区白浆| 国产又粗又黄又爽又硬的| 亚洲av首页免费在线观看| 麻豆视传媒短视频在线看| 精品偷拍一区二区三区| 午夜精品在线观看视频午夜| 久久精品偷拍视频观看| 亚洲一区二区三区四区性色av| 亚洲国产精品无遮挡羞羞|