Java——TCP的簡單傳輸過程
阿新 • • 發佈:2018-11-27
TCP協議:面向連線(三次握手),資料安全,速度比UDP略低,分為客戶端和服務端
客戶端先向服務端發起請求,服務端響應請求,傳輸資料
客戶端:建立Socket連線服務端(指定ip地址,埠號)通過ip地址找對應得伺服器
呼叫Socket的getInputStream()和getOutputStream()方法獲取和服務端相連的IO流
輸入流可以讀取服務端輸出流寫出的資料
輸出流可以寫出資料到服務端的輸入流
服務端:
呼叫ServerSocket的accept()方法接收一個客戶端請求,得到一個Socket
呼叫Socket的getInputStream()和getOutputStream()方法獲取和客戶端相連的IO流
輸入流可以讀取客戶端輸出流寫出的資料
輸出流可以寫出資料到客戶端的輸入流
客戶端程式碼
package pra_24; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.PrintStream; import java.net.ServerSocket; import java.net.Socket; import java.net.UnknownHostException; public class J_45 { /** * @param args * @throws IOException * @throws UnknownHostException */ public static void main(String[] args) throws Exception { //客戶端 /* 客戶端初始版 Socket s1=new Socket("127.0.0.1", 12345); InputStream is=s1.getInputStream(); //獲取客戶端輸入流 OutputStream os=s1.getOutputStream(); //獲取客戶端輸出流 byte[] arr=new byte[1024]; int len=is.read(arr); //讀取伺服器發過來的資料 System.out.println(new String(arr,0,len)); //將資料轉換成字串並列印 os.write("qwert".getBytes()); //客戶端向伺服器寫資料 s1.close(); */ //客戶端優化版 Socket s1=new Socket("127.0.0.1", 12345); BufferedReader br=new BufferedReader(new InputStreamReader(s1.getInputStream()));//將位元組流包裝成字元流 PrintStream ps=new PrintStream(s1.getOutputStream()); //PrintStream有寫出換行的方法 System.out.println(br.readLine()); ps.println("阿拉斯加"); System.out.println(br.readLine()); ps.println("你有完沒完!"); s1.close(); } }
伺服器端程式碼
package pra_24;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
public class J_46 {
public static void main(String[] args) throws Exception{
//伺服器
/*
伺服器初始版
ServerSocket ss=new ServerSocket(12345);
Socket s=ss.accept(); //接受客戶端的請求
InputStream is=s.getInputStream(); //獲取客戶端輸入流
OutputStream os=s.getOutputStream(); //獲取客戶端輸出流
os.write("abcdefghijk".getBytes()); //伺服器向客戶端寫出資料
byte[] arr=new byte[1024];
int len=is.read(arr); //讀取客戶端發過來的資料
System.out.println(new String(arr,0,len)); //將資料轉換成字串並列印
*/
//伺服器優化版
ServerSocket ss=new ServerSocket(12345);
Socket s=ss.accept();
BufferedReader br=new BufferedReader(new InputStreamReader(s.getInputStream()));//將位元組流包裝成字元流
PrintStream ps=new PrintStream(s.getOutputStream()); //PrintStream有寫出換行的方法
ps.println("歡迎光臨");
System.out.println(br.readLine());
ps.println("阿拉斯加沒用");
System.out.println(br.readLine());
s.close();
}
}
服務端是多執行緒的方式
package pra_24;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
public class J_46 {
public static void main(String[] args) throws Exception{
//伺服器端是多執行緒的
ServerSocket ss=new ServerSocket(12345);
while(true){
final Socket s=ss.accept();
new Thread(){
public void run(){
try {
BufferedReader br=new BufferedReader(new InputStreamReader(s.getInputStream()));//將位元組流包裝成字元流
PrintStream ps=new PrintStream(s.getOutputStream()); //PrintStream有寫出換行的方法
ps.println("歡迎光臨");
System.out.println(br.readLine());
ps.println("阿拉斯加沒用");
System.out.println(br.readLine());
s.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}.start();
}
}
}