網(wǎng)絡(luò)編程 != 網(wǎng)站編程..前者為后者的底層.
區(qū)分好UDP和TCP的.前者更多應(yīng)用在網(wǎng)絡(luò)視頻,語音以及游戲中.后面多為登陸
Socket(插座)編程
- 兩個java應(yīng)用程序可通過一個雙向的網(wǎng)絡(luò)通信連接實現(xiàn)數(shù)據(jù)交換,這個雙向鏈路的一端稱為一個Socket.
- 建立連接時所需的尋址信息為遠(yuǎn)程計算機IP地址和端口號(2個字節(jié)65536個端口號)(Port Number)--一個字節(jié)8個2進(jìn)制
- java.net包中定義的兩個類,Socket和ServerSocket,分別用來實現(xiàn)雙向連接的client和server端.
- Socket通常用來實現(xiàn)client-server連接
TCP
主要是進(jìn)行對DataOutputStream/DataInputStream的使用,
以及ServerSocket/Socket使用,還有對端口的連接,連接成功的判定.
已經(jīng)對close,flush的使用;
ServerSocket ss = new ServerSocket(6666);
//阻塞式,等著一個Client來連接,不間斷等著客戶端連接,給1個6666
的端口進(jìn)行連接.
Socket s = new Socket("127.0.0.1",6666);
//Socket(String host,int post);前面為本機號IP地址,后面為端口號
OutputStream os =s.getOutputStream();//進(jìn)行輸入.為下面的父類.
DataOutputStream dos = new DataOutputStream(os);//對上面輸入進(jìn)行包裝.
dos.writeUTF("hello,world");
Socket s = ss.accept(); //Socket里的類accept接受連接申請.
DataInputStream dis = new DataInputStream(s.getInputStream());
System.out.println(dis.readUTF());//readUTF為阻塞式等待,等傳過來一個東西,才結(jié)束
'現(xiàn)在網(wǎng)絡(luò)編程的同步與異步之間的效率區(qū)別,以及對readUTF同步效率低下的改善.'
'可以自己寫一個點對點的倆天程序'
UDP
byte buf[] = new byte[1024];
//在內(nèi)存里分配了1024個字節(jié),1K的空間,來接收數(shù)據(jù).
DatagramPacket dp = new DatagramPacket(buf,buf.length);
//不能拿字節(jié)數(shù)組來接,用這個包裹接收UDP數(shù)據(jù).
DatagramSocket ds = new DatagramSocket(5678);//定義端口
while(true) //循環(huán)接收.
{
ds.receive(dp);//把這個包袱傳過來.
System.out.println(new String(buf,2,dp.getLength()));
//我這個包袱 到底收了多少個字節(jié)的數(shù)據(jù).
}
byte[] buf = (new String("Hello")).getBytes();
DatagramPacket dp = new DatagramPacket(buf,buf.length,
new InetSocketAddress("127.0.0.1",5678));
//要告訴路由器我的包發(fā)到哪里去.
DatagramSocket ds = new DatagramSocket(9999);//我Clent端占據(jù)了9999這個端口.
ds.send(dp);//發(fā)出這個包.
ds.close();
.'如何轉(zhuǎn)換long類型為字節(jié)數(shù)組類型打包輸出到Server端.'
long n = 10000L;
ByteArrayOutputStream baos = new ByteArrayOutputStream();//引用java.io.*;
DataOutputStream dos = new DataOutputStream(baos);
dos.writeLong(n);
//'ByteArrayOutputStream'這個類實現(xiàn)了一個輸出流郁季,其中的數(shù)據(jù)被寫入一個字節(jié)數(shù)組是越。當(dāng)數(shù)據(jù)被寫入時富岳,緩沖區(qū)會自動生長。數(shù)據(jù)可以用tobytearray()和tostring()檢索。
//'DataOutputStream'寫入一個長的底層輸出流為八字節(jié)奔脐,高字節(jié)测萎。在不引發(fā)異常,柜臺上寫的是按8遞增沪铭。
byte[] buf = baos.toByteArray();
通過IO管道完成.