對于Java Socket程式設計而言,有兩個概念,一個是ServerSocket,一個是Socket。服務端和用戶端之間通過Socket建立連接配接,之後它們就可以進行通信了。首先ServerSocket将在服務端監聽某個端口,當發現用戶端有Socket來試圖連接配接它時,它會accept該Socket的連接配接請求,同時在服務端建立一個對應的Socket與之進行通信。這樣就有兩個Socket了,用戶端和服務端各一個。
服務端代碼
Java代碼 public class Server {
public static void main(String args[]) throws IOException {
//為了簡單起見,所有的異常資訊都往外抛
int port = 8899;
//定義一個ServerSocket監聽在端口8899上
ServerSocket server = new ServerSocket(port);
//server嘗試接收其他Socket的連接配接請求,server的accept方法是阻塞式的
Socket socket = server.accept();
//跟用戶端建立好連接配接之後,我們就可以擷取socket的InputStream,并從中讀取用戶端發過來的資訊了。
Reader reader = new InputStreamReader(socket.getInputStream());
char chars[] = new char[64];
int len;
StringBuilder sb = new StringBuilder();
while ((len=reader.read(chars)) != -1) {
sb.append(new String(chars, 0, len));
}
System.out.println("from client: " + sb);
reader.close();
socket.close();
server.close();
}
}
服務端從Socket的InputStream中讀取資料的操作也是阻塞式的,如果從輸入流中沒有讀取到資料程式會一直在那裡不動,直到用戶端往Socket的輸出流中寫入了資料,或關閉了Socket的輸出流。當然,對于用戶端的Socket也是同樣如此。在操作完以後,整個程式結束前記得關閉對應的資源,即關閉對應的IO流和Socket。
用戶端代碼
Java代碼
public class Client {
public static void main(String args[]) throws Exception {
//為了簡單起見,所有的異常都直接往外抛
String host = "127.0.0.1"; //要連接配接的服務端IP位址
int port = 8899; //要連接配接的服務端對應的監聽端口
//與服務端建立連接配接
Socket client = new Socket(host, port);
//建立連接配接後就可以往服務端寫資料了
Writer writer = new OutputStreamWriter(client.getOutputStream());
writer.write("Hello Server.");
writer.flush();//寫完後要記得flush
writer.close();
client.close();
對于用戶端往Socket的輸出流裡面寫資料傳遞給服務端要注意一點,如果寫操作之後程式不是對應着輸出流的關閉,而是進行其他阻塞式的操作(比如從輸入流裡面讀資料),記住要flush一下,隻有這樣服務端才能收到用戶端發送的資料,否則可能會引起兩邊無限的互相等待。在稍後講到用戶端和服務端同時讀和寫的時候會說到這個問題。
本文轉自楊海龍的部落格部落格51CTO部落格,原文連結http://blog.51cto.com/7218743/1529869如需轉載請自行聯系原作者
IT達仁