TCP/IP協議,,IP地址,4個字節表示;IPV4
127.0.0.1迴路IP,不經過網卡的特殊IP地址。
PORT端口號,一個佔用兩個字節的整數,用於表示數據包該交給哪個網絡程序。同樣也要指定接受哪個端口號上的數據。
一臺計算機上不允許有兩個相同端口號得應用程序。
範圍在0-65535之間,0-1023之間的端口是用於知名的網絡服務和應用。我們編寫要用1024以上的··以免衝突。
TCP,,,傳輸控制協議,面向連接的通信協議。需要建立連接。就像電話
UDP,,,用戶數據報協議,是無連接通信協議。不保證數據的可靠傳輸。
數據幀格式
協議類型--源IP--目標IP--源端口--目標端口--幀序號--幀數據
TCP一問一答的方式。。UDP不會等待,直接不停的發送。
Socket 網絡驅動層是提供給應用程序編程的接口和一種機制
通過一種綁定機制與驅動程序建立關係。告訴對應的IP和PORT 接受方同理;
java.net包中
DatagramSocket 類對應udp通信
ServerSocket 類用於TCP通信的服務器端 創建於客戶端連接的
Socket 類用於TCP通信的服務器和客戶端 這裏的服務器是用於向客戶端傳輸數據的
如果沒有創建端口號,會自動選擇一個沒有被使用的。
如果沒有指定IP地址,驅動會隨機指定計算機上的一個IP;
對於只有一個IP地址的計算機,一般不用指定IP地址
udp網絡程序
DatagramSocket類 發送數據時最好用無參構造,如果有可能接受數據選擇帶端口號參數的構造函數,如果有多個IP地址選擇帶端口號和IP的構造函數,,,close方法調用後,此端口號就可以被驅動分配給別的應用程序。
send(DatagramPacket p )發送數據報方法 receive(DatagramPacket p)接受數據報方法
DatagramPacket數據容器 接受數據時的構造函數, 發送數據時的構造函數
getInetAddress()和getPort()接受數據可以獲取發送方IP和PORT,,,getData和getLength方法獲取實際接受數據和數據長度。
InetAddress 用於表示IP地址的類 getByName放回此類得示例。getHostAddress放回此對象當中用點分割的地址
- //發送方
- public class UdpSend{
- public static void main(String[] args){
- DatagramSocket ds = new DatagramSocket();
- String strInfo = "hello ww.it315.org";
- ds.send(new DatagramPacket(strInfo.getBytes()),strInfo.getBytes().length,InetAddress.getByName("192.168.1.100"),3000));
- ds.close();
- }
- }
- //接受數據方
- public class UdpRecv{
- public static void main(String[] args){
- DatagramSocket ds = new DatagramSocket(3000);
- byte[] buf = new byte[1024];
- DatagramPacket dp = new DatagramPacket(buf,1024);
- //啓動接受數據方,如果沒有數據可接受,當前線程將被阻塞
- ds.receive(dp);
- String str = new String(buf,0,dp.getLength());
- System.out.println(dp.getAddress().getHostAddress()+":"+dp.getPort()+str);
- ds.close();
- }
- }
只有UDP才能發送和接受廣播地址數據,,廣播地址需要根據子網掩碼來計算。。如果是255.255.254.0,那麼廣播地址就是192.168.1.255。。。
私有IP通過網關代理上網的計算機不能與具有合法internetIP地址的計算機進行對話。
網關中有一張轉發映射表,發送和接受數據,都會根據映射表來中轉。轉發映射表有失效性。一段時間內沒有數據來往,網關就會清楚掉轉發映射表中的記錄,那麼外部計算機就不能訪問到網關內部的計算機了。
網關上也可以配置靜態的轉發映射記錄。實現網關內計算機與inter網上計算機進行數據交換····
TCP網絡:
TCP程序有主從之分,分爲客戶端機和服務器端機。。
客戶端機對應socket類,服務器對應serverSocket類
服務器端首先創建ServerSocket類,調用accept方法等待客戶端的連接。客戶端程序創建一個socket並請求與服務器建立連接,
接着服務器接受客戶端連接並創建一個新的socket於客戶機建立專線連接!
建立了連接的兩個socket在服務器端創建的一個新的線程上進行對話。接着ServerSocket又開始等待客戶端機請求連接,
並重復執行這些步驟。
ServerSocket(int port 端口號(如果寫入0,計算機將會自動給服務器程序分配端口號),,,int backlog 默認爲50,指定服務器建立於客戶端機請求連接的最大等待連接數。。InetAddress 綁定到的本地 IP 地址創建服務器),一般只用指定端口號 同樣擁有close方法
accept,等待客戶端連接請求,一旦接受後方法返回一個與客戶端專線連接的socket對象。如果沒有客戶端請求連接,將使線程處於阻塞狀態。
Socket(綁定服務器IP(接受字符串類型和InetAddress類型),綁定服務器端口號)也可以指定本機IP和端口,,一般不指定。
不用將socket構造函數用於服務器端創建socket對象。
連接後他們以網絡字節流的方式進行數據交換,,,getInputStream方法,以及getOutputStream方法,用於返回socket的輸入輸出流對象。
- package socketTest;
- import java.io.InputStream;
- import java.io.OutputStream;
- import java.net.Socket;
- /**
- * socket客戶端機
- */
- public class TcpClient {
- public static void main(String[] args) {
- try {
- Socket s= new Socket("192.168.1.101",8001);
- InputStream ips = s.getInputStream();
- OutputStream ops = s.getOutputStream();
- byte[] bur = new byte[1024];
- int len = ips.read(bur);
- System.out.println(new String(bur,0,len));
- ops.write("建立連接成功啦!!".getBytes());
- ops.close();
- ips.close();
- s.close();
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
- package socketTest;
- import java.io.*;
- import java.net.*;
- /**
- * socket服務器端
- */
- public class TcpTest {
- public static void main(String[] args) {
- try {
- ServerSocket ss = new ServerSocket(8001);
- Socket s = ss.accept();
- InputStream ips = s.getInputStream();
- OutputStream ops = s.getOutputStream();
- ops.write("welcome to My House!!陳亮宇".getBytes());
- byte[] bur = new byte[1024];
- int len = ips.read(bur);
- System.out.println(new String(bur,0,len));
- ops.close();
- ips.close();
- s.close();
- ss.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
- /**
- *一臺服務器,多臺客戶端機進行對話!
- */
- import java.io.BufferedReader;
- import java.io.InputStreamReader;
- import java.io.OutputStreamWriter;
- import java.io.PrintWriter;
- import java.net.Socket;
- public class Servicer implements Runnable {
- private Socket s ;
- public Servicer(Socket s){
- this.s = s;
- }
- @Override
- public void run() {
- try{
- BufferedReader bf = new BufferedReader(
- new InputStreamReader(
- s.getInputStream()));
- PrintWriter pw = new PrintWriter(
- new OutputStreamWriter(
- s.getOutputStream()),true);
- while(true)
- {
- String msg = bf.readLine();
- System.out.println(msg);
- if(msg.equalsIgnoreCase("exit"))
- break;
- StringBuffer sb = new StringBuffer(msg).reverse();
- pw.println(msg+"-------->"+sb.toString());
- }
- pw.close();
- bf.close();
- s.close();
- }catch(Exception ex){
- ex.printStackTrace();
- }
- }
- }
- import java.io.*;
- import java.net.*;
- public class TcpTest {
- public static void main(String[] args) {
- try {
- ServerSocket ss = new ServerSocket(8001);
- boolean isRunning = true;
- while(isRunning){
- Socket s = ss.accept();
- Servicer svr = new Servicer(s);
- new Thread(svr).start();
- }
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
- import java.io.BufferedReader;
- import java.io.InputStreamReader;
- import java.io.OutputStreamWriter;
- import java.io.PrintWriter;
- import java.net.Socket;
- import java.util.Scanner;
- public class TcpClient {
- public static void main(String[] args) {
- Socket s = null;
- BufferedReader br =null;
- PrintWriter pw =null;
- try {
- s= new Socket("192.168.1.101",8001);
- br = new BufferedReader(
- new InputStreamReader(s.getInputStream()));
- pw = new PrintWriter(new OutputStreamWriter(
- s.getOutputStream()),true);
- while(true){
- Scanner input = new Scanner(System.in);
- pw.println(input.nextLine());
- System.out.println(br.readLine());
- }
- } catch (Exception e) {
- e.printStackTrace();
- }finally{
- try{
- pw.close();
- br.close();
- s.close();
- }catch(Exception e)
- {
- e.printStackTrace();
- }
- }
- }
- }
TCP服務器端要想於多個客戶端程序進行連接就要循環調用serversocket的accept方法。。。
每一個服務器創建的與某個客戶端之間的連接之間不能互相干擾,應該放在單獨的線程當中運行。
一個服務器端對象於一個單獨的線程相關聯,來獨立完成於客戶端的會話過程。
解決TCP服務器程序端口號衝突問題: 使用netstat -n 查詢正在使用中的端口號。
通過配置信息來指定程序端口號。用戶可以通過修改配置文件來指定程序指定的端口
通過指定參數編寫客戶端機代碼,將服務器IP和端口號作爲參數。可以使程序更加靈活。。
ASP和JSP是用於編寫網站內容的,並不是網絡編程!!!!
訪問網絡資源:
URL統一資源定位符 URL編碼規則空格將轉換爲+號,,普通數字和字母正常顯示,特殊符號將用%打頭加上它的十六進制表現形式。
java中提供了URLEncoder類和URLDecoder類來實現URL的編碼和解碼。。。
HTTP請求消息,,請求行,,消息頭,,空格,,(實體)一般是表單提交的值
HTTP響應消息,,狀態行,,消息頭,,空格,,實體,網頁內容。
HTTP消息頭字段,
Connection,,,,默認爲Keep-Alive,返回消息保持連接,,,close返回消息關閉連接。
Accept-Lanuage,,,,指定客戶端所期望返回消息的國家語言,可以指定多個,以逗號分隔
Range :bytes = 100-588 顯示指定位置內容,單位爲字節100>= <=588
bytes = 100- 100後所有
bytes = -100 最後100
Content-Range : bytes 1234-5678/10000