一、網(wǎng)絡(luò)編程的主要問題:
- 如何準(zhǔn)確的定位網(wǎng)絡(luò)上一臺或者多臺主機
- 找到主機后如何可靠高效的傳輸數(shù)據(jù)
二、TCP( Tranfer Control Protocol傳輸控制協(xié)議)
- 是面向連接、保證高可靠性(數(shù)據(jù)無丟失、數(shù)據(jù)無失序、數(shù)據(jù)無錯誤、數(shù)據(jù)無重復(fù)到達)傳輸層協(xié)議
- 通過TCP協(xié)議傳輸,得到的是一個順序的無差錯的數(shù)據(jù)流
- 傳輸效率較UDP低
- 是面向連接的,有比較高的可靠性
三、UDP(User Datagram Protocol用戶數(shù)據(jù)報協(xié)議)
- 是一個簡單的面向數(shù)據(jù)報的運輸層協(xié)議
- 不提供可靠性,它只是把應(yīng)用程序傳給IP層的數(shù)據(jù)報發(fā)送出去,但是并不能保證它們能到達目的地
- 傳輸效率高
- 發(fā)送方所發(fā)送的數(shù)據(jù)報并不一定以相同的次序到達接收方
四、Socket
Socket可以說是一種針對網(wǎng)絡(luò)的抽象,應(yīng)用通過它可以來針對網(wǎng)絡(luò)讀寫數(shù)據(jù)。根據(jù)TCP協(xié)議和UDP協(xié)議的不同,在網(wǎng)絡(luò)編程方面就有面向兩個協(xié)議的不同socket,一個是面向字節(jié)流的一個是面向報文的。
網(wǎng)絡(luò)上的兩個程序通過一個雙向的通訊連接實現(xiàn)數(shù)據(jù)的交換,這個雙向鏈路的一端稱為一個Socket。Socket通常用來實現(xiàn)客戶方和服務(wù)方的連接。 一個Socket由一個IP地址和一個端口號唯一確定。
五、Socket服務(wù)端
- 構(gòu)建一個ServerSocket實例,指定本地的端口。這個socket就是用來監(jiān)聽指定端口的連接請求的。 如:
ServerSocket server = new ServerSocket(8080);
- 創(chuàng)建Socket并調(diào)用ServerSocket 的accept()方法來獲得客戶端的連接請求。通過accept()方法返回的socket實例,建立了一個和客戶端的新連接。
- 通過這個返回的socket實例獲取InputStream和OutputStream,可以通過這兩個流來分別讀和寫數(shù)據(jù)。
- 調(diào)用Socket 實例的close()方法,關(guān)閉Socket。
代碼示例:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
/**
* @author Yige
* @create 2017-02-22 15:09
*/
public class ServerSocketCToS {
public static void main(String[] args) {
try {
ServerSocket serverSocket = new ServerSocket(8080);
Socket socket = serverSocket.accept();
// BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
boolean flag = true;
while (flag){
String enter = reader.readLine();
System.out.println("客戶端:" + enter);
if ("233".equals(enter)){
System.out.println("結(jié)束會話!");
flag = false;
}
}
reader.close();
socket.close();
serverSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
六、Socket客戶端
- 構(gòu)建Socket實例
- 通過指定的遠程服務(wù)器地址和端口來建立連接。如:
Socket socket = new Socket("localhost", 8080);
- 通過Socket實例包含的InputStream和OutputStream來進行數(shù)據(jù)的讀寫。
- 調(diào)用Socket實例的close方法,關(guān)閉Socket。
代碼示例:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
/**
* @author Yige
* @create 2017-02-22 15:09
*/
public class ClientSocketCToS {
public static void main(String[] args) {
try {
Socket socket = new Socket("127.0.0.1",8080);
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
PrintWriter printWriter = new PrintWriter(socket.getOutputStream(), true);
String enter = in.readLine();
while (!"233".equals(enter)){
printWriter.println(enter);
System.out.println("我(客戶端):" + enter);
enter = in.readLine();
}
printWriter.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
上邊的源碼是一對一的!以后可以用多線程實現(xiàn)一個服務(wù)器對多個客戶端!
PS:一些題外話:Socket編程好早就接觸過了,然后就是照著書上把代碼敲出來,過后就忘了。借著偶然看見的一些資料,在這里重新復(fù)習(xí)下。
學(xué)無止境,為我兔的星辰大海!
一些參考文檔:
http://www.cnblogs.com/linzheng/archive/2011/01/23/1942328.html
http://www.cnblogs.com/elgin-seth/p/5293713.html
https://zhidao.baidu.com
……