Java基礎進階 網絡編程初級 TCP通信傳輸文件及信息實例
01.第一章:網絡編程入門_網絡編程三要素
1).IP地址:計算機在互聯網上的唯一地址--相當於收信地址;
1).127.0.0.1:不在公網上使用,用作本機迴環地址;
2).192.168.xxx.xxx:不在公網上使用,用作局域網;
3).10.xxx.xxx.xxx:不在公網上使用,用作局域網;
4).常用的DOS命令:
1).ipconfig:查看本機IP
2).ping 對方ip/域名 -t:查看本機與目標電腦是否連通。
2).端口號:指虛擬端口--相當於:收信人;
![在這裏插入圖片描述](https://img-blog.csdnimg.cn/20190408224802153.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3hjOTY1NzQ2NTUw,size_16,color_FFFFFF,t_70)
3).協議:指互聯網信息交互的不同的數據格式--寫信的語言/格式;
http,UDP協議,TCP協議,https,ftp....
1).UDP協議的特點:
1).數據要打包發送;
2).數據包大小有限制:64K;
3).發送時,可以沒有接收端--不安全的協議;
例如:公屏軟件、網絡視頻會議系統....
2).TCP協議的特點:【今天需要掌握】
1).數據不需要打包發送;
2).數據大小無限制;
3).發送時必須要有接收端,否則拋異常;
例如:文件上傳、下載,點對點聊天....
02.第二章:TCP通信程序_TCP發送端實現
public class Client {
public static void main(String[] args) throws IOException {
//1.創建一個Socket對象--連接服務器
Socket socket = new Socket("192.168.156.82",9999);//目標的IP和端口
//2.獲取一個輸出流
OutputStream out = socket.getOutputStream();
//3.輸出信息
out.write("你好服務器,呵呵!!".getBytes());
//4.關閉流
socket.close();
}
}
03.第二章:TCP通信程序_TCP服務器端接收實現
public class Demo {
public static void main(String[] args) throws IOException {
//1.創建一個ServerSocket
ServerSocket server = new ServerSocket(9999);
//2.等待連接
System.out.println("等待連接....");
Socket socket = server.accept();
//3.獲取輸入流,接收信息
InputStream in = socket.getInputStream();
byte[] byteArray = new byte[1024];
int len = in.read(byteArray);
System.out.println("【服務器】接收到的信息:" + new String(byteArray, 0, len));
//4.關閉流
socket.close();
server.close();
}
}
04.第二章:TCP通信程序_TCP發送與服務器的原理圖
05.第二章:TCP通信程序_練習_TCP服務器端發送反饋
1).客戶端:
public class Client {
public static void main(String[] args) throws IOException {
//1.創建一個Socket對象--連接服務器
Socket socket = new Socket("192.168.156.82",9999);//目標的IP和端口
//2.獲取一個輸出流
OutputStream out = socket.getOutputStream();
//3.輸出信息
out.write("你好服務器,呵呵!!".getBytes());
//接收反饋
InputStream in = socket.getInputStream();
byte[] byteArray = new byte[1024];
int len = in.read(byteArray);
System.out.println("【客戶端收到反饋】" + new String(byteArray, 0, len));
//4.關閉流
socket.close();
}
}
2).服務器端:
public class Server {
public static void main(String[] args) throws IOException {
//1.創建一個ServerSocket
ServerSocket server = new ServerSocket(9999);
//2.等待連接
System.out.println("等待連接....");
Socket socket = server.accept();
//3.獲取輸入流,接收信息
InputStream in = socket.getInputStream();
byte[] byteArray = new byte[1024];
int len = in.read(byteArray);
System.out.println("【服務器】接收到的信息:" +
new String(byteArray, 0, len));
//發送反饋
OutputStream out = socket.getOutputStream();
out.write("你傻笑啥呀!!".getBytes());
//4.關閉流
socket.close();
server.close();
}
}
多線程點對點聊天圖示:
06.第三章:綜合案例_單用戶文件上傳併發送反饋
1).客戶端:
public class Client {
public static void main(String[] args) throws IOException {
//1.連接服務器
Socket socket = new Socket("127.0.0.1",9999);
//2.構造文件輸入流
FileInputStream fileIn = new FileInputStream("d:\\視頻.itcast");
//3.構造一個網絡輸出流
OutputStream netOut = socket.getOutputStream();
//4.循環從文件讀取字節數組,併發送字節數組
byte[] byteArray = new byte[1024];
int len = 0;
while ((len = fileIn.read(byteArray)) != -1) {
netOut.write(byteArray,0,len);
}
//發送一個結束標記,促使服務器端的循環結束
socket.shutdownOutput();
System.out.println("上傳完畢,接收反饋....");
//接收反饋
InputStream netIn = socket.getInputStream();
len = netIn.read(byteArray);
System.out.println("【客戶端收到反饋】" +
new String(byteArray, 0, len));
//5.關閉流
fileIn.close();
socket.close();
System.out.println("【客戶端】上傳完畢!");
}
}
2).服務器端:
public class Server {
public static void main(String[] args) throws IOException {
//1.構造一個ServerSocket
ServerSocket server = new ServerSocket(9999);
//2.等待連接
Socket socket = server.accept();
//3.構造文件的輸出流
FileOutputStream out = new FileOutputStream("e:\\視頻.itcast");
//4.獲取一個網絡輸入流
InputStream netIn = socket.getInputStream();
//5.循環從網絡讀取
byte[] byteArray = new byte[1024];
int len = 0;
System.out.println("服務器開始處理上傳....");
while ((len = netIn.read(byteArray)) != -1) {
out.write(byteArray, 0, len);
}
System.out.println("服務器上傳完畢,發送反饋....");
//發送反饋
OutputStream netOut = socket.getOutputStream();
netOut.write("收到!!".getBytes());
//6.關閉流
out.close();
socket.close();
server.close();
System.out.println("【服務器端】完畢!");
}
}
07.第三章:綜合案例_多用戶文件上傳併發送反饋
原理圖示:
1).客戶端:
public class Client {
public static void main(String[] args) throws IOException {
for (int i = 0; i < 10; i++) {
new Thread(){
@Override
public void run() {
//1.連接服務器
Socket socket = null;
try {
socket = new Socket("127.0.0.1",9999);
//2.構造文件輸入流
FileInputStream fileIn = new FileInputStream("d:\\視頻.itcast");
//3.構造一個網絡輸出流
OutputStream netOut = socket.getOutputStream();
//4.循環從文件讀取字節數組,併發送字節數組
byte[] byteArray = new byte[1024];
int len = 0;
while ((len = fileIn.read(byteArray)) != -1) {
netOut.write(byteArray,0,len);
}
//發送一個結束標記,促使服務器端的循環結束
socket.shutdownOutput();
System.out.println("上傳完畢,接收反饋....");
//接收反饋
InputStream netIn = socket.getInputStream();
len = netIn.read(byteArray);
System.out.println("【客戶端收到反饋】" +
new String(byteArray, 0, len));
//5.關閉流
fileIn.close();
socket.close();
System.out.println("【客戶端】上傳完畢!");
} catch (IOException e) {
e.printStackTrace();
}
}
}.start();
}
}
}
2).服務器端
public class Server {
public static void main(String[] args) throws IOException {
//1.構造一個ServerSocket
ServerSocket server = new ServerSocket(9999);
int index = 0;
while (true) {
//2.等待連接
Socket socket = server.accept();
//3.啓動線程
new ServerThread(socket,++index).start();
}
}
}
3).服務器線程類
public class ServerThread extends Thread {
private Socket socket;
private int index;
public ServerThread(Socket socket,int index) {
this.socket = socket;
this.index = index;
}
@Override
public void run() {
//4.獲取一個網絡輸入流
InputStream netIn = null;
try {
netIn = socket.getInputStream();
//5.循環從網絡讀取
byte[] byteArray = new byte[1024];
int len = 0;
FileOutputStream out = new FileOutputStream("e:\\視頻" + index + ".itcast");
while ((len = netIn.read(byteArray)) != -1) {
out.write(byteArray, 0, len);
}
//發送反饋
OutputStream netOut = socket.getOutputStream();
netOut.write("收到!!".getBytes());
//6.關閉流
out.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
08.第三章:綜合案例3_模擬WEB服務器_案例說明
圖示原理:
09.第三章:綜合案例3_模擬WEB服務器_案例實現
1).我們只需要實現服務器,客戶端由瀏覽器充當。
代碼如下:
public class Server {
public static void main(String[] args) throws IOException {
//1.創建一個ServerSocket對象
ServerSocket server = new ServerSocket(9999);
//2.等待連接
while (true) {
System.out.println("等待連接...");
Socket socket = server.accept();
//3.由於瀏覽器是"按行"發送信息,所以服務器要按行接收
new Thread(){
@Override
public void run() {
BufferedReader bufIn = null;
try {
bufIn = new BufferedReader(
new InputStreamReader(socket.getInputStream()));
//4.只讀取第一行
String row = bufIn.readLine();//"GET /img/mn1.jpg HTTP/1.1"
//5.取出路徑
String path = row.substring(row.indexOf(" ") + 1,row.lastIndexOf(" "));//"/img/mn1.jpg"
//6.判斷
if(!path.startsWith("/img/")){
socket.close();
return;
}
//7.提取文件名
String fileName = path.substring(path.lastIndexOf("/") + 1);//mn1.jpg
//8.產生響應
//1.響應頭--固定寫法
OutputStream out = socket.getOutputStream();
out.write("HTTP/1.1 200 OK\r\n".getBytes());
out.write("content-type:image/jpeg\r\n".getBytes());//表示返回的是一個圖片,讓瀏覽器按圖片顯示
out.write("\r\n".getBytes());
//2.向客戶端輸出圖片
FileInputStream fileIn = new FileInputStream("img/" + fileName);
byte[] byteArray = new byte[1024];
int len = 0;
while ((len = fileIn.read(byteArray)) != -1) {
out.write(byteArray,0,len);
}
//關閉流
fileIn.close();
socket.close();
} catch (IOException e) {
}
}
}.start();
}
}
}
========================================================
學習目標總結:
01.能夠辨別UDP和TCP協議特點
1).UDP的特點:
1).需要打包發送
2).數據包大小有限制,64K;
3).發送時,可以沒有接收端--不安全的協議;
例如:公屏軟件
2).TCP的特點:
1).不需要打包發送;
2).數據大小無限制;
3).發送時,必須要有接收端--安全的協議;
例如:文件上傳、下載,點對點聊天
02.能夠說出TCP協議下兩個常用類名稱
1).客戶端:Socket(“ip”,int 端口)
2).服務器端:ServerSocket(int 端口)
03.能夠編寫TCP協議下字符串數據傳輸程序
04.能夠理解TCP協議下文件上傳案例
05.能夠理解TCP協議下模擬B\S服務器案例