1. 程式人生 > >Java——TCP的簡單傳輸過程

Java——TCP的簡單傳輸過程

TCP協議:面向連線(三次握手),資料安全,速度比UDP略低,分為客戶端和服務端
                  客戶端先向服務端發起請求,服務端響應請求,傳輸資料
         客戶端:建立Socket連線服務端(指定ip地址,埠號)通過ip地址找對應得伺服器
                呼叫Socket的getInputStream()和getOutputStream()方法獲取和服務端相連的IO流
                輸入流可以讀取服務端輸出流寫出的資料
                輸出流可以寫出資料到服務端的輸入流
         服務端:

建立ServerSocket(需要指定埠號)
                呼叫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();
		
		}
	}
}