目錄
簡介
Java中Socket通訊簡介
單線程一對一伺服器1——>1用戶端
單線程一對一伺服器1<——>1用戶端
多線程一對多伺服器1<——>N用戶端【非聊天室的伺服器通過使用者輸入發送資料】
多線程一對多伺服器1<——>N用戶端【聊天室】
多線程最終伺服器和用戶端整合一體【swing程式】
Java中Tcp協議Socket通訊測試步驟:
【單線程】一對一伺服器1——>1用戶端
介紹:當用戶端串連後,伺服器會發送訊息到用戶端。用戶端收到伺服器發送來的訊息,並輸出。 代碼如下:用戶端和伺服器端都在本機上測試。 伺服器
package com17;import java.io.IOException;import java.io.PrintStream;import java.net.ServerSocket;import java.net.Socket;public class Server { public static void main(String[] args) { //建立月hi個ServerSocket,用於監聽用戶端Socket的串連請求 try { ServerSocket ss=new ServerSocket(30000); //採用死迴圈不斷接受來自用戶端的請求 while(true) { //每當接受到用戶端socket的請求,服務端也對應產生一個socket Socket s=ss.accept(); System.out.println("IP為"+s.getInetAddress()+"串連此伺服器"); //將Socket對應的輸出資料流封裝成PrintStream PrintStream ps=new PrintStream(s.getOutputStream()); //進行普通的io操作 ps.println("用戶端您好,我是伺服器。"); ps.close(); s.close(); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } }}
用戶端:
package com17;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.net.Socket;public class Client { public static void main(String[] args) { try { Socket socket=new Socket("127.0.0.1",30000); //將socket對應的輸入資料流封裝成BufferedReader BufferedReader br=new BufferedReader( new InputStreamReader(socket.getInputStream())); //進行普通的io操作 String line=br.readLine(); System.out.println("來自伺服器的資料::"+line); br.close(); socket.close(); } catch(IOException e) { e.printStackTrace(); } }}
效果如下:
【單線程】一對一伺服器1<——>1用戶端
介紹:伺服器和用戶端分別接受對方發送的資訊,然後再發送資料到對方。 若是發送已經編譯好的資料,則這塊是很簡單的。 在第一個demo的基礎上,修改伺服器端的main方法: 伺服器端:
while( true) { //每當接受到用戶端socket的請求,服務端也對應產生一個socket Socket s=ss.accept(); System. out.println( "IP為"+s.getInetAddress()+ "串連此伺服器" ); //接受用戶端發送的資料 BufferedReader br= new BufferedReader( new InputStreamReader(s.getInputStream())); System. out.println( "來自用戶端的資料:" +br.readLine()); //將Socket對應的輸出資料流封裝成PrintStream PrintStream ps= new PrintStream(s.getOutputStream()); //進行普通的 io操作 ps.println( "用戶端您好,我是伺服器。" ); ps.close(); br.close(); s.close(); }
用戶端:
try { Socket socket=new Socket("127.0.0.1",30000); //發送資料 PrintStream ps= new PrintStream(socket.getOutputStream()); ps.println( "您好,我是用戶端" ); //將socket對應的輸入資料流封裝成BufferedReader BufferedReader br= new BufferedReader( new InputStreamReader(socket.getInputStream())); //進行普通的io操作 String line=br.readLine(); System. out.println( "來自伺服器的資料::" +line); br.close(); ps.close(); socket.close(); }效果如下: 注意:伺服器和用戶端互相發送的資料都是已經編譯好的。但是通常情況下,我們發送資料,都是想發什麼就發什麼,所以呢,應該通過鍵盤輸入來發送資料。 但是通過鍵盤輸入,需要監聽使用者鍵盤輸入。這個鍵盤輸入會有一定的問題。 比如用戶端發送資料如下:還是在上述demo的Client端基礎上:
//擷取該socket對應的輸出資料流 PrintStream ps= new PrintStream(s.getOutputStream()); String line= null; //不斷讀取鍵盤的輸入 BufferedReader br= new BufferedReader( new InputStreamReader(System.in)); while((line=br.readLine())!= null) { //將使用者的鍵盤輸入內容寫入socket對應的輸出資料流 ps.println(line); }
請注意看system.in這個方法,則程式一直在死迴圈中,則無法執行下面的接受伺服器方法。 也許你說,那直接在迴圈中,發送完畢後,直接接受。 但是這種辦法,就會造成,你在dos視窗中只能發一條語句,然後,等待接受。 那該怎麼辦呢?我想發送資料和我的接受資料不相關分離,並不是硬生生滴綁定在一塊。