socket客戶端和服務端通訊

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,也就是說,服務器套接字將會監聽本地機器。

 

 

 

 

相關文章
相關標籤/搜索