URL網絡編程,最大的特征就是一對一的響應!
1:客戶端“寫”,服務器端用於“讀”
1 package coreBookSocket2; 2 3 import java.io.InputStreamReader; 4 import java.io.Reader; 5 import java.net.ServerSocket; 6 import java.net.Socket; 7 8 /* 9 * 這邊為服務器端的讀取 10 */ 11 12 /* 13 * 1:首先建立一個ServerSocket監聽在端口8888上面,服務器端只需要定義和客戶端相同的端口號即可 14 * 2:服務器端嘗試接受來自客戶端的請求 15 * 3:和客戶端連接好了之后,就可以讀取來自客戶端的輸入信息 16 * 4:定義一個StringBuilder對象用來保存來自客戶端的信息 17 * 5:關閉Reader,client,server等占用資源的對象 18 */ 19 public class clientWtiteserverOpen { 20 21 public static void main(String[] args) throws Exception{ 22 ServerSocket server=new ServerSocket(8888); 23 Socket client =server.accept(); 24 Reader reader=new InputStreamReader(client.getInputStream()); //客戶端獲取自己的輸入流 25 char[] ch=new char[64]; 26 int len; 27 StringBuilder sb=new StringBuilder(); 28 while( ( len=reader.read(ch) )!=-1) 29 { 30 sb.append(ch, 0, len); 31 } 32 System.out.println("From Client:"+sb); 33 reader.close(); 34 client.close(); 35 server.close(); 36 } 37 }
1 package coreBookSocket2; 2 3 import java.io.IOException; 4 import java.io.OutputStreamWriter; 5 import java.io.Writer; 6 import java.net.Socket; 7 import java.net.UnknownHostException; 8 /* 9 * 這邊為客戶端的寫出 10 */ 11 12 /* 13 * 1:首先建立一個客戶端的監聽端口和IP地址,用相同的端口號與服務器端建立連接 14 * 2:從客戶端向服務器端寫出數據 15 */ 16 public class clientWriteserverOpen2 { 17 public static void main(String[] args) throws UnknownHostException, IOException { 18 19 Socket client=new Socket("127.0.0.1", 8888); 20 Writer writer=new OutputStreamWriter(client.getOutputStream()); 21 writer.write("Hello server"); 22 writer.flush(); 23 writer.close(); 24 client.close(); 25 26 } 27 28 }
2:客戶端先寫后讀,服務器端先讀后寫
服務器端:
1 package ClientAndServerWriteBoth; 2 3 import java.io.IOException; 4 import java.io.InputStreamReader; 5 import java.io.OutputStreamWriter; 6 import java.io.Reader; 7 import java.io.Writer; 8 import java.net.ServerSocket; 9 import java.net.Socket; 10 11 /* 12 * 服務器端的編寫 13 * 服務器端是先讀后寫,那么客戶端必定是先寫后讀 14 */ 15 16 public class server { 17 public static void main(String[] args) throws IOException { 18 19 ServerSocket server=new ServerSocket(6666); 20 Socket client=server.accept(); 21 22 Reader reader=new InputStreamReader(client.getInputStream()); 23 char[] ch=new char[20]; 24 int len; 25 StringBuilder sb=new StringBuilder(); 26 String temp; 27 int index; 28 29 while(( len=reader.read(ch)) !=-1) 30 { 31 temp=new String(ch, 0, len); 32 if( (index = temp.indexOf("eof")) != -1)//遇到eof時就結束接收, 這個地方沒有怎么看明白?為什么到eof就結束? 33 { 34 sb.append(temp.substring(0, index)); 35 break; 36 } 37 sb.append(temp); 38 } 39 System.out.println("---From Client: "+sb); 40 41 Writer writer=new OutputStreamWriter(client.getOutputStream()); 42 writer.write("Hello Client I'm server! "); 43 writer.flush(); 44 writer.close(); 45 reader.close(); 46 client.close(); 47 server.close(); 48 } 49 }
客戶端:
1 package ClientAndServerWriteBoth; 2 3 import java.io.IOException; 4 import java.io.InputStreamReader; 5 import java.io.OutputStreamWriter; 6 import java.io.Reader; 7 import java.io.Writer; 8 import java.net.Socket; 9 import java.net.UnknownHostException; 10 11 /* 12 * 客戶端的編寫,客戶端先寫后讀 13 * 1:客戶端設定特定的端口號與服務器端連接 14 */ 15 16 public class client { 17 public static void main(String[] args) throws UnknownHostException, IOException { 18 19 Socket client=new Socket("127.0.0.1", 6666); 20 Writer writer=new OutputStreamWriter(client.getOutputStream()); 21 writer.write("Hello server, I'm your father,client! 哈哈哈哈哈"); 22 writer.flush(); 23 //寫完了開始讀 24 25 Reader reader=new InputStreamReader(client.getInputStream()); 26 char[] ch=new char[20]; 27 int len; 28 StringBuffer sb=new StringBuffer(); 29 String temp; 30 int index; 31 32 while( (len=reader.read(ch))!=-1) 33 { 34 temp=new String(ch, 0, len); 35 if(( index=temp.indexOf("eof"))!=-1) 36 { 37 sb.append(temp.substring(0, index)); 38 break; 39 } 40 sb.append(new String(ch, 0, len)); 41 } 42 System.out.println("---From Server: "+sb); 43 writer.close(); 44 reader.close(); 45 client.close(); 46 } 47 }
3:一個服務器端,對應多個客戶端的連接
一個服務器端和多個客戶端連接最好的方式就是用線程,因為服務器端接受客戶端的連接的accept()方法是阻塞式的。
服務器端:
1 package oneServerForLotsClient; 2 3 import java.io.IOException; 4 import java.io.InputStreamReader; 5 import java.io.OutputStreamWriter; 6 import java.io.Reader; 7 import java.io.Writer; 8 import java.net.ServerSocket; 9 import java.net.Socket; 10 /* 11 * 這邊主要是服務器的demo的編寫 12 * 1:仍然是准備工作,讓服務器端和客戶端之間建立相同的端口號,實現連接。 13 * 2:----因為客戶端那邊是多個對象連接服務器端,因此需要一個死循環讓服務器一直接受連接客戶端的連接請求!!! 14 * 建立一個新的線程去處理客戶端的請求 15 *3:服務器端首先是“讀取” 客戶端發送過來的信息 16 */ 17 18 public class Server 19 { 20 public static void main(String[] args) throws IOException 21 { 22 23 ServerSocket server=new ServerSocket(6868); 24 while(true) 25 { 26 Socket client=server.accept(); 27 new Thread(new Task(client) ).start(); 28 } 29 } 30 }
1 package oneServerForLotsClient; 2 3 import java.io.BufferedReader; 4 import java.io.IOException; 5 import java.io.InputStreamReader; 6 import java.io.OutputStreamWriter; 7 import java.io.Writer; 8 import java.net.Socket; 9 /* 10 * 這個類主要是用來處理新的線程,實現Runnable接口 11 * 1:首先定一個構造方法,主要是為了初始化client對象 12 * 2:同時重寫run()方法,這個方法主要開啟新的方法用於 “ 讀” 數據,和 “寫” 數據的處理 13 */ 14 15 public class Task implements Runnable { 16 17 private Socket client; 18 19 public Task(Socket client) 20 { 21 this.client=client; 22 } 23 24 @Override 25 public void run() { 26 try { 27 handlerSocket(); 28 } catch (IOException e) { 29 e.printStackTrace(); 30 } 31 } 32 33 private void handlerSocket() throws IOException { 34 BufferedReader br = new BufferedReader(new InputStreamReader(client.getInputStream())); 35 StringBuilder sb = new StringBuilder(); 36 String temp; 37 int index; 38 while ((temp=br.readLine()) != null) { 39 System.out.println(temp); 40 if ((index = temp.indexOf("eof")) != -1) {//遇到eof時就結束接收 41 sb.append(temp.substring(0, index)); 42 break; 43 } 44 sb.append(temp); 45 } 46 System.out.println("from client: " + sb); 47 //讀完后寫一句 48 Writer writer = new OutputStreamWriter(client.getOutputStream()); 49 writer.write("Hello Client."); 50 writer.write("eof\n"); 51 writer.flush(); 52 writer.close(); 53 br.close(); 54 client.close(); 55 56 } 57 58 }
客戶端
1 package oneServerForLotsClient; 2 3 import java.io.BufferedReader; 4 import java.io.IOException; 5 import java.io.InputStreamReader; 6 import java.io.OutputStreamWriter; 7 import java.io.Writer; 8 import java.net.Socket; 9 import java.net.UnknownHostException; 10 11 public class Client { 12 public static void main(String[] args) throws UnknownHostException, IOException { 13 14 Socket client=new Socket("127.0.0.1", 6868); 15 16 Writer writer=new OutputStreamWriter(client.getOutputStream()); 17 writer.write("Hello,Server. My name is client! "); 18 writer.write("eof\n"); 19 writer.flush(); 20 21 22 //寫完了就開始讀 23 24 BufferedReader reader=new BufferedReader(new InputStreamReader(client.getInputStream())); 25 StringBuffer buffer=new StringBuffer(); 26 String temp; 27 int index; 28 while ((temp=reader.readLine()) != null) { 29 if ((index = temp.indexOf("eof")) != -1) { 30 buffer.append(temp.substring(0, index)); 31 break; 32 } 33 buffer.append(temp); 34 } 35 System.out.println("from server: " + buffer); 36 writer.close(); 37 reader.close(); 38 client.close(); 39 40 } 41 42 }