亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Java網(wǎng)絡編程三要素及通信程序詳解

 更新時間:2023年07月28日 10:52:59   作者:袁袁袁袁滿  
這篇文章主要介紹了Java網(wǎng)絡編程三要素及通信程序詳解,Java網(wǎng)絡編程是在網(wǎng)絡通信協(xié)議下,實現(xiàn)網(wǎng)絡互連的不同計算機上運行的程序間可以進行數(shù)據(jù)交換,需要的朋友可以參考下

1 網(wǎng)絡編程入門

1.1 網(wǎng)絡編程概述

  • 計算機網(wǎng)絡:是指將地理位置不同的具有獨立功能的多臺計算機及 其外部設備,通過通信線路連接起來,在網(wǎng)絡操作系統(tǒng),網(wǎng)絡管理軟件及網(wǎng)絡通信協(xié)議的管理和協(xié)調(diào)下,實現(xiàn)資源共享和信息傳遞的計算機系統(tǒng)

在這里插入圖片描述

  • 網(wǎng)絡編程:在網(wǎng)絡通信協(xié)議下,實現(xiàn)網(wǎng)絡互連的不同計算機上運行的程序間可以進行數(shù)據(jù)交換

1.2 網(wǎng)絡編程三要素

  • IP地址

要想讓網(wǎng)絡中的計算機能夠 互相通信,必須為每臺計算機指定一個標識號, 通過這個標識號來指定要接收數(shù)據(jù)的計算機和識別發(fā)送的計算機,而IP地址就是這個標識號。也就是設備的標識

  • 端口

網(wǎng)絡的通信, 本質(zhì)上是兩個應用程序的通信。每臺計算機都有很多的應用程序,那么在網(wǎng)絡通信時,如何區(qū)分這些應用程序呢?如果說IP地址可以唯一標識網(wǎng)絡中的設備 ,那么端口號就可以唯一標識設備中的應用程序了。也就是應用程序的標識

  • 協(xié)議

通過計算機網(wǎng)絡可以使多 臺計算機實現(xiàn)連接,位于同一個網(wǎng)絡中的計算機在進行連接和通信時需要遵守-定的規(guī)則,這就好比在道路中行駛的汽車-定要遵守交通規(guī)則一 樣。在計算機網(wǎng)絡中,這些連接和通信的規(guī)則被稱為網(wǎng)絡通信協(xié)議,它對數(shù)據(jù)的傳輸格式、傳輸速率、傳輸步驟等做了統(tǒng)一規(guī)定, 通信雙方必須同時遵守才能完成數(shù)據(jù)交換。常見的協(xié)議有UDP協(xié)議和TCP協(xié)議

1.3 IP地址

  • IP地址:是網(wǎng)絡中設備的唯一標識
  • IP地址分為兩大類
    • IPv4:是給每個連接在網(wǎng)絡上的主機分配一個32bit地址。 按照TCP/IP規(guī)定,IP地址用二進制來表示, 每個P地址長32bit,也就是4個字節(jié)。例如一個采用I進制形式的IP地址是11000000 101010000000001 01000010" ,這么長的地址,處理起來也太費勁了。為了方便使用,IP地址經(jīng)常被寫成+進制的形式,中間使用符號"分隔不同的字節(jié)。于是,. 上面的IP地址可以表示為"192168. 1.66" . IP地址的這種表示法叫做"盼+進制表示法”, 這顯然比1和0容易記憶得多
    • IPv6:由于互聯(lián)網(wǎng)的蓬勃發(fā)展, IP地址的需求量愈來愈大,但是網(wǎng)絡地址資源有限,使得IP的分配越發(fā)緊張。為了擴大地址空間,通過IPv6重新定義地址空間,采用128位地址長度,每16個字節(jié)-組,分成8組十六進制數(shù),這樣就解決了網(wǎng)絡地址資源數(shù)量不夠的問題
  • 常用命令
    • ipconfig: 查看本機P地址ping
    • IP地址:檢查網(wǎng)絡是否連通
  • 特殊IP地址127.0.0.1:是回送地址,可以代表本機地址,一般用來測試使用

1.4 InetAddress的使用

  • 為了方便我們對IP地址的獲取和操作, Java提供了一個類InetAddress供我們使用
  • InetAddress:此類表示Internet協(xié)議(IP) 地址
  • 導包:import java.net.InetAddress
方法名說明
static InetAddress getByName(String host)確定主機名稱的IP地址。 主機名稱可以是機器名稱,也可以是IP地址
String getHostName()獲取此IP地址的主機名
String getHostAddress()返回文本顯示中的IP地址字符串

范例

package test;
import java.net.InetAddress;
import java.net.UnknownHostException;
public class Demo {
    public static void main(String[] args) throws UnknownHostException {
        //1,static InetAddress getByName(String host) 	確定主機名稱的IP地址。 主機名稱可以是機器名稱,也可以是IP地址
//        InetAddress address = InetAddress.getByName("YM");
        InetAddress address = InetAddress.getByName("192.168.128.1"); //推薦使用
        System.out.println(address); //YM/192.168.128.1
        //2,String getHostName() 	獲取此IP地址的主機名
        String hostName = address.getHostName();
        System.out.println(hostName); //YM
        //3,String getHostAddress() 	返回文本顯示中的IP地址字符串
        String hostAddress = address.getHostAddress();
        System.out.println(hostAddress); //192.168.128.1
    }
}

1.5 端口

  • 端口:設備上應用程序的唯一標識
  • 端口號:用兩個字節(jié)表示的整數(shù),它的取值范圍是0~65535。其中, 0~ 1023之間的端口號用于些知名的網(wǎng)絡服務和應用,普通的應用程序需要使用1024以上的端口號。如果端口號被另外一個服務或應用所占用,會導致當前程序啟動失敗

1.6 協(xié)議

  • 協(xié)議:計算機網(wǎng)絡中,連接和通信的規(guī)則被稱為網(wǎng)絡通信協(xié)議

UDP協(xié)議

  • 用戶數(shù)據(jù)報協(xié)議(User Datagram Protocol)
  • UDP是無連接通信協(xié)議, 即在數(shù)據(jù)傳輸時,數(shù)據(jù)的發(fā)送端和接收端不建立邏輯連接。簡單來說,當一臺計算機向另外-臺計算機發(fā)送數(shù)據(jù)時,發(fā)送端不會確認接收端是否存在,就會發(fā)出數(shù)據(jù),同樣接收端在收到數(shù)據(jù)時,也不會向發(fā)送端反饋是否收到數(shù)據(jù)。
  • 由于使用UDP協(xié)議消耗資源小,通信效率高,所以通常都會用于音頻視頻和普通數(shù)據(jù)的傳輸
  • 例如視頻會議通常采用UDP協(xié)議, 因為這種情況即使偶爾丟失一兩個數(shù)據(jù)包,也不會對接收結(jié)果產(chǎn)生大影響。但是在使用UDP協(xié)議傳送數(shù)據(jù)時,由于UDP的面向無連接性,不能保證數(shù)據(jù)的完整性,因此在傳輸重要數(shù)據(jù)時不建議使用UDP協(xié)議

TCP協(xié)議

  • 傳輸控制協(xié)議 (Transmission Control Protocol)
  • TCP協(xié)議是面向連接的通信協(xié)議,即傳輸數(shù)據(jù)之前,在發(fā)送端和接收端建立邏輯連接,然后再傳輸數(shù)據(jù),它提供了兩臺計算機之間可靠無差錯的數(shù)據(jù)傳輸。在TCP連接中必須要明確客戶端與服務器端,由客戶端向服務端發(fā)出連接請求,每次連接的創(chuàng)建都需要經(jīng)過“三次握手"
  • 三次握手:TCP協(xié)議中,在發(fā)送數(shù)據(jù)的準備階段,客戶端與服務器之間的三次交互,以保證連接的可靠
    • 第一次握手,客戶端向服務器端發(fā)出連接請求,等待服務器確認
    • 第二次握手,服務器端向客戶端回送一個響應, 通知客戶端收到了連接請求
    • 第三次握手,客戶端再次向服務器端發(fā)送確認信息,確認連接

在這里插入圖片描述

  • 完成三次握手,連接建立后,客戶端和服務器就可以開始進行數(shù)據(jù)傳輸了。由于這種面向連接的特性,TCP協(xié)議可以保證傳輸數(shù)據(jù)的安全,所以應用十分廣泛。例如上傳文件、下載文件、 瀏覽網(wǎng)頁等

2 UDP通信程序

2.1 UDP通信原理

UDP協(xié)議是一種不可靠的網(wǎng)絡協(xié)議,它在通信的兩端各建立一個Socket對象, 但是這兩個Socket只是發(fā)送,接收數(shù)據(jù)的對象因此對于基于UDP協(xié)議的通信雙方而言,沒有所謂的客戶端和服務器的概念

Java提供了DatagramSocket類作為基于UDP協(xié)議的Socket

2.2 UDP發(fā)送數(shù)據(jù)

  • 發(fā)送數(shù)據(jù)的步驟

1、創(chuàng)建發(fā)送端的Socket對象(DatagramSocket):DatagramSocket()

2、創(chuàng)建數(shù)據(jù), 并把數(shù)據(jù)打包:DatogramPacket (byte[] buf, int Length, InetAddress address, int port)

3、調(diào)用DatagramSocket對象的方法發(fā)送數(shù)據(jù):void send(DatagramPacket p)

4、關閉發(fā)送端:void close()

范例

package test;
import java.io.IOException;
import java.net.*;
public class Demo {
    public static void main(String[] args) throws IOException {
        //1、創(chuàng)建發(fā)送端的Socket對象(DatagramSocket)
        DatagramSocket ds = new DatagramSocket();
        //2、創(chuàng)建數(shù)據(jù), 并把數(shù)據(jù)打包
        //DatogramPacket (byte[] buf, int Length, InetAddress address, int port)
        // 構造一個數(shù)據(jù)包,發(fā)送長度為length的數(shù)據(jù) 包到指定主機上的指定端口號。
        byte[] bys = "hello,java".getBytes();
        DatagramPacket dp = new DatagramPacket(bys,bys.length, InetAddress.getByName("127.0.0.1"),10086);
        //3、調(diào)用DatagramSocket對象的方法發(fā)送數(shù)據(jù)
        //void send(DatagramPacket p)
        ds.send(dp);
        //4、關閉發(fā)送端
        ds.close();
    }
}

2.3 UDP接收數(shù)據(jù)

  • 接收數(shù)據(jù)的步驟

1、創(chuàng)建接收端的Socket對象(DatagramSocket):DatagramSocket(int port)

2、創(chuàng)建一個數(shù)據(jù)包, 用于接收數(shù)據(jù):DatagramPacket(byte[] buf, int length)

3、調(diào)用DatagramSocket對象的方法接收數(shù)據(jù):void receive(DatagramPacketp)

4、解析數(shù)據(jù)包, 并把數(shù)據(jù)在控制臺顯示:byte[] getData()int getLength()

5、關閉接收端:void close()

package test;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class ReceiveDemo {
    public static void main(String[] args) throws IOException {
        //1、創(chuàng)建接收端的Socket對象(DatagramSocket):DatagramSocket(int port)
        DatagramSocket ds = new DatagramSocket(10086);
        //2、創(chuàng)建一個數(shù)據(jù)包, 用于接收數(shù)據(jù)
        //DatagramPacket(byte[] buf, int length):構造一個DatagramPacket用來接收長度為length的數(shù)據(jù)包
        byte[] bys = new byte[1024];
        DatagramPacket dp = new DatagramPacket(bys, bys.length);
        //3、調(diào)用DatagramSocket對象的方法接收數(shù)據(jù):void receive(DatagramPacketp)
        ds.receive(dp);
        //4、解析數(shù)據(jù)包, 并把數(shù)據(jù)在控制臺顯示:
        // byte[] getData():返回數(shù)據(jù)緩沖區(qū) int getLength()
        byte[] datas = dp.getData();
        //int getlength():返回要發(fā)送的數(shù)據(jù)長度或接收的數(shù)據(jù)長度
        int len = dp.getlength();
        String dataString = new String(datas,0,len);
        System.out.println("數(shù)據(jù)是:"+dataString);
        //5、關閉接收端:void close()
        ds.close();
    }
}

2.4 范例

在這里插入圖片描述

發(fā)送端

package test;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class SendDemo {
    public static void main(String[] args) throws IOException {
        //1、創(chuàng)建發(fā)送端的Socket對象(DatagramSocket):DatagramSocket()
        DatagramSocket ds = new DatagramSocket();
        //鍵盤錄入數(shù)據(jù)
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String line;
        while ((line = br.readLine()) != null) {
            if ("886".equals(line)) {
                break;
            } else {
                //創(chuàng)建數(shù)據(jù)并把數(shù)據(jù)打包
                byte[] bys = line.getBytes();
                DatagramPacket dp = new DatagramPacket(bys, bys.length, InetAddress.getByName("127.0.0.1"), 1001);
                //3、調(diào)用DatagramSocket對象的方法發(fā)送數(shù)據(jù):void send(DatagramPacket p)
                ds.send(dp);
            }
        }
        ds.close();
    }
}

接收端

package test;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class ReceiveDemo {
    public static void main(String[] args) throws IOException {
        //創(chuàng)建接收端的Socket對象(DatagramSocket):DatagramSocket(int port)
        DatagramSocket ds = new DatagramSocket(1001);
        while(true) {
            //創(chuàng)建一個數(shù)據(jù)包接收數(shù)據(jù)
            byte[] bys = new byte[1024];
            DatagramPacket dp = new DatagramPacket(bys, bys.length);
            //調(diào)用DatagramSocket對象的方法接收數(shù)據(jù):void receive(DatagramPacketp)
            ds.receive(dp);
            //解析數(shù)據(jù)包, 并把數(shù)據(jù)在控制臺顯示:byte[] getData()、int getLength()
            System.out.println("數(shù)據(jù)是:" + new String(dp.getData(), 0, dp.getLength()));
        }
        //關閉
//        ds.close();
    }
}

3 TCP通信程序

3.1 TCP通信原理

TCP通信協(xié)議是一種可靠的網(wǎng)絡協(xié)議, 它在通信的兩端名建立一個Socke對象, 從而在通信的兩端形成網(wǎng)絡虛擬鏈路一旦建立了 虛擬的網(wǎng)絡鏈路,兩端的程序就可以通過虛擬鏈路進行通信

Java對基于TCP協(xié)議的的網(wǎng)絡提供了良好的封裝,使用Socket對象來代表兩端的通信端口,并通過Socket產(chǎn)生l0流來進行網(wǎng)絡通信Java為客戶端提供了Socket類,為服務器端提供了ServerSocket類

3.2 TCP發(fā)送數(shù)據(jù)

  • 發(fā)送數(shù)據(jù)的步驟

1、創(chuàng)建客戶端的Socket對象(Socket):Socket(String host, int port)

2、獲取輸出流,寫數(shù)據(jù):OutputStream對象的getOutputStream()方法

???????3、釋放資源:void close()

范例:

package test;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
public class ClientDemo {
    public static void main(String[] args) throws IOException {
        //1、創(chuàng)建客戶端的Socket對象(Socket):Socket(String host, int port)
        Socket s = new Socket("127.0.0.1",1000);
        //2、獲取輸出流,寫數(shù)據(jù):OutputStream對象的getOutputStream()方法
        OutputStream os = s.getOutputStream();
        os.write("hello,java".getBytes());
        //3、釋放資源:void close()
        s.close();
    }
}

3.3 TCP接收數(shù)據(jù)

  • 接收數(shù)據(jù)的步驟

1、創(chuàng)建服務 器端的Socket對象(ServerSocket):ServerSocket(int port)

???????2、監(jiān)聽客戶端連接, 返回個Socket對象:Socket accept()

???????3、獲取輸入流, 讀數(shù)據(jù),并把數(shù)據(jù)顯示在控制臺:InputStream對象的getInputStream()方法

???????4、釋放資源:void close()

范例

package test;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class SeverDemo {
    public static void main(String[] args) throws IOException {
        //1、創(chuàng)建服務 器端的Socket對象(ServerSocket):ServerSocket(int port)
        ServerSocket ss = new ServerSocket(1000);
        //2、監(jiān)聽客戶端連接, 返回個Socket對象:Socket accept()
        Socket s = ss.accept();
        //3、獲取輸入流, 讀數(shù)據(jù),并把數(shù)據(jù)顯示在控制臺:InputStream對象的getInputStream()方法
        InputStream is = s.getInputStream();
        byte[] bys = new byte[1014];
        int len = is.read(bys);
        String data = new String(bys,0,len);
        System.out.println(data);
        //4、釋放資源:void close()
        s.close();
        ss.close();
    }
}

3.4 案例

3.4.1 練習一:服務器給出反饋

在這里插入圖片描述

客戶端

package test;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
public class ClientDemo {
    public static void main(String[] args) throws IOException {
        //1、創(chuàng)建客戶端的Socket對象(Socket):Socket(String host, int port)
        Socket s = new Socket("127.0.0.1",1000);
        //2、獲取輸出流,寫數(shù)據(jù):OutputStream對象的getOutputStream()方法
        OutputStream os = s.getOutputStream();
        os.write("hello,java".getBytes());
        //接收服務器反饋
        InputStream is = s.getInputStream();
        byte[] bys = new byte[1024];
        int len = is.read(bys);
        String data = new String(bys,0,len);
        System.out.println("客戶端:"+data);
        //3、釋放資源:void close()
        s.close();
        //客戶端:數(shù)據(jù)已經(jīng)收到
    }
}

服務器

package test;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class SeverDemo {
    public static void main(String[] args) throws IOException {
        //1、創(chuàng)建服務 器端的Socket對象(ServerSocket):ServerSocket(int port)
        ServerSocket ss = new ServerSocket(1000);
        //2、監(jiān)聽客戶端連接, 返回個Socket對象:Socket accept()
        Socket s = ss.accept();
        //3、獲取輸入流, 讀數(shù)據(jù),并把數(shù)據(jù)顯示在控制臺:InputStream對象的getInputStream()方法
        InputStream is = s.getInputStream();
        byte[] bys = new byte[1014];
        int len = is.read(bys);
        String data = new String(bys,0,len);
        System.out.println("服務器:"+data);
        //給出反饋
        OutputStream os = s.getOutputStream();
        os.write("數(shù)據(jù)已經(jīng)收到".getBytes());
        //4、釋放資源:void close()
        s.close();
        ss.close();
        //服務器:hello,java
    }
}

3.4.2 練習二:客戶端數(shù)據(jù)來源于鍵盤錄入

在這里插入圖片描述

客戶端

package test;
import java.io.*;
import java.net.Socket;
public class ClientDemo {
    public static void main(String[] args) throws IOException {
        //創(chuàng)建客戶端的Socket對象(Socket):Socket(String host, int port)
        Socket s = new Socket("127.0.0.1",1000);
        //數(shù)據(jù)來源于鍵盤錄入,直到886停止
        System.out.println("請輸入數(shù)據(jù)");
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        //封裝輸出流對象
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
        String line;
        while((line= br.readLine())!=null) {
            if("886".equals(line)) {
                break;
            }
            //獲取輸出流對象
            bw.write(line);
            bw.newLine();
            bw.flush();
        }
        //釋放資源
        s.close();
//        hello
//        886
    }
}

服務器

package test;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class SeverDemo {
    public static void main(String[] args) throws IOException {
        //1、創(chuàng)建服務 器端的Socket對象(ServerSocket):ServerSocket(int port)
        ServerSocket ss = new ServerSocket(1000);
        //2、監(jiān)聽客戶端連接, 返回個Socket對象:Socket accept()
        Socket s = ss.accept();
        //3、獲取輸入流, 讀數(shù)據(jù),并把數(shù)據(jù)顯示在控制臺:InputStream對象的getInputStream()方法
//        InputStream is = s.getInputStream();
//        InputStreamReader isr = new InputStreamReader(is);
//        BufferedReader br = new BufferedReader(isr);
        BufferedReader br  = new BufferedReader(new InputStreamReader(s.getInputStream()));
        String line;
        while((line=br.readLine())!=null) {
            System.out.println(line);
        }
        //4、釋放資源:void close()
        s.close();
        //hello
    }
}

3.4.3 練習三:服務器數(shù)據(jù)寫入文本文件

在這里插入圖片描述

服務器

package test;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class SeverDemo {
    public static void main(String[] args) throws IOException {
        //1、創(chuàng)建服務 器端的Socket對象(ServerSocket):ServerSocket(int port)
        ServerSocket ss = new ServerSocket(1000);
        //2、監(jiān)聽客戶端連接, 返回個Socket對象:Socket accept()
        Socket s = ss.accept();
        //3、獲取輸入流, 讀數(shù)據(jù),并把數(shù)據(jù)顯示在控制臺:InputStream對象的getInputStream()方法
        BufferedReader br  = new BufferedReader(new InputStreamReader(s.getInputStream()));
        //把數(shù)據(jù)寫入文本文件
        BufferedWriter bw = new BufferedWriter(new FileWriter("E:\\test\\java.txt"));
        String line;
        while((line=br.readLine())!=null) {
            bw.write(line);
            bw.newLine();
            bw.flush();
        }
        //4、釋放資源:void close()
        bw.close();
        ss.close();
        //文件中數(shù)據(jù):hello
    }
}

3.4.4 練習四:客戶端數(shù)據(jù)來源于文本文件

在這里插入圖片描述

客戶端

package test;
import java.io.*;
import java.net.Socket;
public class ClientDemo {
    public static void main(String[] args) throws IOException {
        //創(chuàng)建客戶端的Socket對象(Socket):Socket(String host, int port)
        Socket s = new Socket("127.0.0.1",1000);
        //封裝文本文件數(shù)據(jù)
        BufferedReader br  =new BufferedReader(new FileReader("E:\\test\\fos.txt"));
        //封裝輸出流對象
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
        String line;
        while((line= br.readLine())!=null) {
            //獲取輸出流對象
            bw.write(line);
            bw.newLine();
            bw.flush();
        }
        //釋放資源
        br.close();
        s.close();
    }
}

3.4.5 練習五:上傳文件服務器給出反饋

![在這里插入圖片描述](https://img-blog.csdnimg.cn/5505

客戶端

package test;
import java.io.*;
import java.net.Socket;
public class ClientDemo {
    public static void main(String[] args) throws IOException {
        //創(chuàng)建客戶端的Socket對象(Socket):Socket(String host, int port)
        Socket s = new Socket("127.0.0.1",1000);
        //封裝文本文件數(shù)據(jù)
        BufferedReader br  =new BufferedReader(new FileReader("E:\\test\\fos.txt"));
        //封裝輸出流對象
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
        String line;
        while((line= br.readLine())!=null) {
            //獲取輸出流對象
            bw.write(line);
            bw.newLine();
            bw.flush();
        }
//        //自定義結(jié)束標記
//        bw.write("886");
//        bw.newLine();
//        bw.flush();
        s.shutdownOutput();//Socket類中方法:表示輸出結(jié)束
        //接收反饋
        BufferedReader brClient = new BufferedReader(new InputStreamReader(s.getInputStream()));
        String data = brClient.readLine(); //等待讀取數(shù)據(jù)
        System.out.println("服務器的反饋:"+data); //服務器的反饋:文件上傳成功
        //釋放資源
        br.close();
        s.close();
    }
}

服務端

package test;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class SeverDemo {
    public static void main(String[] args) throws IOException {
        //1、創(chuàng)建服務 器端的Socket對象(ServerSocket):ServerSocket(int port)
        ServerSocket ss = new ServerSocket(1000);
        //2、監(jiān)聽客戶端連接, 返回個Socket對象:Socket accept()
        Socket s = ss.accept();
        //3、獲取輸入流, 讀數(shù)據(jù),并把數(shù)據(jù)顯示在控制臺:InputStream對象的getInputStream()方法
        BufferedReader br  = new BufferedReader(new InputStreamReader(s.getInputStream()));
        //把數(shù)據(jù)寫入文本文件
        BufferedWriter bw = new BufferedWriter(new FileWriter("E:\\test\\java.txt"));
        String line;
        while((line=br.readLine())!=null) { //等待讀取數(shù)據(jù)
//            if("886".equals(line)) {
//                break;
//            }
            bw.write(line);
            bw.newLine();
            bw.flush();
        }
        //給出反饋
        BufferedWriter bwServer = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
        bwServer.write("文件上傳成功");
        bwServer.newLine();
        bwServer.flush();
        //4、釋放資源:void close()
        bw.close();
        ss.close();
    }
}

3.4.6 練習六:多線程實現(xiàn)文件上傳

在這里插入圖片描述

服務端

package test;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class SeverDemo {
    public static void main(String[] args) throws IOException {
        //創(chuàng)建服務 器端的Socket對象(ServerSocket):ServerSocket(int port)
        ServerSocket ss = new ServerSocket(1000);
        while(true) {
            //監(jiān)聽客戶端連接, 返回個Socket對象:Socket accept()
            Socket s = ss.accept();
            //為每一個客戶端開啟一個線程
            new Thread(new ServerThread(s)).start();
        }
    }
}

服務端多線程

package test;
import java.io.*;
import java.net.Socket;
public class ServerThread implements Runnable {
    private Socket s;
    public ServerThread(Socket s) {
        this.s = s;
    }
    @Override
    public void run() {
        try {
            //接收數(shù)據(jù)寫入文本文件
            BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
//            BufferedWriter bw = new BufferedWriter(new FileWriter("E:\\test\\java.txt"));
            //解決名稱沖突問題,上傳到不同文件中
            int count = 0;
            File file = new File("E:\\test\\["+count+"]java.txt");
            while(file.exists()) {
                count++;
                file = new File("E:\\test\\["+count+"]java.txt");
            }
            BufferedWriter bw = new BufferedWriter(new FileWriter(file));
            String line;
            while ((line=br.readLine()) != null) {
                bw.write(line);
                bw.newLine();
                bw.flush();
            }
            //給出反饋
            BufferedWriter bwSever  =new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
            bwSever.write("文件上傳成功");
            bwSever.newLine();
            bwSever.flush();
            //釋放資源
            s.close();
        }catch (IOException e) {
            e.printStackTrace();
        }
    }
}

到此這篇關于Java網(wǎng)絡編程三要素及通信程序詳解的文章就介紹到這了,更多相關Java網(wǎng)絡編程內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

最新評論