代碼運行的時候先運行服務端,然后在運行客戶端
* TCP協議:* 1 ,客戶端* 創建Socket連接服務器(指定IP地址,端口號)通過IP地址找到對應的服務器* 調用Socket的getInputStream()和getOutputStream()方法獲取和服務器端相連的IO流* 輸入流可以讀取服務器端輸出流寫出的數據* 輸出流可以寫出數據到服務端的輸入流* * 2 ,服務端* 創建ServerSocket(需要指定端口號)* 調用ServerSocket的accept()方法接受一個客戶端請求,得到一個Socket* 調用Socket的getInputStream()和getOutputStream()方法獲取和客戶端相連的IO流* 輸入流可以讀取客戶端輸出流寫出的數據* 輸出流可以寫出數據到客戶端的輸入流
package com.wsq.tcp;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;public class Demo1_Client {
/*** 1,客戶端* 創建Socket連接服務器(指定IP地址,端口號不超過65535)通過IP地址找到對應的服務器* 調用Socket的getInputStream()和getOutputStream()方法獲取和服務器端相連的IO流* 輸入流可以讀取服務器端輸出流寫出的數據* 輸出流可以寫出數據到服務端的輸入流* @throws IOException * @throws UnknownHostException * * * */ public static void main (String[] args) throws UnknownHostException, IOException {Socket wsq = new Socket("192.168.1.182" ,1014 ); InputStream is = wsq.getInputStream(); OutputStream os = wsq.getOutputStream(); byte [] arr = new byte [1024 ]; int len = is.read(arr); System.out.println(new String (arr,0 ,len)); os.write("客戶端對服務端發送請求:傻孩紙,還在睡呢?" .getBytes());wsq.close(); }
}
package com.wsq.tcp;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;public class Demo2_Server {
/*** * 2,服務端* 創建ServerSocket(需要指定端口號)* 調用ServerSocket的accept()方法接受一個客戶端請求,得到一個Socket* 調用Socket的getInputStream()和getOutputStream()方法獲取和客戶端相連的IO流* 輸入流可以讀取客戶端輸出流寫出的數據* 輸出流可以寫出數據到客戶端的輸入流* @throws IOException * * */ public static void main (String[] args) throws IOException {ServerSocket server = new ServerSocket(1014 ); Socket wsq= server.accept(); InputStream is = wsq.getInputStream(); OutputStream os = wsq.getOutputStream(); os.write("服務端響應客戶端沒,剛睡醒,不想理你" .getBytes());byte [] arr = new byte [1024 ]; int len = is.read(arr); System.out.println(new String (arr,0 ,len)); wsq.close(); }
}
由上面的例子可以看出,該程序有點弊端,例如:讀寫的時候特別費勁,寫的時候得把字符串轉成字節數組給寫出去,讀取的時候,需要創建一個字節數組,然后才能讀進來,然后再轉換成字符串
優化:讀的時候是字符串,寫的時候也是字符串,這樣會簡便很多
優化代碼如下:
package www.wsq.TCP;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;
import java.net.UnknownHostException;public class Demo1_Client {
/*** 1,客戶端* 創建Socket連接服務器(指定IP地址,端口號不超過65535)通過IP地址找到對應的服務器* 調用Socket的getInputStream()和getOutputStream()方法獲取和服務器端相連的IO流* 輸入流可以讀取服務器端輸出流寫出的數據* 輸出流可以寫出數據到服務端的輸入流* @throws IOException * @throws UnknownHostException * * * */ public static void main (String[] args) throws UnknownHostException, IOException {Socket wsq = new Socket("192.168.1.182" ,1014 ); BufferedReader br = new BufferedReader(new InputStreamReader(wsq.getInputStream())); PrintStream ps = new PrintStream(wsq.getOutputStream()); System.out.println(br.readLine()); ps.println("滾,mmp" );System.out.println(br.readLine()); ps.println("呵呵,你該唄兒厲害了~" );wsq.close(); }}
有常識可知,服務端是多線程的
package www.wsq.TCP;
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 Demo2_Server {
/*** * 2,服務端* 創建ServerSocket(需要指定端口號)* 調用ServerSocket的accept()方法接受一個客戶端請求,得到一個Socket* 調用Socket的getInputStream()和getOutputStream()方法獲取和客戶端相連的IO流* 輸入流可以讀取客戶端輸出流寫出的數據* 輸出流可以寫出數據到客戶端的輸入流* @throws IOException * * */ public static void main (String[] args) throws IOException {demo1();ServerSocket server = new ServerSocket(1014 ); while (true ){ final Socket wsq= server.accept(); new Thread(){ public void run (){try {BufferedReader br = new BufferedReader(new InputStreamReader(wsq.getInputStream())); PrintStream ps = new PrintStream(wsq.getOutputStream()); ps.println("歡迎來到哈哈哈哈我也不知道這是哪~~" );System.out.println(br.readLine()); ps.println("你讓我怎樣我就怎樣,我的面子往哪放?我就不" );System.out.println(br.readLine()); } catch (IOException e) {e.printStackTrace();}}}.start();wsq.close(); }}private static void demo1 () throws IOException {ServerSocket server = new ServerSocket(1014 ); Socket wsq= server.accept(); BufferedReader br = new BufferedReader(new InputStreamReader(wsq.getInputStream())); PrintStream ps = new PrintStream(wsq.getOutputStream()); ps.println("歡迎來到哈哈哈哈我也不知道這是哪~~" );System.out.println(br.readLine()); ps.println("你讓我怎樣我就怎樣,我的面子往哪放?我就不" );System.out.println(br.readLine());wsq.close();
}}