1、BufferedReader和BufferedWriterjava
客戶端代碼:服務器
1 package main.java; 2 3 import java.io.BufferedReader; 4 import java.io.BufferedWriter; 5 import java.io.IOException; 6 import java.io.InputStream; 7 import java.io.InputStreamReader; 8 import java.io.OutputStream; 9 import java.io.OutputStreamWriter; 10 import java.net.Socket; 11 import java.net.UnknownHostException; 12 /** 13 * 客戶端發送寫死的信息給服務器(BufferedWriter),客戶端讀取服務器響應返回的信息(BufferedReader) 14 * @author whh 15 * 16 */ 17 public class SocketClient1 { 18 public static void main(String[] args) throws UnknownHostException, IOException { 19 20 //建立Socket通訊,設置訪問服務器的IP和Port 21 Socket socket = new Socket("127.0.0.1",90); 22 //輸出流向服務器發送數據消息 23 OutputStream outputStream = socket.getOutputStream(); 24 OutputStreamWriter osw = new OutputStreamWriter(outputStream); 25 BufferedWriter bw = new BufferedWriter(osw); 26 //輸入流讀取服務器發送來的數據消息 27 InputStream inputStream = socket.getInputStream(); 28 InputStreamReader inputStreamReader =new InputStreamReader(inputStream); 29 BufferedReader br = new BufferedReader(inputStreamReader); 30 //向服務器端發送一條消息 31 bw.write("測試客戶端和服務器通訊,服務器接收到消息返回到客戶端"); 32 bw.newLine(); 33 bw.flush(); 34 System.out.println("我是客戶端,已經鏈接到服務器:"+socket.getRemoteSocketAddress()); 35 36 37 String readLine = null; 38 while ((readLine = br.readLine()) != null){ 39 System.out.println("來自服務端的消息:"+readLine); 40 } 41 socket.close(); 42 } 43 44 }
服務端代碼:socket
1 package main.java; 2 3 import java.io.BufferedReader; 4 import java.io.BufferedWriter; 5 import java.io.InputStream; 6 import java.io.InputStreamReader; 7 import java.io.OutputStream; 8 import java.io.OutputStreamWriter; 9 import java.net.ServerSocket; 10 import java.net.Socket; 11 /** 12 * 服務器讀取客戶端發送的信息(BufferedReader), 13 * 服務器發送寫死的響應信息到客戶端(BufferedWriter) 14 * @author whh 15 * 16 */ 17 public class SocketServer1 { 18 public static void main(String[] args) throws Exception{ 19 //服務器創建通訊ServerSocket,並設置端口號 20 ServerSocket serverSocket = new ServerSocket(90); 21 System.out.println("啓動服務器...."); 22 while(true){ 23 Socket clientSocket = serverSocket.accept();//而後接受新的鏈接請求 //阻塞直到有客戶端鏈接上 24 System.out.println("客戶端:"+clientSocket.getInetAddress().getLocalHost()+"已鏈接到服務器"); 25 try { 26 process(clientSocket); 27 } catch (Exception e) { 28 e.printStackTrace(); 29 clientSocket.close(); 30 } 31 } 32 33 } 34 public static void process(Socket clientSocket) throws Exception{ 35 System.out.println("client socket鏈接:"+clientSocket.getRemoteSocketAddress()); 36 //輸入流:讀取客戶端發送信息 37 InputStream in = clientSocket.getInputStream(); 38 InputStreamReader isr = new InputStreamReader(in); 39 BufferedReader br = new BufferedReader(isr); 40 //輸出流:返回給客戶端響應信息 41 OutputStream out = clientSocket.getOutputStream(); 42 OutputStreamWriter osw = new OutputStreamWriter(out); 43 BufferedWriter bw = new BufferedWriter(osw); 44 String line = null; 45 while ((line = br.readLine()) != null){ 46 System.out.println("來自客戶端的消息:" + line); 47 bw.write("welcome from server."); 48 bw.newLine(); 49 bw.flush(); 50 } 51 } 52 }
* 注意事項:轉自http://blog.csdn.net/keketrtr/article/details/47128999
上面的java Socket通訊用到了BufferedReader的readLine()方法和BufferedWriter的write()方法。
注意readLine()方法,經過查看JDK中關於此方法的註釋可知,它是讀取一行數據,這行數據的末尾必須有換行符標識符說明到此爲止是一行。否則readLine()方法沒法順利讀取。
因此在服務器端或客戶端進行輸出的時候必須輸出換行標識(\n),讓對方能夠順利讀取一行。所以能夠這樣寫writer.write("hello world\n")。爲了更好地使用java的跨平臺特性,BufferedWriter提供了一個newLine()方法,該方法就是專門輸出一個換行符。因此也能夠這樣寫writer.write("hello world");writer.newLine();
另外既然是BufferedWriter,天然用到了緩衝,當你輸出的字符長度不超過緩衝區時,可能不會被輸出,這時候程序也沒法正常運行。因此要用writer.flush();刷新緩衝區。也就是說writer.write("我接收到你的數據:"+input);writer.newLine();writer.flush();必須一塊兒使用,它們老是同時出現,所以你能夠自定義一個方法,包含這三個方法。
public void writeLine(String msg){
writer.write(msg);工具
writer.newLine();測試
writer.flush();
}spa
2、PrintWriter和BufferedReader :在控制檯輸入,讀取.net
客戶端代碼:code
1 package main.java; 2 3 import java.io.BufferedReader; 4 import java.io.IOException; 5 import java.io.InputStream; 6 import java.io.InputStreamReader; 7 import java.io.OutputStream; 8 import java.io.PrintWriter; 9 import java.net.Socket; 10 import java.net.UnknownHostException; 11 import java.util.Scanner; 12 /** 13 * 客戶端發送控制檯輸入的信息給服務器,服務器在控制檯輸入信息返回給用戶:PrintWriter 14 * @author whh 15 * 16 */ 17 public class SocketClient2 { 18 public static void main(String[] args) throws UnknownHostException, IOException { 19 20 // try { 21 //建立Socket通訊,設置通訊服務器的IP和Port 22 Socket socket = new Socket("127.0.0.1",9090); 23 //創建IO輸入流讀取服務器發送來的數據消息 24 InputStream inputStream = socket.getInputStream(); 25 InputStreamReader inputStreamReader =new InputStreamReader(inputStream); 26 BufferedReader br = new BufferedReader(inputStreamReader); 27 //創建IO輸出流向服務器發送數據消息 28 OutputStream outputStream = socket.getOutputStream(); 29 // OutputStreamWriter osw = new OutputStreamWriter(outputStream); 30 boolean autoflush = true; 31 PrintWriter pw = new PrintWriter(outputStream, autoflush); 32 //在控制檯輸入信息 33 System.out.println("請輸入信息:"); 34 Scanner scan = new Scanner(System.in); 35 String send = scan.nextLine(); 36 //發送到服務器 37 pw.println(send); 38 39 // read the response 40 System.out.println(socket.getRemoteSocketAddress()); 41 String readLine = br.readLine(); 42 System.out.println("來自服務端的消息:"+readLine+"end..."); 43 socket.close(); 44 } 45 46 47 48 49
服務端代碼:server
1 package main.java; 2 3 import java.io.BufferedReader; 4 import java.io.InputStream; 5 import java.io.InputStreamReader; 6 import java.io.OutputStream; 7 import java.io.OutputStreamWriter; 8 import java.io.PrintWriter; 9 import java.net.ServerSocket; 10 import java.net.Socket; 11 import java.util.Scanner; 12 /** 13 * 客戶端發送控制檯輸入的信息給服務器,服務器在控制檯輸入信息返回給用戶:PrintWriter 14 * @author whh 15 * 16 */ 17 public class SocketServer2 { 18 public static void main(String[] args) throws Exception{ 19 //服務器創建通訊ServerSocket,並設置端口號 20 ServerSocket serverSocket = new ServerSocket(9090); 21 System.out.println("啓動服務器...."); 22 while(true){ 23 Socket clientSocket = serverSocket.accept();//而後接受新的鏈接請求 //阻塞直到有客戶端鏈接上 24 System.out.println("客戶端:"+clientSocket.getInetAddress().getLocalHost()+"已鏈接到服務器"); 25 try { 26 process(clientSocket); 27 } catch (Exception e) { 28 e.printStackTrace(); 29 clientSocket.close(); 30 } 31 } 32 33 } 34 public static void process(Socket clientSocket) throws Exception{ 35 System.out.println("client socket鏈接:"+clientSocket.getRemoteSocketAddress()); 36 //輸入流 37 InputStream in = clientSocket.getInputStream(); 38 InputStreamReader isr = new InputStreamReader(in); 39 BufferedReader br = new BufferedReader(isr); 40 //輸出流 41 OutputStream out = clientSocket.getOutputStream(); 42 OutputStreamWriter osw = new OutputStreamWriter(out); 43 // BufferedWriter bw = new BufferedWriter(osw); 44 PrintWriter pw = new PrintWriter(out,true); 45 String line = null; 46 while ((line = br.readLine()) != null){ 47 System.out.println("客戶輸入信息爲:" + line); 48 //在控制檯輸入信息 49 System.out.println("請輸入返回客戶信息:"); 50 Scanner scan = new Scanner(System.in); 51 String messToClient = scan.nextLine(); 52 //發送到客戶端 53 pw.println("welcome from server..."+messToClient+"end..."); 54 System.err.println("server end..."); 55 pw.flush(); 56 } 57 58 59 60 61 62 } 63 64 65 66 }
3、SocketTest客戶端和SocketServerblog
1.SocketTest
SocketTest V3.0.0 客戶端下載地址:http://sockettest.sourceforge.net/
SocketTest做爲客戶端測試工具,能夠不用寫客戶端代碼,直接鏈接服務端SocketServer
在IP Address中輸入訪問服務的IP地址,若訪問本機,則輸入:127.0.0.1(服務器套接字將會監聽本地機器。)
而後點擊connect,鏈接服務器。
鏈接成功後,在Message輸入信息,點擊send,發送到服務器。而後能夠在conversation with host 查看返回的結果 。
因此 能夠藉助SocketTest來實現客戶端和服務端交互,測試服務端代碼是否正確。
2.SocketServer
SocketServer構造方法的重載形式有如下幾種:
◆ServerSocket()throws IOException
◆ServerSocket(int port) throws IOException
◆ServerSocket(int port, int backlog) throws IOException
◆ServerSocket(int port, int backlog, InetAddress bindAddr) throws IOException //對於這個構造方法,綁定地址必須是java.net.InetAddress的一個實例
如:new ServerSocket(8080, 1, InetAddress.getByName("127.0.0.1"));
其中,參數:port爲:服務器要綁定的端口(服務器要監聽的端口),
backlog爲:這是服務器套接字開始拒絕傳入的請求以前,傳入的鏈接請求的最大隊列長度
bindAddr爲:服務器要綁定的IP地址。
你須要指定IP地址和服務器套接字將要進行監聽的端口號。一般,IP地址將會是127.0.0.1,也就是說,服務器套接字將會監聽本地機器。