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