黑馬程序員_<>

---------------------ASP.Net+Android+IOS開發.Net培訓、期待與您交流! --------------------java


 

1. TCP/IP

     1.概述

 

           要創建鏈接,能夠傳輸大量數據  經過三次握手玩成鏈接是可靠協議   必須創建鏈接,效率低,例如:下載,打電話服務器

           步驟:Socket和ServerSocket網絡

簡介:創建客戶端和服務器端socket

         經過Socket中的IO流進行數據傳輸spa

         關閉socket.net

         一樣,客戶端和服務器端是兩個獨立的應用程序code

 

     2.傳輸

           客戶端(Socket)和服務器端(ServerSocket)server

      客戶端:在該對象建立的時候,就指定了主機地址,由於要先TCP必需要創建好鏈接,進行傳輸,或者使用connet方法來制定端口對象

 

     客戶端對象裏面封裝了字節讀取流和寫入流。這樣更方便發送和接受數據。不斷是服務端仍是客戶端,只要是對其傳輸的數據進行訪問,那麼就在Socket對象中獲取流。資源

步驟:

1.建立服務,指定鏈接的主機和端口

2.得到輸出流 而後輸出數據

3.關閉服務

服務端:

1創建服務端的服務,ServerSocket,綁定端口

2獲取鏈接過來的客戶端對象 ServerSocket的accept方法。

3客戶端若是發過來數據,那麼服務端要使用對應的客戶端對象,而後客戶端對象的讀取流來讀取發過來的數據,打印在控制檯上

4關閉服務端。

 

     3.單向發出和讀取

          模擬客戶端向服務端發數據,服務端讀取客戶端發送的數據後,而後輸出。

           

 import java.io.OutputStream;
import java.net.Socket;
/**
 * 客戶端
 * 1.定義服務端服務,指定目的地址和端口號
 * 2.得到寫入流,而後發發送的數據,而且發出
 * 3.關閉客戶端
 *
 */
public class CilentTcp {
  public static void main(String[] args) throws Exception{
    /*建立了客戶端服務,而且指定目的主機和端口號*/
    Socket client=new Socket("192.168.1.101",10005);
    /*獲取輸出流,用來發送數據*/
    OutputStream out=client.getOutputStream();
    out.write("hello world".getBytes());
    client.close();
  }
 
}
 

 

 

 

import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
/**
 * 服務端
 * 1.定義服務端,而後指定服務端口
 * 2.使用accept()方法得到客戶端對象,而後獲取讀取流
 * 3.而後讀取客戶端發送的數據
 */
public class ServerTcp {
  public static void main(String[] args) throws Exception {
    /* 建立了服務端,而且指定端口號 */
    ServerSocket server = new ServerSocket(10005);
    Socket socket = server.accept();// 得到了發送端對象
    InputStream in = socket.getInputStream();// 得到讀取流,用來讀取發送端發送過來的數據
    byte[] buf = new byte[1024];
    int r = in.read(buf);//讀取
    System.out.println(new String(buf, 0, r));
  }
 
}
 
結果:
hello world


必需要先啓動服務端,而後運行客戶端,不然會鏈接失敗

 

2. 客戶端和服務端互訪

     客戶端:

         步驟:

1.創建Socket服務,而且指定要鏈接的主機和端口。

2.得到Socket流中的輸出流,將數據寫到流中,經過網絡發送給服務端

3.獲取Socket流中的輸入流,將服務端反饋回來的數據獲取到,而且打印

4.關閉客戶端資源

 

 

mportjava.io.InputStream;
importjava.io.OutputStream;
import java.net.Socket;
importjava.net.InetAddress;
/**
 * 客戶端
 */
public class ClientTcp {
      public static void main(String[]args) throws Exception {
           /*得到客戶端服務*/
           Socketclient = new Socket("192.168.32.17", 25000);
           /*
            * 得到客戶端流中的輸出流,而且把數據寫到流中,而後傳給的服務端
            */
           OutputStreamout = client.getOutputStream();
           out.write("服務端,你在嗎".getBytes());
           /**
            * 得到客戶端總的輸出流,而後或得服務端反饋回來的數據,而且打印
            */
           InputStreamin=client.getInputStream();
           byte [] buf=new byte[1024];
           int len=in.read(buf);
           System.out.println(newString(buf,0,len));
           client.close();
      }
 
}
 


 

     服務端:

        步驟:

1.創建ServerSocket服務,而且指定端口號。

2.得到客戶端服務對象,輸出客戶端的地址

3.得到客戶端的輸入流,讀取客戶端發送的數據,而且打印。

4.得到客戶端的輸出流,給客戶端發送反饋信息。

5.關閉服務端服務和客戶端服務。

 

 

import java.io.InputStream;
importjava.io.OutputStream;
importjava.net.ServerSocket;
import java.net.Socket;
/**
 * 服務端
 */
public class ServerTcp {
      public static void main(String[]args) throws Exception {
           /* 建立了服務端,而且指定端口號 */
           ServerSocketserver = new ServerSocket(25000);
           Socketsocket =server.accept();// 得到了發送端對象
           System.out.println(socket.getLocalAddress()+"connectsuccess");
           /**
            * 或得客戶端的輸入流,讀取客戶端發送的數據,而且打印
            */
           InputStreamin = socket.getInputStream();// 得到讀取流,用來讀取發送端發送過來的數據
           byte[] buf = new byte[1024];
           int r = in.read(buf);// 讀取
           System.out.println(new String(buf, 0,r));
           /**
            * 得到客戶端的輸出流,給客戶端反饋信息
            */
           OutputStream  out=socket.getOutputStream();
           out.write("客戶端,我在呢?要幹嗎啊!!".getBytes());
           socket.close();
           server.close();
      }
}


 

 

accept()和read()方法都是阻塞方法。

對於雙方都通訊的話,那麼循環讀取的話,用到IO讀取,那麼必須注意換行符,和刷新緩衝區。一般都是讀取一行的話,那麼要注意是否有換行符,newLine().

3.  上傳文件

      在網絡傳輸文件

       客戶端:

          步驟:1.定義服務端,一樣也要指定目標地址和端口號。

                2.定義對文件相應的流,讀取文件。

                3.獲取客戶端的輸出流,和文件的讀取交替讀取和寫入。

                4.得到客戶端的輸入流,獲取服務端反饋的信息。

 

                

 package www.fuxi.wangluo;
 
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
/**
 * 客戶端
 * @author yang
 */
public class TextClient {
  public static void main(String[] args) throws Exception{
             Socket socket=new Socket("192.168.1.101",25001);
             /**
              * 得到文件的讀取流,而後循環的讀取文件
              */
             BufferedReader br=new BufferedReader(new FileReader("copy.txt"));
             /**
              * 得到服務端的輸入流,用來把要複製的文件內容,輸入到網絡流中
              */
             PrintWriter pr=newPrintWriter(socket.getOutputStream(),true);//true表明自動刷新
            
             String line=null;
             while((line=br.readLine())!=null){
               pr.println(line);//println有自動刷新功能
             }
             socket.shutdownOutput();//關閉客戶端的輸出流,至關於結束標記
            
             /**
              * 得到文件的輸出流,用來得到服務端反饋的信息
              */
             BufferedReader brs=new BufferedReader(new InputStreamReader(socket.getInputStream()));
             String str=null;
             str=brs.readLine();
             System.out.println(str);
            
             brs.close();
             br.close();
             socket.close();
  }
 
}
 

 

 

 

      服務端:

            步驟:1.定義服務端服務,而後指定端口號。

                  2.得到客戶端對象,而後從中獲取讀取流。

                  3.定義新文件的寫入流,這樣把讀取流中的內容寫入到新文件中。

                  4.得到客戶端的寫入流,反饋給客戶端信息。

 

 

 

package www.fuxi.wangluo;
 
import java.io.BufferedReader;
import java.io.FileWriter;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
/**
 * 服務端
 */
public class TextServer {
  public static void main(String[] args) throws Exception {
    /**
     * 定義服務端,而後得到客戶端服務對象
     */
    ServerSocket server = new ServerSocket(25001);
    Socket socket=server.accept();
    /**
     * 得到客戶端的讀取流,這樣讀取文件內容
     */
    BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream()));
    /**
     * 得到目標文件的寫入流,用來寫入文件內容
     */
    PrintWriter pr=new PrintWriter(new FileWriter("newCopy.txt"),true);
    String line=null;
    while((line=br.readLine())!=null){
      pr.println(line);
    }
    /**
     * 得到客戶端的寫入流,這樣把信息反饋給客戶端
     */
    PrintWriter prs=new PrintWriter(socket.getOutputStream());
    prs.println("上傳成功!");
    pr.close();
    prs.close();
    br.close();
    server.close();
  }
 
}
 
結果:上傳成功
 



 

注意點:必定要定義結束標記,不然會不會中止上傳,結束標記能夠自定義,也可使用Socket中自帶的方法來結束。




---------------------ASP.Net+Android+IOS開發.Net培訓、期待與您交流! --------------------

相關文章
相關標籤/搜索