第二十一章總結。。

計算機網絡實現了墮胎計算機間的互聯,使得它們彼此之間能夠進行數據交流。網絡應用程序就是再已連接的不同計算機上運行的程序,這些程序借助于網絡協議,相互之間可以交換數據,編寫網絡應用程序前,首先必須明確網絡協議TCP/IP協議是網絡應用程序的首選

網絡程序設計基礎:
網絡程序設計編寫始于其他計算機進行通信的程序,java已經將網絡程序所需要而定元素封裝成不同的類,用戶只要床啊金這些類的對象,使用相應的方法即使不舉報相關的網絡知識,也是可以編寫除高質量的網絡通信程序的,

Internet 提供了大量有用的信息,很少有人能在接觸過Internet后拒絕它的誘惑。計算機網絡實現了多臺計算機間的互聯,使得它們彼此之間能夠進行數據交流。網絡應用程序就是在已連接的不同計算機上運行的程序,這些程序借助于網絡協議,相互之間可以交換數據。編寫網絡應用程序前,首先必須明確所要使用的網絡協議。

21.1網絡程序設計基礎
網絡程序設計編寫的是與其他計算機進行通信的程序。Java已經將網絡程序所需要的元素封裝或不同的類,用戶只要創建這些類的對象,使用相應的方法,即使不具備有關的網絡知識,也可以編寫出高質量的網絡通信程序。


1.1局域網與互聯網

為了實現兩臺計算機的通信,必須用一個網絡線路連接兩臺計算機。

1.2網絡協議
網絡協議規定了計算機之間連接的物理、機械(網線與網卡的連接規定)、電氣(有效的電平范圍)等特征,計算機之間的相互尋址規則,數據發送沖突的解決方式,長數據如何分段傳送與接收等內容。就像不同的國家有不同的法律一樣,目前網絡協議也有多種。下面簡單地介紹幾個常用的網絡協議。
(1)IP 協議
IP 是Internet Protocol的簡稱,是一種網絡協議。Internet網絡采用的協議是TCP/IP協議,其全稱是Transmission Control Protocol/Internet Protocol。Internet依靠TCP/IP協議,在全球范圍內實現了不同硬件結構、不同操作系統、不同網絡系統間的互聯。在Internet網絡上存在著數以億計的主機,每臺主機都用網絡為其分配的Internet地址代表自己,這個地址就是IP地址。

(2)TCP與UDP 協議
在TCP/IP協議棧中,有兩個高級協議是網絡應用程序編寫者應該了解的,即傳輸控制協議(Transmission Control Protocol,TCP)與用戶數據報協議(User Datagram Protocol,UDP)。
TCP協議是一種以固接連線為基礎的協議,它提供兩臺計算機間可靠的數據傳送。TCP可以保證數據從一端送至連接的另一端時,能夠確實送達,而且抵達的數據的排列順序和送出時的順序相同。因此,TCP協議適合可靠性要求比較高的場合。就像撥打電話,必須先撥號給對方,等兩端確定連接后,相互才能聽到對方說話,也知道對方回應的是什么。
HTTP、FTP 和 Telnet等都需要使用可靠的通信頻道。例如,HTTP從某個URL讀取數據時,如果收到的數據順序與發送時不相同,可能就會出現一個混亂的HTML文件或是一些無效的信息。
UDP是無連接通信協議,不保證數據的可靠傳輸,但能夠向若干個目標發送數據,或接收來自若干個源的數據。UDP以獨立發送數據包的方式進行。這種方式就像郵遞員送信給收信人,可以寄出很多信給同一個人,且每一封信都是相對獨立的,各封信送達的順序并不重要,收信人接收信件的順序也不能保證與寄出信件的順序相同。
UDP協議適合于一些對數據準確性要求不高,但對傳輸速度和時效性要求非常高的網站,如網絡聊天室、在線影片等。這是由于TCP協議在認證上存在額外耗費,可能使傳輸速度減慢,而UDP協議即使有一小部分數據包遺失或傳送順序有所不同,也不會嚴重危害該項通信。
注意
一些防火墻和路由器會設置成不允許UDP數據包傳輸,因此若遇到UDP連接方面的問題,應先確定所在網絡是否允許UDP協議。

1.3 端口與套接字

一般而言,一臺計算機只有單一的連到網絡的物理連接(PhysicalConnection),所有的數據都通過此連接對內、對外送達特定的計算機,這就是端口。網絡程序設計中的端口(port)并非真實的物理存在,而是一個假想的連接裝置。端口被規定為一個在0~65535的整數。HTTP服務一般使用80端口, FTP服務使用21端口。假如一臺計算機提供了HTTP、FTP等多種服務,那么客戶機會通過不同的端口來確定連接到服務器的哪項服務上,如圖21.3所示。
通常,0~1023 的端口數用于一些知名的網絡服務和應用,用戶的普通網絡應用程序應該使用1024以上的端口數,以避免端口號與另一個應用或系統服務所用端口沖突。
網絡程序中的套接字(Socket)用于將應用程序與端口連接起來。套接字是一個假想的連接裝置,就像插座一樣可連接電器與電線,如圖21.4所示。Java將套接字抽象化為類,程序設計者只需創建Socket類對象,即可使用套接字。

21.2 TCP程序

TCP 網絡程序設計是指利用Socket類編寫通信程序。利用TCP協議進行通信的兩個應用程序是有主次之分的,一個稱為服務器程序,另一個稱為客戶機程序,兩者的功能和編寫方法大不一樣。

2.1 InetAddress類
jae包中的InetAddress類是與IP地址相關的類,利用該類可以獲取IP地址、主機地址等信息。

import java.net.InetAddress;
?
import java.rmi.UnknownHostException;
?
public class Address {
?
public static void main(String[] args) throws UnknownHostException {
?
InetAddress l = null;
?
InetAddress ip = l;
?
try {
?
ip = InetAddress.getLocalHost();
?
} catch (java.net.UnknownHostException e) {
?
?
e.printStackTrace();
?
}
?
String localname = ip.getHostName();
?
String localip = ip.getHostAddress();
?
System.out.println("本機名: " + localname);
?
System.out.println("本機IP地址: "+ localip);
?
}
?
}

2.2 ServerSocket 類

java.net包中的ServerSocket類用于表示服務器套接字,其主要功能是等待來自網絡上的“請求”。
它可通過指定的端口來等待連接的套接字。服務器套接字一次可以與一個套接字連接。如果多臺客戶機同時提出連接請求,服務器套接字會將請求連接的客戶機存入列隊中,然后從中取出一個套字。與服務器新建的套接字連接起來。若請求連接數大于最大容納數,則多出的連接請求被拒絕。默認大小是50。 ??

2.3TCP通信
TCP通信方式呢 ?主要的通訊方式是一對一的通訊方式,也有著優點和缺點 ?它的優點對比于UDP來說就是更可靠 因為它的通訊方式是需要先發送消息 看看客戶端是否能夠接收到消息 如果沒有回復消息的話 服務端 ?就不會發出文件 等待客戶端回復消息,這個握手模式的話 ?就會非常可靠 ?以下代碼進行講解:

21.3UDP程序
用戶數據報協議(UDP)是網絡信息傳輸的另一種形式。基于UDP的通信和基于TCP的通信不同,基于UDP的信息傳遞更快,但不提供可靠性保證。使用UDP傳遞數據時,用戶無法知道數據能否正確地到達主機,也不能確定到達目的地的順序是否和發送的順序相同。雖然UDP是一種不可靠的協議,但如果需要較快地傳輸信息,并能容忍小的錯誤,可以考慮使用UDP。
基于 UDP通信的基本模式如下:
?將數據打包(稱為數據包),然后將數據包發往目的地。

?接收別人發來的數據包,然后查看數據包。

發送數據包的步驟如下:
(1)使用DatagramSocket()創建一個數據包套接字。
(2)使用DatagramPacket(byte[] buf, int offset, int length, InetAddress address, int port)創建要發的數據包。
(3)使用DatagramSocket類的send()方法發送數據包。

接收數據包的步驟如下:

(1)使用DatagramSocket(int port)創建數據包套接字,綁定到指定的端口。

(2)使用DatagramPacket(byte[] buf, int length)創建字節數組來接收數據包。

(3)使用DatagramPacket類的receive(方法接收UDP包。

注意

DatagramSocket類的receive()方法接收數據時,如果還沒有可以接收的數據,在正常情況下 receive()方法將阻害,一直等到網絡上有數據傳來,receive()方法接收該數據并返回。如果網絡上沒有數據發送過來,receive()方法也沒有阻塞,肯定是程序有問題,大多數情況下是因為使用了一個被其他程序占用的端口號。

3.1 DatagramPacket類

javanet 包的 DatagramPacket類用來表示數據包。DatagramPacket類的構造方法如下:?DatagramPacke1(byte]buf, int length).
DatagramPackel(byse[] buf,int length,InetAddress address, int port).
第一種構造方法在創建DatagramPacket對象時,指定了數據包的內存空間和大小。第二種構造方法不僅指定了數據包的內存空間和大小,還指定了數據包的目標地址和端口。在發送數據時,必須指定接收方的Socket地址和端口號,因此使用第二種構造方法可創建發送數據的DatagramPacket對象。

3.2 DatagramSocket 類

java.net 包中的DatagramSocket類用于表示發送和接收數據包的套接字。該類的構造方法如下:?DatagramSocket()。
?DatagramSocket(int port)。
DatagramSocket(int port, InetAddress addr)。
第一種構造方法創建DatagramSocket對象,構造數據報套接字,并將其綁定到本地主機任何可用的端口上。第二種構造方法創建DatagramSocket對象,創建數據報套接字,并將其綁定到本地主機的指定端口上。第三種構造方法創建DatagramSocket對象,創建數據報套接字,并將其綁定到指定的端口和指定的本地地址上。第三種構造函數適用于有多塊網卡和多個IP地址的情況。

最主要的是TCP和UDP兩個部分 ?他們兩主要的區別就是一個是一對一通信 ?一個是一對多通信 ? 當然兩者都有各自的優勢和劣勢,接下來先講解 TCP部分

TCP程序
TCP程序的通信方式呢 是一對一的 ? 步驟是 ?先要打開服務器然后客戶端連接服務器 ?先是嘗試客戶端是否能夠接收到信息 ?如果可以接收到信息的話 ?這時服務器將會把文件傳輸給客戶端,這樣的話 能夠保證客戶端可以接收到信息 ?,劣勢呢就是每次都是要這樣子 所以效率對比起UDP來說慢下了好多 ?以下代碼將會進行講解

客戶端代碼:

package tcp;
?
import java.io.*;
import java.net.Socket;
import java.util.Scanner;
?
/**
?* Socket客戶端
?**/
public class SocketClient {
? ? public static void main(String[] args) {
? ? ? ? Socket s = null;
? ? ? ? try {
? ? ? ? ? ? // 與ip為127.0.0.1、端口為12345的服務端建立連接
? ? ? ? ? ? s = new Socket("127.0.0.1", 12345);
?
? ? ? ? ? ? // 創建輸入流接收服務端發送的消息(字節流)
? ? ? ? ? ? InputStream is = s.getInputStream();
? ? ? ? ? ? // 將服務端返回的字節流轉化為字符流
? ? ? ? ? ? InputStreamReader isr = new InputStreamReader(is);
? ? ? ? ? ? // 創建字符流讀取緩沖區,方便每行讀取
? ? ? ? ? ? BufferedReader br = new BufferedReader(isr);
?
? ? ? ? ? ? // 創建輸出流返回消息
? ? ? ? ? ? OutputStream os = s.getOutputStream();
? ? ? ? ? ? // 創建輸出流緩沖
? ? ? ? ? ? PrintWriter pw = new PrintWriter(os);
?
? ? ? ? ? ? // 創建發送消息的線程
? ? ? ? ? ? Runnable rOut = () -> {
? ? ? ? ? ? ? ? boolean flag = true;
? ? ? ? ? ? ? ? while (flag) {
? ? ? ? ? ? ? ? ? ? try {
? ? ? ? ? ? ? ? ? ? ? ? // 接收控制臺輸入
? ? ? ? ? ? ? ? ? ? ? ? Scanner scan = new Scanner(System.in);
? ? ? ? ? ? ? ? ? ? ? ? String msg = scan.nextLine();
? ? ? ? ? ? ? ? ? ? ? ? // 將輸入寫入緩沖
? ? ? ? ? ? ? ? ? ? ? ? pw.println(msg);
? ? ? ? ? ? ? ? ? ? ? ? // 將緩沖內的數據推送至服務端并清空緩沖區
? ? ? ? ? ? ? ? ? ? ? ? pw.flush();
? ? ? ? ? ? ? ? ? ? } catch (Exception e) {
? ? ? ? ? ? ? ? ? ? ? ? flag = false;
? ? ? ? ? ? ? ? ? ? ? ? e.printStackTrace();
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? }
? ? ? ? ? ? };
?
? ? ? ? ? ? // 創建接收消息的線程
? ? ? ? ? ? Runnable rIn = () -> {
? ? ? ? ? ? ? ? boolean flag = true;
? ? ? ? ? ? ? ? while (flag) {
? ? ? ? ? ? ? ? ? ? try {
? ? ? ? ? ? ? ? ? ? ? ? // 逐行讀取服務端返回的消息并打印
? ? ? ? ? ? ? ? ? ? ? ? String str = br.readLine();
? ? ? ? ? ? ? ? ? ? ? ? System.out.println("服務端的消息:" + str);
? ? ? ? ? ? ? ? ? ? } catch (IOException e) {
? ? ? ? ? ? ? ? ? ? ? ? flag = false;
? ? ? ? ? ? ? ? ? ? ? ? e.printStackTrace();
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? }
? ? ? ? ? ? };
?
? ? ? ? ? ? // 啟動兩個線程
? ? ? ? ? ? Thread tOut = new Thread(rOut);
? ? ? ? ? ? Thread tIn = new Thread(rIn);
? ? ? ? ? ? tOut.start();
? ? ? ? ? ? tIn.start();
? ? ? ? }catch (IOException e) {
? ? ? ? ? ? try {
? ? ? ? ? ? ? ? // 釋放資源
? ? ? ? ? ? ? ? s.close();
? ? ? ? ? ? } catch (Exception exception) {
? ? ? ? ? ? ? ? exception.printStackTrace();
? ? ? ? ? ? }
? ? ? ? ? ? e.printStackTrace();
? ? ? ? }
? ? }
}

服務端代碼:

package tcp;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
?
/**
?* Socket服務端
?**/
public class SocketServer {
? ? public static void main(String[] args) {
? ? ? ? ServerSocket ss = null;
? ? ? ? Socket s = null;
? ? ? ? try {
? ? ? ? ? ? // 創建監聽端口為12345的Socket服務端
? ? ? ? ? ? ss = new ServerSocket(12345);
? ? ? ? ? ? System.out.println("服務端Socket服務已建立,等待客戶端連接...");
? ? ? ? ? ? // 通過ss.accept()開始持續監聽12345端口,當有連接時獲取收到的包裝成Socket的客戶端對象
? ? ? ? ? ? s = ss.accept();
? ? ? ? ? ? // 獲取客戶端的IP地址和端口號
? ? ? ? ? ? String ip = s.getInetAddress().getHostAddress();
? ? ? ? ? ? int port = s.getPort();
? ? ? ? ? ? System.out.println("服務端與 " + ip + ":" + port + " 已建立連接");
?
? ? ? ? ? ? // 創建輸入流接收客戶端發送的消息(字節流)
? ? ? ? ? ? InputStream is = s.getInputStream();
? ? ? ? ? ? // 將客戶端發送的字節流轉化為字符流
? ? ? ? ? ? InputStreamReader isr = new InputStreamReader(is);
? ? ? ? ? ? // 創建字符流讀取緩沖區,方便每行讀取
? ? ? ? ? ? BufferedReader br = new BufferedReader(isr);
?
? ? ? ? ? ? // 創建輸出流返回消息
? ? ? ? ? ? OutputStream os = s.getOutputStream();
? ? ? ? ? ? // 創建輸出流緩沖
? ? ? ? ? ? PrintWriter pw = new PrintWriter(os);
?
? ? ? ? ? ? // 創建接受信息的線程
? ? ? ? ? ? Runnable rIn = () -> {
? ? ? ? ? ? ? ? boolean flag = true;
? ? ? ? ? ? ? ? while (flag) {
? ? ? ? ? ? ? ? ? ? try {
? ? ? ? ? ? ? ? ? ? ? ? // 逐行讀取客戶端發送的消息并打印
? ? ? ? ? ? ? ? ? ? ? ? String str = br.readLine();
? ? ? ? ? ? ? ? ? ? ? ? System.out.println("客戶端的消息:" + str);
? ? ? ? ? ? ? ? ? ? } catch (IOException e) {
? ? ? ? ? ? ? ? ? ? ? ? flag = false;
? ? ? ? ? ? ? ? ? ? ? ? e.printStackTrace();
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? }
? ? ? ? ? ? };
?
? ? ? ? ? ? // 創建發送消息的線程
? ? ? ? ? ? Runnable rOut = () -> {
? ? ? ? ? ? ? ? boolean flag = true;
? ? ? ? ? ? ? ? while (flag) {
? ? ? ? ? ? ? ? ? ? try {
? ? ? ? ? ? ? ? ? ? ? ? // 接收控制臺輸入
? ? ? ? ? ? ? ? ? ? ? ? Scanner scan = new Scanner(System.in);
? ? ? ? ? ? ? ? ? ? ? ? String msg = scan.nextLine();
? ? ? ? ? ? ? ? ? ? ? ? // 將輸入寫入緩沖
? ? ? ? ? ? ? ? ? ? ? ? pw.println(msg);
? ? ? ? ? ? ? ? ? ? ? ? // 將緩沖內的數據推送至客戶端并清空緩沖區
? ? ? ? ? ? ? ? ? ? ? ? pw.flush();
? ? ? ? ? ? ? ? ? ? } catch (Exception e) {
? ? ? ? ? ? ? ? ? ? ? ? flag = false;
? ? ? ? ? ? ? ? ? ? ? ? e.printStackTrace();
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? }
? ? ? ? ? ? };
?
? ? ? ? ? ? // 開啟兩個線程
? ? ? ? ? ? Thread tIn = new Thread(rIn);
? ? ? ? ? ? Thread tOut = new Thread(rOut);
? ? ? ? ? ? tIn.start();
? ? ? ? ? ? tOut.start();
? ? ? ? } catch (IOException e) {
? ? ? ? ? ? try {
? ? ? ? ? ? ? ? // 釋放資源
? ? ? ? ? ? ? ? ss.close();
? ? ? ? ? ? ? ? s.close();
? ? ? ? ? ? } catch (Exception exception) {
? ? ? ? ? ? ? ? exception.printStackTrace();
? ? ? ? ? ? }
? ? ? ? ? ? e.printStackTrace();
? ? ? ? }
? ? }
}

UDP程序
UDP程序跟TCP程序不同的地方呢 ?TCP通信是一對一通信 如果要一下通知好多個人的話 就需要一個一個來通信 ?所以這時將會需要UDP了 ?UDP的優勢就在于效率高 但是不穩定的地方呢 ?就是效率高但是不一定每個人都能看到 ?就像老師在臺上講課 總有一些學生會在臺下玩手機 或者帶耳機 ?不一定每一個人都能夠接受得到 ?這就是UDP的不穩定的地方 ,接下來使用代碼來講解:

廣播類代碼如下:

package udp;
?
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;
//廣播 ?先運行
public class Notification ?extends Thread{
?? ?String weather = "節目預報:八點有大型晚會,請收聽";//發送消息
?? ?int port = 9898;//端口號
?? ?InetAddress iaddress = null;
?? ?MulticastSocket socket = null;//多點廣播套接字
?? ?
?? ?Notification(){
?? ??? ?try {
?? ??? ??? ?iaddress = InetAddress.getByName("224.255.10.0");//地址
?? ??? ??? ?socket = new MulticastSocket(port);//實例化多點廣播套接字
?? ??? ??? ?socket.setTimeToLive(1);//指定發送范圍是本地網絡
?? ??? ??? ?socket.joinGroup(iaddress);//加入廣播組
?? ??? ?}catch(IOException e){
?? ??? ??? ?e.printStackTrace();//輸出異常信息
?? ??? ?}
?? ?
?? ?}
?? ?public void run(){//run方法
?? ??? ?while(true) {
?? ??? ??? ?DatagramPacket packet = null;//數據包
?? ??? ??? ?byte data[]=weather.getBytes();//字符串消息的字節數組
?? ??? ??? ?packet = ?new ?DatagramPacket(data,data.length,iaddress,port);//將數據打包
?? ??? ??? ?System.out.println(weather);//控制臺打印消息
?? ??? ??? ?try {
?? ??? ??? ??? ?socket.send(packet);//發送數據
?? ??? ??? ??? ?sleep(3000);//讓線程休眠3000毫秒
?? ??? ??? ?}catch(IOException e){
?? ??? ??? ??? ?e.printStackTrace();
?? ??? ??? ?}catch(InterruptedException e) {
?? ??? ??? ??? ?e.printStackTrace();
?? ??? ??? ?}
?? ??? ?}?? ?
?? ??? ??? ?}
?? ?public static void main(String[]args) {
?? ??? ?Notification w =new Notification();
?? ??? ?w.start();//啟動線程
?? ?}
}

接收類代碼如下:

package udp;
?
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;
?
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.WindowConstants;
//接收 ?后運行
public class Receive extends JFrame implements Runnable, ActionListener {
?? ?int port ;//端口
?? ?InetAddress group =null;//廣播組地址
?? ?MulticastSocket socket = null;//多點廣播套接字對象
?? ?JButton inceBtn = new JButton("開始接收");
?? ?JButton stopBtn = new JButton("停止接收");
?? ?JTextArea inceAr = new JTextArea(10,10);//顯示接收廣播的文本域
?? ?JTextArea inced = new JTextArea(10,10);
?? ?Thread thread ;
?? ?boolean stop = false;//定制接受信息狀態
?? ?
?? ?public Receive () {
?? ??? ?setTitle("廣播數據包");
?? ??? ?setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
?? ??? ?thread = new Thread(this);
?? ??? ?inceBtn.addActionListener(this);//綁定按鈕ince的單擊事件
?? ??? ?stopBtn.addActionListener(this);//綁定按鈕stop的單擊事件
?? ??? ?inceAr.setForeground(Color.blue);//指定文本域中文字的顏色
?? ??? ?
?? ??? ?JPanel north = new JPanel();
?? ??? ?north.add(inceBtn);//將按鈕添加到面板north上
?? ??? ?north.add(stopBtn);
?? ??? ?add(north,BorderLayout.NORTH);//將north放置在窗體的上部
?? ??? ?JPanel center = new JPanel();//創建面板對象center
?? ??? ?center.setLayout(new GridLayout(1,2));//設置面板布局
?? ??? ?center.add(inceAr);//將文本域添加到面板上
?? ??? ?center.add(inced);
?? ??? ?add(center,BorderLayout.CENTER);//設置面板的布局
?? ??? ?validate();//刷新
?? ??? ?port =9898;//設置端口號
?? ??? ?try {
?? ??? ??? ?group = InetAddress.getByName("224.255.10.0");//指定接收地址
?? ??? ??? ?socket = new MulticastSocket(port);//綁定多點廣播套接字
?? ??? ??? ?socket.joinGroup(group);//加入廣播組
?? ??? ?}catch(IOException e){
?? ??? ??? ?e.printStackTrace();//輸出異常信息
?? ??? ?}
?? ??? ?setBounds(100,50,360,380);//設置布局
?? ??? ?setVisible(true);//將窗體設置為顯示狀態
?? ?}
?? ?public void run() {//run方法
?? ??? ?while (!stop) {
?? ??? ??? ?byte data[] = new byte[1024];//創建緩存字節數組
?? ??? ??? ?DatagramPacket packet = null;
?? ??? ??? ?packet = new ?DatagramPacket(data,data.length,group,port);//待接收的數據包
?? ??? ??? ?try {
?? ??? ??? ??? ?socket.receive(packet);//接收數據包
?? ??? ??? ??? ?//獲取數據包中的內容
?? ??? ??? ??? ?String message ?= new String(packet.getData(),0,packet.getLength());
?? ??? ??? ??? ?inceAr.setText("正在接收的內容:\n"+message);//將接受內容顯示在文本域中
?? ??? ??? ??? ?inced.append(message+"\n");//每條信息為一行
?? ??? ??? ?}catch(IOException e ) {
?? ??? ??? ??? ?e.printStackTrace();//輸出異常信息
?? ??? ??? ?}
?? ??? ??? ?
?? ??? ?}
?? ?}
?? ?public void actionPerformed(ActionEvent e) {//單機按鈕ince出發時間
?? ??? ?if(e.getSource()==inceBtn) {
?? ??? ??? ?inceBtn.setBackground(Color.red);//設置按鈕顏色
?? ??? ??? ?stopBtn.setBackground(Color.yellow);
?? ??? ??? ?if(!(thread.isAlive())) {//如線程不處于“新建狀態”
?? ??? ??? ??? ?thread = new Thread(this);//實例化Thread對象
?? ??? ??? ?}
?? ??? ??? ?thread.start();//啟動線程
?? ??? ??? ?stop = false;//開始接受信息
?? ??? ?}
?? ??? ?if(e.getSource()== stopBtn) {//單機按鈕stop出發時間
?? ??? ??? ?inceBtn.setBackground(Color.yellow);//設置按鈕亞瑟
?? ??? ??? ?stopBtn.setBackground(Color.red);
?? ??? ??? ?stop = true;//停止接收信息
?? ??? ?}
?? ?}
?? ?public static void main(String[]args) {
?? ??? ?Receive rec = new Receive();
?? ??? ?rec.setSize(460,200);
?? ?}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/212302.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/212302.shtml
英文地址,請注明出處:http://en.pswp.cn/news/212302.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

掌握iText:輕松處理PDF文檔-基礎篇

關于iText iText是一個強大的PDF處理庫,可以用于創建、讀取和操作PDF文件。它支持PDF表單、加密和簽署等操作,同時支持多種字體和編碼。maven的中央倉庫中的最新版本是5.X,且iText5不是完全免費的,但是基礎能力是免費使用的&…

2023-12-10 LeetCode每日一題(爬樓梯)

2023-12-10每日一題 一、題目編號 70. 爬樓梯二、題目鏈接 點擊跳轉到題目位置 三、題目描述 假設你正在爬樓梯。需要 n 階你才能到達樓頂。 每次你可以爬 1 或 2 個臺階。你有多少種不同的方法可以爬到樓頂呢? 示例 1: 示例 2: 提…

gin投票系統2

投票系統 數據庫的建立 先分析需求,在sql中建立數據庫,關于項目數據庫如何建立可以在“goweb項目創建流程分析中看如何去建表” 成功后目前有四個表: vote,user,vote_opt,vote_opt_user 建立數據庫,可以…

Flink基本轉換算子map/filter/flatmap

map map是大家非常熟悉的大數據操作算子,主要用于將數據流中的數據進行轉換,形成新的數據流。簡單來說,就是一個“一一映射”,消費一個元素就產出一個元素。 我們只需要基于DataStream調用map()方法就可以進行轉換處理。方法需要…

案例026:基于微信小程序的原創音樂系統的設計與實現

文末獲取源碼 開發語言:Java 框架:SSM JDK版本:JDK1.8 數據庫:mysql 5.7 開發軟件:eclipse/myeclipse/idea Maven包:Maven3.5.4 小程序框架:uniapp 小程序開發軟件:HBuilder X 小程序…

什么是Restful?

Rest簡介 REST是英文representational state transfer(表象性狀態轉變)或者表述性狀態轉移。Rest是web服務的一種架構風格。使用HTTP,URI,XML,JSON,HTML等廣泛流行的標準和協議。輕量級,跨平臺,跨語言的架構設計。它是一種設計風格,不是一種標準,是一種思想。 Rest架構的主要…

java程序定時器

目錄 1.java定時器原生方法 1.java定時器原生方法 實現每天早上8點執行任務的示例代碼 import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledThreadPoolExecutor; import java.util.concurrent.TimeUnit;public class TimeTest{pub…

汽車網絡安全--關于UN R155認證的思考

1.UN R155概述 2020年6月25日,聯合國頒布了全球首個汽車網絡安全強制性法規 -- UN 155,詳細規定了關于評估網絡安全措施的審核條款、制造商和供應商降低網絡安全風險的方法以及實施風險評估的義務等。 法規適用于與信息安全相關的M類(4輪及以上載客汽車)、N類(四輪載貨汽車)…

SpringBoot項目連接Graylog

直接用logback將控制臺輸出的日志發送到graylog上 1.導入logback依賴 <dependency> <groupId>de.siegmar</groupId> <artifactId>logback-gelf</artifactId> <version>1.1.0</version> </dependency> 2.創建logback-spring.x…

淺談低代碼

低代碼開發是近年來迅速崛起的軟件開發方法&#xff0c;讓編寫應用程序變得更快、更簡單。有人說它是美味的膳食&#xff0c;讓開發過程高效而滿足&#xff0c;但也有人質疑它是垃圾食品&#xff0c;缺乏定制性與深度。你認為低代碼到底是美以下方向僅供參考。味的膳食還是垃圾…

SpringBoot - 四種常見定時器

常見實現方案 Scheduled注解&#xff1a;基于注解Timer().schedule創建任務&#xff1a;基于封裝類Timer線程&#xff1a;使用線程直接執行任務即可&#xff0c;可以與thread、線程池、ScheduleTask等配合使用quartz配置定時器&#xff1a;基于spring的quartz框架 Scheduled注…

golang學習筆記——編寫最簡單的命令行工具

編寫最簡單的命令行工具 用戶輸入bufio 使用go語言編寫最簡單的命令行工具 mkdir hello-cli-demo cd hello-cli-demo # 查看環境變量 go envgo mod初始化 go mod init gitcode.com/m打開vscode&#xff0c;創建main.go package mainimport ("fmt""bufio&qu…

RK3568 CIF和ISP的關聯

1. 引言 在本文檔中&#xff0c;我們將介紹RK3568芯片的CIF&#xff08;Camera Interface&#xff09;和ISP&#xff08;Image Signal Processor&#xff09;模塊。這兩個模塊是RK3568芯片的關鍵組成部分&#xff0c;用于圖像采集和處理。 CIF是一個標準接口&#xff0c;用于…

快速測試 3節點的redis sentinel集群宕機2個節點以后是否仍能正常使用

有同事問我&#xff0c;三個redis sentinel節點&#xff0c;宕機兩個節點以后&#xff0c;是否還能夠正常的通過redis sentinel正常訪問redis的數據。我想了想&#xff0c;理論上是可以的&#xff0c;但是我沒試過&#xff0c;今天有時間就測試了一下。搭建環境和測試代碼的過程…

Java并發(十七)----變量的線程安全分析

1、成員變量和靜態變量是否線程安全 如果它們沒有共享&#xff0c;則線程安全 如果它們被共享了&#xff0c;根據它們的狀態是否能夠改變&#xff0c;又分兩種情況 如果只有讀操作&#xff0c;則線程安全 如果有讀寫操作&#xff0c;則這段代碼是臨界區&#xff0c;需要考慮線…

深入了解Python pydash庫

更多資料獲取 &#x1f4da; 個人網站&#xff1a;ipengtao.com 在數據處理和分析領域&#xff0c;Python一直是一種強大的編程語言。然而&#xff0c;在處理大規模數據集和執行復雜操作時&#xff0c;有時候需要更高效的工具。在本文中&#xff0c;我們將深入探討pydash庫&am…

語義分割 簡介及數據集簡介

參考文章 MS COCO數據集介紹以及pycocotools簡單使用-CSDN博客

[MySQL--進階篇]存儲引擎的體系結構、簡介、特點、選擇

前言 ?Hello!這里是歐_aita的博客。 ?今日語錄&#xff1a;不要在乎別人怎么看你&#xff0c;因為他們根本就沒有時間&#xff0c;他們只關心他們自己。 ?個人主頁&#xff1a;歐_aita ψ(._. )>?個人專欄&#xff1a; 數據結構與算法 MySQL數據庫 存儲引擎 前言MySQL體…

代碼隨想錄算法訓練營第四十一天|343. 整數拆分、96.不同的二叉搜索樹

代碼隨想錄算法訓練營第四十一天|343. 整數拆分、96.不同的二叉搜索樹 整數拆分 343. 整數拆分 文章講解&#xff1a;https://programmercarl.com/0343.%E6%95%B4%E6%95%B0%E6%8B%86%E5%88%86.html 題目鏈接&#xff1a;https://leetcode.cn/problems/integer-break/ 視頻講解…

李宏毅gpt個人記錄

參考&#xff1a; 李宏毅機器學習--self-supervised&#xff1a;BERT、GPT、Auto-encoder-CSDN博客 用無標注資料的任務訓練完模型以后&#xff0c;它本身沒有什么用&#xff0c;GPT 1只能夠把一句話補完&#xff0c;可以把 Self-Supervised Learning 的 Model做微微的調整&am…