from: http://android.yaohuiji.com/archives/3668
第二十一講:網絡編程(一)
本講內容: socket 只會裝傻的”智能“機器人
套接字(socket)是代表計算機之間網絡連接的對象。要進行計算機間的網絡通訊,建立TCP連接,那麼就需要Socket編程,Java提供了ServerSocket類和Socket類,可以利用他們很方便的實現,計算機間的網絡通訊。
因爲Java把數據的傳輸已經抽象成InputStream和OutputStream的輸入輸出流,那麼對網絡通訊來說,其實就是利用ServerSocket類和Socket類建立起來網絡連接,進行字節流或者字符流的輸入輸出操作。
下面我們還是通過一個例子來學習Socket編程:只會裝傻的”智能“機器人
直接上代碼,服務器端 TalkServer.java :
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class TalkServer {
public static void main(String[] args) throws IOException {
// 創建一個ServerSocket
ServerSocket server = new ServerSocket(8080);
// 準備接受客戶連接,如果有客戶連接到,則創建一個socket對象,如果沒有客戶連接到,
// 那麼該程序會停在本行一直等待,像是在睡眠或者假死,這種行爲叫做“阻塞”,
// 阻塞是網絡通信中的術語,就是你等別人響應,如果必須等到,等不到就一直等,
// 就是阻塞,等不到也繼續向前走的當然就是非阻塞。
Socket socket = server.accept();
// 從socket中獲取一個輸入對象,以便接受從網絡上來的數據
BufferedReader socketInput = new BufferedReader(newInputStreamReader(socket.getInputStream()));
// 從標準輸入中獲取一個輸入對象,以便接受從鍵盤上傳來的數據,如果想讓服務器端和客戶端自由對話的話可以用此對象
//BufferedReader keyboardInput = new BufferedReader(new InputStreamReader(System.in));
// 從socket中獲取一個
PrintWriter socketOutput = new PrintWriter(socket.getOutputStream(),true);
//定義一些變量
String input;
// 一直執行,直到客戶端表示要斷開
while(true){
//從客戶端獲取用戶輸入的字符串
input = socketInput.readLine();
//發送到屏幕
System.out.print("客戶:");
System.out.println(input);
//準備好回覆語句
String reply= reply(input);
//發送到客戶端
socketOutput.println(reply);
//發送到屏幕
System.out.print("小瑤瑤:");
System.out.println(reply);
//客戶如果輸入的是再見則退出循環
if(input.equals("再見")){
break;
}
}
//關閉釋放資源
socketInput.close();
socketOutput.close();
socket.close();
}
//回覆方法
private static String reply(String input) {
String output=replys[number%7];
if(number%7==5){
output = output+" "+input;
}
number++;
return output;
}
//回覆方法用到的一些變量
static int number =0;
static String[] replys = new String[7];
static{
replys[0]= "你說的啥,我聽不見?";
replys[1]= "聲音再大點行不?";
replys[2]= "聲音再大點一點點行不?";
replys[3]= "還是聽不清……";
replys[4]= "看來是網絡的問題,你要不說慢點?";
replys[5]= "聽到了!聽到了!你說的是:";
replys[6]= "完了,又聽不清了……";
}
}
客戶端代碼 TalkClient.java :
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
public class TalkClient {
public static void main(String[] args) throws UnknownHostException, IOException {
Socket socket = new Socket("127.0.0.1",8080);
// 從socket中獲取一個輸入對象,以便接受從網絡上來的數據
BufferedReader socketInput = new BufferedReader(newInputStreamReader(socket.getInputStream()));
// 從標準輸入中獲取一個輸入對象,以便接受從鍵盤上傳來的數據
BufferedReader keyboardInput = new BufferedReader(newInputStreamReader(System.in));
// 從socket中獲取一個
PrintWriter socketOutput = new PrintWriter(socket.getOutputStream(),true);
// 定義一些變量
String input;
// 一直執行
while(true){
//從鍵盤獲取數據,通過socket對象發送出去
input = keyboardInput.readLine();
socketOutput.println(input);
//接收從socket中獲取的服務器端發回的迴應信息,併發送到屏幕上
input = socketInput.readLine();
System.out.println(input);
}
}
}
編譯兩個文件,先運行TalkServer,開始接收客戶端的連接,然後運行客戶端,在客戶端上打字,服務器端會有迴應,運行截圖如下,這裏上一個服務器端的截圖:
好了,本將就到這裏。