黑馬程式設計師--Java學習日記之GUI&網路程式設計
------- android培訓、java培訓、期待與您交流! ----------
GUI
如何建立一個視窗並顯示Graphical User Interface(圖形使用者介面)。
<span style="font-size:14px;"><span style="font-size:18px;"> Frame f = new Frame(“my window”); f.setLayout(new FlowLayout());//設定佈局管理器 f.setSize(500,400);//設定窗體大小 f.setLocation(300,200);//設定窗體出現在螢幕的位置 f.setIconImage(Toolkit.getDefaultToolkit().createImage("qq.png")); f.setVisible(true); </span></span>
佈局管理器
FlowLayout(流式佈局管理器)
從左到右的順序排列。
Panel預設的佈局管理器。
BorderLayout(邊界佈局管理器)
東,南,西,北,中
Frame預設的佈局管理器。
GridLayout(網格佈局管理器)
規則的矩陣
CardLayout(卡片佈局管理器)
選項卡
GridBagLayout(網格包佈局管理器)
非規則的矩陣
<span style="font-size:14px;"><span style="font-size:18px;"> Frame f = new Frame("我的窗體"); //事件源是窗體,把監聽器註冊到事件源上 //事件物件傳遞給監聽器 f.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { //退出虛擬機器,關閉視窗 System.exit(0); } }); </span></span>
介面卡設計模式
a.什麼是介面卡
在使用監聽器的時候, 需要定義一個類事件監聽器介面.
通常介面中有多個方法, 而程式中不一定所有的都用到, 但又必須重寫, 這很繁瑣.
介面卡簡化了這些操作, 我們定義監聽器時只要繼承介面卡, 然後重寫需要的方法即可.
b.介面卡原理
介面卡就是一個類, 實現了監聽器介面, 所有抽象方法都重寫了, 但是方法全是空的.
介面卡類需要定義成抽象的,因為建立該類物件,呼叫空方法是沒有意義的
目的就是為了簡化程式設計師的操作, 定義監聽器時繼承介面卡, 只重寫需要的方法就可以了.
事件處理
事件: 使用者的一個操作
事件源: 被操作的元件
監聽器: 一個自定義類的物件, 實現了監聽器介面, 包含事件處理方法,把監聽器新增在事件源上, 當事件發生的時候虛擬機器就會自動呼叫監聽器中的事件處理方法
網路程式設計概述
A:計算機網路
是指將地理位置不同的具有獨立功能的多臺計算機及其外部裝置,通過通訊線路連線起來,在網路作業系統,網路管理軟體及網路通訊協議的管理和協調下,實現資源共享和資訊傳遞的計算機系統。
B:網路程式設計
就是用來實現網路互連的不同計算機上執行的程式間可以進行資料交換。
網路程式設計三要素之IP概述
每個裝置在網路中的唯一標識
每臺網絡終端在網路中都有一個獨立的地址,我們在網路中傳輸資料就是使用這個地址。
ipconfig:檢視本機IP192.168.12.42
ping:測試連線192.168.40.62
本地迴路地址:127.0.0.1 255.255.255.255是廣播地址
IPv4:4個位元組組成,4個0-255。大概42億,30億都在北美,亞洲4億。2011年初已經用盡。
IPv6:8組,每組4個16進位制數。
1a2b:0000:aaaa:0000:0000:0000:aabb:1f2f
1a2b::aaaa:0000:0000:0000:aabb:1f2f
1a2b:0000:aaaa::aabb:1f2f
1a2b:0000:aaaa::0000:aabb:1f2f
1a2b:0000:aaaa:0000::aabb:1f2f
網路程式設計三要素之埠號概述
每個程式在裝置上的唯一標識
每個網路程式都需要繫結一個埠號,傳輸資料的時候除了確定發到哪臺機器上,還要明確發到哪個程式。
埠號範圍從0-65535
編寫網路應用就需要繫結一個埠號,儘量使用1024以上的,1024以下的基本上都被系統程式佔用了。
常用埠
mysql: 3306
oracle: 1521
web: 80
tomcat: 8080
QQ: 4000
feiQ: 2425
網路程式設計三要素協議
為計算機網路中進行資料交換而建立的規則、標準或約定的集合。
UDP
面向無連線,資料不安全,速度快。不區分客戶端與服務端。
TCP
面向連線(三次握手),資料安全,速度略低。分為客戶端和服務端。
三次握手: 客戶端先向服務端發起請求, 服務端響應請求, 傳輸資料
Socket通訊原理圖解
A:Socket套接字概述:
網路上具有唯一標識的IP地址和埠號組合在一起才能構成唯一能識別的識別符號套接字。
通訊的兩端都有Socket。
網路通訊其實就是Socket間的通訊。
資料在兩個Socket間通過IO流傳輸。
Socket在應用程式中建立,通過一種繫結機制與驅動程式建立關係,告訴自己所對應的IP和port。
UDP傳輸
1.傳送Send
建立DatagramSocket, 隨機埠號
建立DatagramPacket, 指定資料, 長度, 地址, 埠
使用DatagramSocket傳送DatagramPacket
關閉DatagramSocket
2.接收Receive
建立DatagramSocket, 指定埠號
建立DatagramPacket, 指定陣列, 長度
使用DatagramSocket接收DatagramPacket
關閉DatagramSocket
從DatagramPacket中獲取資料
3.接收方獲取ip和埠號
String ip = packet.getAddress().getHostAddress();
int port = packet.getPort();
UDP傳輸優化
接收端Receive
<span style="font-size:14px;"><span style="font-size:18px;">DatagramSocket socket = new DatagramSocket(6666); //建立socket相當於建立碼頭
DatagramPacket packet = new DatagramPacket(new byte[1024], 1024); //建立packet相當於建立集裝箱
while(true) {
socket.receive(packet); //接收貨物
byte[] arr = packet.getData();
int len = packet.getLength();
String ip = packet.getAddress().getHostAddress();
System.out.println(ip + ":" + new String(arr,0,len));</span></span>
傳送端Send
<span style="font-size:14px;"><span style="font-size:18px;">DatagramSocket socket = new DatagramSocket(); //建立socket相當於建立碼頭
Scanner sc = new Scanner(System.in);
while(true) {
String str = sc.nextLine();
if("quit".equals(str))
break;
DatagramPacket packet = //建立packet相當於建立集裝箱
new DatagramPacket(str.getBytes(), str.getBytes().length, InetAddress.getByName("127.0.0.1"), 6666);
socket.send(packet); //發貨
}
socket.close();</span></span>
UDP傳輸多執行緒
<span style="font-size:14px;"><span style="font-size:18px;">public class Demo3_MoreThread {
/**
* @param args
*/
public static void main(String[] args) {
new Receive().start();
new Send().start();
}
}
class Receive extends Thread {
public void run() {
try {
DatagramSocket socket = new DatagramSocket(6666); //建立socket相當於建立碼頭
DatagramPacket packet = new DatagramPacket(new byte[1024], 1024); //建立packet相當於建立集裝箱
while(true) {
socket.receive(packet); //接收貨物
byte[] arr = packet.getData();
int len = packet.getLength();
String ip = packet.getAddress().getHostAddress();
System.out.println(ip + ":" + new String(arr,0,len));
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
class Send extends Thread {
public void run() {
try {
DatagramSocket socket = new DatagramSocket(); //建立socket相當於建立碼頭
Scanner sc = new Scanner(System.in);
while(true) {
String str = sc.nextLine();
if("quit".equals(str))
break;
DatagramPacket packet = //建立packet相當於建立集裝箱
new DatagramPacket(str.getBytes(), str.getBytes().length, InetAddress.getByName("127.0.0.1"), 6666);
socket.send(packet); //發貨
}
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}</span></span>
TCP協議
客戶端
<span style="font-size:14px;"><span style="font-size:18px;"> Socket socket = new Socket("127.0.0.1", 9999); //建立Socket指定ip地址和埠號
InputStream is = socket.getInputStream(); //獲取輸入流
OutputStream os = socket.getOutputStream(); //獲取輸出流
BufferedReader br = new BufferedReader(new InputStreamReader(is));
PrintStream ps = new PrintStream(os);
System.out.println(br.readLine());
ps.println("我想報名就業班");
System.out.println(br.readLine());
ps.println("7878");
socket.close();</span></span>
服務端
<span style="font-size:14px;"><span style="font-size:18px;"> ServerSocket server = new ServerSocket(9999); //建立伺服器
Socket socket = server.accept(); //接受客戶端的請求
InputStream is = socket.getInputStream(); //獲取輸入流
OutputStream os = socket.getOutputStream(); //獲取輸出流
BufferedReader br = new BufferedReader(new InputStreamReader(is));
PrintStream ps = new PrintStream(os);
ps.println("歡迎諮詢");
System.out.println(br.readLine());
ps.println("aaaaaa");
System.out.println(br.readLine());
server.close();
socket.close();</span></span>
服務端是多執行緒的
<span style="font-size:14px;"><span style="font-size:18px;"> ServerSocket server = new ServerSocket(9999); //建立伺服器
while(true) {
final Socket socket = server.accept(); //接受客戶端的請求
new Thread() {
public void run() {
try {
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintStream ps = new PrintStream(socket.getOutputStream());
ps.println("歡迎諮詢傳智播客");
System.out.println(br.readLine());
ps.println("報滿了,請報下一期吧");
System.out.println(br.readLine());
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}.start();
}
}</span></span>