JAVA網路程式設計(一)
一、概念
Sockets:
使用TCP協議實現的網路通訊Socket相關的類
Datagram:
使用UD協議,將資料儲存在使用者資料報中,通過網路進行通訊。
Socket在應用層之下,傳輸層之上的介面層(作業系統提供給使用者訪問網路的系統介面)
Socket套接字:
網路上具有唯一標識的IP地址和埠組合一起才能構成唯一能識別的識別符號套接字。
Socket原理機制:
通訊的兩端都有Socket
網路通訊其實就是Socket間的通訊
資料在兩個socket傳送是通過IO流
二、TCP程式設計
java中基於TCP協議實現網路通訊的類
客戶端: Socket
服務端:serverSocket
2-1:socket通訊的步驟
- 建立serverSocket和Socket
- 開啟連線到socket的輸入和輸出流
- 按照協議對socket進行讀/寫操作
- 關閉輸入/輸出流,關閉socket
2-1-1:伺服器端
- 建立ServerSocket物件,繼續監聽埠
- 通過accept()方法監聽客戶端請求
- 連線建立後,通過輸入流讀取客戶端傳送的請求資訊
- 通過輸出流向客戶端傳送響應資訊
- 關閉相關資源
-
package com.demo.demo.demo2; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; public class TcpServer { public static void main(String[] args) throws IOException { //建立一個伺服器端的socket,指定埠,並監聽該埠 ServerSocket sc=new ServerSocket(80); try { // Socket scc=sc.accept(); InputStream in= scc.getInputStream(); InputStreamReader inr=new InputStreamReader(in); BufferedReader br= new BufferedReader(inr); String info=null; while((info=br.readLine())!=null){ System.out.println("客戶端:"+info); } //socket關閉輸入流 scc.shutdownInput(); OutputStream out=scc.getOutputStream(); PrintWriter ww=new PrintWriter(out); ww.write("你好啊。客戶端"); ww.flush(); scc.shutdownOutput(); ww.close(); out.close(); br.close(); inr.close(); in.close(); scc.close(); sc.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
2-1-2客戶端
- 建立socket物件,指明需要連線的伺服器的地址和埠號
- 連線建立後。通過輸出流向伺服器端傳送請求資訊
- 通過輸入流獲得伺服器相應的資訊
- 關閉相關資訊
package com.demo.demo.demo2;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
public class TcpClient {
public static void main(String[] args) throws UnknownHostException, IOException {
Socket sc=new Socket("localhost",80);
OutputStream oo=sc.getOutputStream();
PrintWriter pr=new PrintWriter(oo);
pr.write("我是一號客戶端");
pr.flush();
sc.shutdownOutput();
InputStream is=sc.getInputStream();
InputStreamReader re=new InputStreamReader(is);
BufferedReader rrr=new BufferedReader(re);
String info=null;
while((info=rrr.readLine())!=null){
System.out.println(info);
}
sc.shutdownInput();
rrr.close();
re.close();
re.close();
pr.close();
oo.close();
}
}
2-1-3:套接字超時(客戶端)
1. 可為套接字設定超時操作,即:當讀寫操作沒有在規定時間內完成,則會丟擲SocketTimeoutException異常
通過方法: setSoTimeout(毫秒數) 設定
2. new 出socket(String host,int port),這個socket會一直阻塞,直到建立起初始連線為止。
可先建立無連線的套接字,再使用一個超時來連線的方式解決問題。
//--------當socket沒有建立起與主機的初始連線,會一直阻塞----------------
Socket s=new Socket("192.168.1.1","80")
//-----------------------解決方式---------------------10s---
Socket s=new Socket();
s.connect(new InetSocketAddress("192.168.1.1","80"),10000 );
2-1-4:關於因特網地址
package com.demo.demo.demo2;
import java.net.InetAddress;
import java.net.UnknownHostException;
public class InternetAdd {
public static void main(String[] args) throws UnknownHostException {
InetAddress[] an=InetAddress.getAllByName("www.baidu.com");
for(InetAddress a :an){
System.out.println(a);
}
}
}
2-1-5:應用多執行緒實現伺服器與多客戶端之間的通訊
- 伺服器端建立ServerSocket,迴圈呼叫accept()等待客戶端連線
- 客戶端建立一個socket並請求與伺服器端連線。
- 伺服器接受請求,建立socket與客戶端建立專線連線
- 建立連線的兩個socket在一個單獨的執行緒上對話
- 伺服器繼續等待新的連線
三、UDP程式設計
UDP協議(使用者資料報協議)是無連線的,不可靠的,無序的,速度的
進行資料傳輸中,首先將要傳輸的資料定義為資料報,大小限制為64k,在資料報中指明資料所要達到的Socket(主機地址和埠號),然後再將資料報傳送出去
DatagramPacket類:表示資料報包
DatagramSocket類 :進行端到端通訊的類
3-1:伺服器端實現步驟
建立DatagramSocket,指定埠號
建立DatagramSocket
接收客戶端傳送的資料資訊
讀取資料
3-2:客戶端實現步驟
定義傳送資訊
建立DatagramPacket,包含將要傳送的資訊
建立DatagramSocket
傳送資料