TCP UDP之網絡編程及數據庫入門

一:網絡編程三要素+UDP協議講解
1.1
1.網絡通信介紹
2.tcp/ip
3.udp/ip

1.2
Socket通信
* 網絡編程三要素:
ip:
一個計算的標示(找到這個計算機)
端口:
應用程序都會對應一個端口,用來進行通信,有效端口:0~65535,其中0~1024系統使用或保留端口(360查看端口)。
協議:
總共有2種協議(TCP,UDP)
socket編程圖解

* 舉例說明:
    1.找到劉詩詩(ip)
    2.對着劉詩詩的而耳朵說話(端口)
    3.協議

1.3
三要素詳解:
特殊的IP地址:

    127.0.0.1   本地迴環地址  用來做一些本地測試   
    ping    IP地址    ; 用來檢測本機是否可以和指定的IP地址的計算機可以進行正常通訊
    ipconfig             用來查看IP地址
    xxx.xxx.xxx.255 廣播地址

端口號:

    物理端口        物理設備對應的端口   , 網卡口
    邏輯端口        用來標示我們的計算機上的進程 , 端口號的有效範圍應該是 0-65535    ,
                    其中0-1024被系統佔用或者保留

協議:

    UDP
        把數據打成一個數據包 , 不需要建立連接
        數據包的大小有限制不能超過64k
        因爲無連接,所以屬於不可靠協議(可能丟失數據)
        因爲無連接 ,所以效率高    
        ![udp圖解](https://img-blog.csdn.net/20170530195006587?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc21pdGhsaWFuZzE5OTY=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
    TCP
        需要建立連接,形成連接通道
        數據可以使用連接通道直接進行傳輸,無大小限制
        因爲有鏈接,所以屬於可靠協議
        因爲有鏈接,所以效率低 

tcp圖解

1.4 (InetAddress)
*
/*
* InetAddress:IP地址的描述類
*
A:InetAddress類的概述
爲了方便我們對IP地址的獲取和操作,java提供了一個類InetAddress 供我們使用
此類表示互聯網協議 (IP) 地址。
B:InetAddress類的常見功能
public static InetAddress getByName(String host)( host: 可以是主機名,也可以是IP地址的字符串表現形式)
public String getHostAddress()返回 IP 地址字符串(以文本表現形式)。
public String getHostName()獲取此 IP 地址的主機名。
C:案例演示: InetAddress類的常見功能
*/

package com.edu_01;

import java.net.InetAddress;


/*
 *  InetAddress:IP地址的描述類
 * 
    A:InetAddress類的概述
        爲了方便我們對IP地址的獲取和操作,java提供了一個類InetAddress 供我們使用
        此類表示互聯網協議 (IP) 地址。 
    B:InetAddress類的常見功能
        public static InetAddress getByName(String host)( host: 可以是主機名,也可以是IP地址的字符串表現形式)
        public String getHostAddress()返回 IP 地址字符串(以文本表現形式)。
        public String getHostName()獲取此 IP 地址的主機名。 
    C:案例演示: InetAddress類的常見功能
 */
public class InetAddressDemo {
    public static void main(String[] args) throws Exception {
        //通過主機ip獲取InetAddress對象
        InetAddress address = InetAddress.getByName("192.168.20.25");

        //public String getHostAddress()返回 IP 地址字符串(以文本表現形式)。
        System.out.println(address.getHostAddress());

        //public String getHostName()獲取此 IP 地址的主機名。 
        System.out.println(address.getHostName());

    }

}

1.5(也叫socket編程,套接字編程,網絡編程,叫法不一樣都是一個東西)
* Socket套接字:(利用qq聊天的案例畫圖進行講解)
網絡上具有唯一標識的IP地址和端口號組合在一起才能構成唯一能識別的標識符套接字。

        Socket原理機制:
        通信的兩端都有Socket。
        網絡通信其實就是Socket間的通信。
        數據在兩個Socket間通過IO傳輸。

socket 編程圖解

1.6
分協議進行講解網絡編程
* UDP協議:(寫一個標準demo)
特點:1.把數據打包
2.不需要建立連接,也稱爲面向無連接協議
3.數據需打包,數據大小有限制64k
4.無需建立連接,所以不可靠
5.速度快

          UDP通信步驟:
                發送端步驟:
                /*
                 * UDP發送數據的步驟:
                 * A:創建UDP發送數據端Socket對象
                 * B:創建數據包,並給出數據,把數據打包
                 * C:通過Socket對象發送數據包 
                 * D:釋放資源
                 */

                 接收端步驟:
                /*
                 * UDP協議接收數據步驟:
                 * A:創建UDP接收數據端Socket對象
                 * B:創建一個接收數據的數據包
                 * C:接收數據,數據在數據包中
                 * D:解析數據包,並把數據顯示在控制檯
                 * E:釋放資源
                 */
發送端:
package com.edu_02;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;

/**
 * UDP協議特點:
 * 1.數據通過打包之後進行發送
 * 2.不需要進行連接
 * 3.數據大小有限制
 * 4.協議屬於不安全協議
 * 5.效率比較高
 */
public class UdpClient {
    public static void main(String[] args) throws Exception {
        //1.創建udp協議發送端的socket對象
        //public DatagramSocket() throws SocketException
        DatagramSocket ds = new DatagramSocket();

        byte[] buf = "hello".getBytes();
        int length = buf.length;
        InetAddress address = InetAddress.getByName("192.168.20.254");
        int port = 8888;

        //2.創建數據包
        //public DatagramPacket(byte[] buf, int length,InetAddress address,int port)
        DatagramPacket dp = new DatagramPacket(buf, length, address, port);
        /**
         * 1.你要發送的數據
         * 2.發送的數據的長度
         * 3.你要發送給的電腦ip
         * 4.端口
         */

        //發送數據
        ds.send(dp);

        //釋放資源
        ds.close();


    }

}
接收端:
package com.edu_02;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

public class UdpServer {
    public static void main(String[] args) throws Exception {
        //創建接收端的socket對象
        DatagramSocket ds = new DatagramSocket(8888);

        //創建一個數據包,用來接收來自發送端的數據,是一個空的數據包
        byte[] buf = new byte[1024];
        int length = buf.length;
        DatagramPacket dp = new DatagramPacket(buf, length);

        //接受來自發送端的數據
        //public void receive(DatagramPacket p)throws IOException
        //程序在這裏接收到來自發送端的數據之前一直處於阻塞狀態
        ds.receive(dp);

        //解析一下數據包中的數據
        //public byte[] getData()返回數據緩衝區
        byte[] data = dp.getData();
        //public int getLength()返回將要發送或接收到的數據的長度
        int len = dp.getLength();

        System.out.println(new String(data,0,len));

        //釋放資源
        ds.close();

    }

}

1.7 畫圖講解udp協議發送和接受數據圖解

1.8 鍵盤錄入數據實現數據的動態發送

發送端:
package com.edu_03;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.util.Scanner;

/**
 * 1.8 鍵盤錄入數據實現數據的動態發送
 * 
 */
public class UdpClient {
    public static void main(String[] args) throws Exception {
        //1.創建發送端的socket對象
        DatagramSocket ds = new DatagramSocket();

        InetAddress address = InetAddress.getByName("192.168.20.254");
        int port = 9999;

        //2.創建鍵盤錄入對象
        Scanner sc = new Scanner(System.in);
        String line;
        while ((line=sc.nextLine())!=null) {
            //鍵盤錄入的數據line
            byte[] buf = line.getBytes();
            int length = buf.length;
            DatagramPacket dp = new DatagramPacket(buf, length, address, port);
            //發送數據包
            ds.send(dp);
        }

        //釋放資源
        ds.close();

    }

}
接收端:
package com.edu_03;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

public class UdpServer {
    public static void main(String[] args) throws Exception {
        //創建接收端的socket對象
        DatagramSocket ds = new DatagramSocket(9999);

        //接受來自客戶端的數據
        while (true) {
            //創建數據包
            byte[] buf = new byte[1024];
            int length = buf.length;
            DatagramPacket dp = new DatagramPacket(buf, length);

            //接受來自客戶端的數據
            ds.receive(dp);

            //解析數據包中的數據
            byte[] data = dp.getData();
            int len = dp.getLength();
            System.out.println(new String(data, 0, len));

        }

    }

}

1.9 dos命令行演示聊天室(多個窗口實現羣聊)

代碼是1.8的代碼,用命令窗口時先複製.java文件,把裏面的包名刪除,然後javac 文件名.java生成.class文件,然後java 文件名 只開啓一個服務端,開啓多個 客戶端。

1.10 多線程實現聊天室(相當於是將發送數據端和接收數據端合併)

客戶端:
package com.edu_04;


import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.Scanner;

public class UdpCilent implements Runnable{

    DatagramSocket ds ;

    public UdpCilent(DatagramSocket ds){
        this.ds = ds;
    }

    @Override
    public void run() {
        try {
            InetAddress address = InetAddress.getByName("192.168.20.255");
            int port = 9999;

            //2.創建鍵盤錄入對象
            Scanner sc = new Scanner(System.in);
            String line;
            while ((line=sc.nextLine())!=null) {
                //鍵盤錄入的數據line
                byte[] buf = line.getBytes();
                int length = buf.length;
                DatagramPacket dp = new DatagramPacket(buf, length, address, port);
                //發送數據包
                ds.send(dp);
            }

            //釋放資源
            ds.close();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}
服務端:
package com.edu_04;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

public class UdpServer implements Runnable{
    DatagramSocket ds ;

    public UdpServer(DatagramSocket ds){
        this.ds = ds;
    }

    @Override
    public void run() {
        try {
            //接受來自客戶端的數據
            while (true) {
                //創建數據包
                byte[] buf = new byte[1024];
                int length = buf.length;
                DatagramPacket dp = new DatagramPacket(buf, length);

                //接受來自客戶端的數據
                ds.receive(dp);

                //獲取發送信息的人的ip地址
                String ip = dp.getAddress().getHostAddress();

                //解析數據包中的數據
                byte[] data = dp.getData();
                int len = dp.getLength();
                System.out.println(ip+":"+new String(data, 0, len));

            }
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}
聊天室:
package com.edu_04;

import java.net.DatagramSocket;
import java.net.SocketException;

public class ChatRoom {
    public static void main(String[] args) throws Exception {
        //啓動發送線程和接收縣城
        //啓動發送線程
        new Thread(new UdpCilent(new DatagramSocket())).start();

        //啓動接收線程
        new Thread(new UdpServer(new DatagramSocket(9999))).start();

    }

}

二:TCP協議要點
2.1
* TCP協議:(寫一個demo)
特點:1.需要建立通道
2.傳送大量數據無限制
3.面向連接
4.可靠
5.速度慢
TCp協議書寫步驟:
發送端:
/*
* TCP協議發送數據步驟:
* A:創建TCP協議發送端Socket對象
* 指定服務器IP及端口
Socket sk = new Socket(“192.168.3.120” , 9527) ;
* B:獲取輸出流,並寫數據
OutputStream outputStream = sk.getOutputStream() ;
outputStream.write(“hello,TCP我來了”.getBytes()) ;
* C:釋放資源
sk.close() ;
*
* java.net.ConnectException: Connection refused: connect
* TCP協議是不能直接運行客戶端的,必須先運行服務器。因爲他是一種可靠的協議。
*/

             接收端:
             /*
                 * TCP協議接收數據步驟:
                 * A:創建TCP協議接收端Socket對象
                   ServerSocket ss = new ServerSocket(9527) ;
                 * B:監聽客戶端連接
                   Socket sk = ss.accept() ;
                 * C:獲取輸入流,並讀取數據,顯示在控制檯
                 // 讀取數據
                byte[] bytes = new byte[1024] ;
                int len = inputStream.read(bytes) ;

                // public InetAddress getInetAddress()獲取IP地址
                InetAddress inetAddress = sk.getInetAddress() ;
                String ip = inetAddress.getHostAddress() ;

                // 輸出
                System.out.println(ip + "發來數據是: " + new String(bytes , 0 , len));
                 * D:釋放資源
                 sk.close() ;
                 */
客戶端:
package com.edu_05;

import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;

/**
 * tcp:
 * 1.必須建立鏈接,這個協議又被稱爲面向鏈接協議
 * 2.發送數據沒有大小限制
 * 3.協議比較安全
 * 4.效率低
 * 
 * 先運行客戶端的時候拋出異常:
 * java.net.ConnectException: Connection refused: connect
 * 因爲服務器端還沒有準備好跟你的客戶端建立連接呢,你就來了,所以拋出異常,因爲tcp
 * 協議是面向連接的一個協議
 * 
 */
public class TcpClient {
    public static void main(String[] args) throws Exception {
        //創建tcp協議發送端的socket對象
        //public Socket(String host,int port)
        Socket sk = new Socket("192.168.20.254", 10086);

        //2.public OutputStream getOutputStream()throws IOException
        //從通道中獲取輸出流對象
        OutputStream os = sk.getOutputStream();

        //3.給通道中寫數據
        os.write("hello".getBytes());

        //4.釋放資源
        sk.close();

    }

}
服務器:
package com.edu_05;

import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class TcpServer {
    public static void main(String[] args) throws Exception {
        //1.創建服務器端的sokeck對象
        //public ServerSocket(int port)throws IOException
        ServerSocket ss = new ServerSocket(10086);

        //2.堅挺來自客戶端的連接
        //public Socket accept()throws IOException偵聽並接受到此套接字的連接。此方法在連接傳入之前一直阻塞。 
        Socket sk = ss.accept();

        //3.從通道中讀取來自客戶端的數據
        InputStream is = sk.getInputStream();

        //4.讀取is
        byte[] buf = new byte[1024];
        int len = is.read(buf);
        System.out.println(new String(buf, 0, len));

        //5.釋放資源
        sk.close();
    }

}

2.2
用TCP協議寫一個數據的發送和接收,接收端接收到數據之後給發送端一個反饋

package com.edu_06;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;

public class TcpClient {
    public static void main(String[] args) throws Exception {
        //創建tcp發送端的sockt對象
        Socket sk = new Socket("192.168.20.254", 10000);

        //從通道中獲取輸出流
        OutputStream os = sk.getOutputStream();

        //網通道中寫數據
        os.write("今晚約嗎".getBytes());

        //接受來自服務器端的反饋
        InputStream is = sk.getInputStream();
        //解析is
        byte[] buf = new byte[1024];
        int len = is.read(buf);
        System.out.println(new String(buf, 0, len));

        //釋放資源
        sk.close();

    }

}
服務端:
package com.edu_06;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class TcpServer {
    public static void main(String[] args) throws Exception {
        //創建服務器端的socket對象
        ServerSocket ss = new ServerSocket(10000);

        //監聽來自客戶端的連接
        Socket sk = ss.accept();

        //從通道中獲取輸入流讀取數據
        InputStream is = sk.getInputStream();

        //解析is
        byte[] buf = new byte[1024];
        int len = is.read(buf);
        System.out.println(new String(buf, 0, len));


        //給客戶端一個反饋
        OutputStream os = sk.getOutputStream();
        os.write("不約".getBytes());


        //釋放資源
        sk.close();


    }

}

2.3
以2.3的案例代碼爲基礎,畫圖講解tcp協議數據的發送和接收

2.4
需求: 客戶端鍵盤錄入數據,服務器端接收數據在控制檯輸出

客戶端:
package com.edu_07;

import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;

/**
 *  2.4
    需求: 客戶端鍵盤錄入數據,服務器端接收數據在控制檯輸出
 *   
 */
public class TcpClient {
    public static void main(String[] args) throws Exception {
        //創建tcp發送端socket對象
        Socket sk = new Socket("192.168.20.254", 20000);

        //創建鍵盤錄入對象
        Scanner sc = new Scanner(System.in);
        String line;
        while ((line=sc.nextLine())!=null) {
            //將line這個數據寫如通道
            OutputStream os = sk.getOutputStream();
            os.write(line.getBytes());

        }

        sk.close();

    }

}
服務端:
package com.edu_07;

import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class TcpServer {
    public static void main(String[] args) throws Exception {
        //創建服務器端的socket對象
        ServerSocket ss = new ServerSocket(20000);

        //監聽來自客戶端的連接
        Socket sk = ss.accept();
        while (true) {
            InputStream is = sk.getInputStream();
            byte[] buf = new byte[1024];
            int len = is.read(buf);
            System.out.println(new String(buf, 0, len));
        }


    }

}

2.5
需求:客戶端鍵盤錄入數據,服務端將數據寫入文件

package com.edu_07;

import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;

/**
 *  2.4
    需求: 客戶端鍵盤錄入數據,服務器端接收數據在控制檯輸出
 *   
 */
public class TcpClient {
    public static void main(String[] args) throws Exception {
        //創建tcp發送端socket對象
        Socket sk = new Socket("127.0.0.1", 20000);

        //創建鍵盤錄入對象
        Scanner sc = new Scanner(System.in);
        String line;
        while ((line=sc.nextLine())!=null) {
            //將line這個數據寫如通道
            OutputStream os = sk.getOutputStream();
            os.write(line.getBytes());

        }

        sk.close();

    }

}
服務端:
package com.edu_07;

import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class TcpServer {
    public static void main(String[] args) throws Exception {
        //創建服務器端的socket對象
        ServerSocket ss = new ServerSocket(20000);

        //監聽來自客戶端的連接
        Socket sk = ss.accept();
        while (true) {
            InputStream is = sk.getInputStream();
            byte[] buf = new byte[1024];
            int len = is.read(buf);
            System.out.println(new String(buf, 0, len));
        }


    }

}

2.6
需求:客戶端讀取文本文件中的內容發送給服務端,服務端將內容控制檯輸出

package com.edu_08;

import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;

public class TcpClient {
    public static void main(String[] args) throws Exception {
        /**
         * 2.5
            需求:客戶端鍵盤錄入數據,服務端將數據寫入文件
            客戶端
            一次寫一行

            服務端:
            一次讀取一行,將讀取到的內容寫入文件
         */
        //創建tcp客戶端socket對象
        Socket sk = new Socket("192.168.20.254", 10010);
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(sk.getOutputStream()));

        //創建鍵盤錄入對象
        Scanner sc = new Scanner(System.in);
        String line;
        while ((line=sc.nextLine())!=null) {
            //往通道中寫數據,一次寫一行
            bw.write(line);
            bw.newLine();
            bw.flush();
        }

        sk.close();
    }

}
服務端:
package com.edu_08;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;

public class TcpServer {
    public static void main(String[] args) throws Exception {
        //創建服務器端的socket對象
        ServerSocket ss = new ServerSocket(10010);

        //監聽客戶端連接
        Socket sk = ss.accept();

        //從sk的通道中讀取數據,一次讀取一行
        BufferedReader br = new BufferedReader(new InputStreamReader(sk.getInputStream()));
        BufferedWriter bw = new BufferedWriter(new FileWriter("a.txt"));

        //一次讀取一行數據
        String line;
        while ((line=br.readLine())!=null) {
            //line就是已經讀取到的數據,我們現在需要將line這個數據寫入文件
            bw.write(line);
            bw.newLine();
            bw.flush();
        }

        sk.close();
        bw.close();
        br.close();

    }

}

2.7
* 需求: 上傳文本文件
*
* 客戶端:
* a: 讀取文本文件中的數據
* b: 發送到服務器端
*
* 服務器:
* a: 讀取流通道中的數據
* b: 把數據寫入到文本文件中

package com.edu_09;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.net.UnknownHostException;

/**
 * 2.6  
    需求:客戶端讀取文本文件中的內容發送給服務端,服務端將內容控制檯輸出
 *  客戶端:
 *  1.讀取文本文件,一次讀取一行
 *  2.將讀取到的內容寫入通道,一次寫一行
 *  3.釋放資源
 *  服務器端:   
 *  1.從通道中讀取數據,一次讀取一行
 *  2.輸出
 */
public class TcpClient {
    public static void main(String[] args) throws Exception {
        //創建socket對象
        Socket sk = new Socket("192.168.20.254", 2000);
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(sk.getOutputStream()));

        //讀取文本一次讀取一行
        BufferedReader br = new BufferedReader(new FileReader("a.txt"));
        String line;
        while ((line=br.readLine())!=null) {
            //line就是我讀取到的數據,我需要將這個數據寫入通道,一次寫一行
            bw.write(line);
            bw.newLine();
            bw.flush();
        }

        //釋放資源
        br.close();
        bw.close();
        sk.close();

    }

}
服務端:
package com.edu_09;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;

public class TcpServer {
    public static void main(String[] args) throws Exception {
        //創建服務器端的socket對象
        ServerSocket ss = new ServerSocket(2000);

        //蔣婷來自於客戶端的連接
        Socket sk = ss.accept();

        //創建BufferedReader一次讀取一行數據
        BufferedReader br = new BufferedReader(new InputStreamReader(sk.getInputStream()));
        String line;
        while ((line=br.readLine())!=null) {
            System.out.println(line);
        }

        //釋放資源
        br.close();
        sk.close();

    }

}

2.8
運用多線程改進2.7

客戶端:
package com.edu_10;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.net.UnknownHostException;

/**
 * 2.6  
    需求:客戶端讀取文本文件中的內容發送給服務端,服務端將內容控制檯輸出
 *  客戶端:
 *  1.讀取文本文件,一次讀取一行
 *  2.將讀取到的內容寫入通道,一次寫一行
 *  3.釋放資源
 *  服務器端:   
 *  1.從通道中讀取數據,一次讀取一行
 *  2.輸出
 */
public class TcpClient {
    public static void main(String[] args) throws Exception {
        //創建socket對象
        Socket sk = new Socket("192.168.20.254", 2000);
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(sk.getOutputStream()));

        //讀取文本一次讀取一行
        BufferedReader br = new BufferedReader(new FileReader("InetAddressDemo.java"));
        String line;
        while ((line=br.readLine())!=null) {
            //line就是我讀取到的數據,我需要將這個數據寫入通道,一次寫一行
            bw.write(line);
            bw.newLine();
            bw.flush();
        }

        //釋放資源
        br.close();
        bw.close();
        sk.close();

    }

}
服務端:
package com.edu_10;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;

public class ServerThread implements Runnable{
    Socket sk;
    public ServerThread(Socket sk){
        this.sk = sk;
    }

    @Override
    public void run() {
        try {
            //創建BufferedReader一次讀取一行數據
            BufferedReader br = new BufferedReader(new InputStreamReader(sk.getInputStream()));
            BufferedWriter bw = new BufferedWriter(new FileWriter(UUIDUtils.getFileName()));
            String line;
            while ((line=br.readLine())!=null) {
                bw.write(line);
                bw.newLine();
                bw.flush();
                //System.out.println(line);
            }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}
package com.edu_10;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;

public class TcpServer {
    public static void main(String[] args) throws Exception {
        //創建服務器端的socket對象
        ServerSocket ss = new ServerSocket(2000);

        while (true) {
            //蔣婷來自於客戶端的連接
            Socket sk = ss.accept();
            //啓動一個子線程,去執行復制文件的動作
            new Thread(new ServerThread(sk)).start();
        }

    }

}
獲取隨機文件名的辦法:
package com.edu_10;

import java.util.UUID;


public class UUIDUtils {

    public static String getFileName(){
        String fileName = UUID.randomUUID().toString();
        fileName = fileName.replaceAll("-", "")+".txt";
        return fileName;
    }

}

2.9
提問:我們以後倒是使用udp協議還是tcp協議呢?
在咱們以後使用的軟件當中基本都是udp和tcp混用的
UDP屬於不可靠傳輸,但是其效率高,一般用在視頻通話,語音通話等用途,
TCP由於他傳輸必須要建立可靠的通道,所以所以效率低,一般用在發郵件,發文字等用途。

要學習數據庫,首先得安裝數據庫,下面我先把數據庫下載地址和入門資料分享給大家,可以進行下載學習。

鏈接:http://pan.baidu.com/s/1c2MSXYo 密碼:nz17

發佈了28 篇原創文章 · 獲贊 12 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章