java socket 之 Stream Socket(TCP/IP)

Stream Socket

一  總述

Stream Socket與Datagram Socket不同,它有一個永久性的鏈接,可以確保數據可靠的發送到對方。但是Stream Socket所佔的資源更多。

Java主要通過Socket及ServerSocket來實現Stream Socket,一個用於客戶端,另一個用戶服務器端。

 

二  Socket類

Socket類的幾個重要方法如下:

(1) Socket(String host, int port)

(2) Socket(InetAddress address, int port)

(3) synchronized void close()

(4) InputStream getInputStream()

(5) OutputStream getOutputStream()

可以看出Stream Socket中的Socket與Datagram Socket中的Socket的區別:

(1) 在構造函數中,這裏需要指定服務器的地址與端口,用於它發送數據之前建立鏈接,而Datagram的Socket不需要建立鏈接,它僅需要在要發送的數據包中包含地址信息即可;

(2) Stream Socket的兩個重要方法和其它流的方法類似,而且在操作上也相似,其實在操作Stream Socket時,只要建立了鏈接,那麼以後的操作和流的操作一樣了,你可以忘了你在操作Socket,只當做自己在操作普通的流。

 

三  ServerSocket類

ServerSocket有以下幾個重要的方法:

(1) ServerSocket(int port):監聽指定端口,監聽時間爲默認值50;

(2) ServerSocket(int port, int count):監聽指定端口,並指定監聽時間;

(3) ServerSocket(int port, int backlog, InetAddress bindAddr):只接收指定接口發過來的數據;

(4) Socket accept():accpet方法會返回一個Socket對象,使用該Socket對象的getInputStream及getOutputStream方法獲取輸入及輸出流。由此可見無論是服務器端還是客戶端,它們都是通過Socket對象來收發數據的。程序執行到accpet時會進入監聽狀態,不再向下執行一直到接收到數據。

(5) void close()

 

四  實例

以下是關於Stream Socket的一個例子,在這個例子中使用單獨的二個類Receiver和Sender負責對指定的輸入及輸出流進行操作,用另一個類SocketPerformer來創建Receiver和Sender這兩個類的實例,並傳入指定的輸入及輸出流,而在Client及Server這兩個類中,負責創建SocketPerformer對象,並傳入指定的Socket。因此這五個類在功能上分爲三層,第一層負責對流進行操作,第二層負責創建指定的Socket流,並這些Socket流傳到第一層,第三層負責創建Socket並將這些Socket傳到第二層。


Sender類:

package socketChat;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;

public class Sender extends Thread {

 PrintWriter writer;

 public Sender(PrintWriter theWriter) {

  writer = theWriter;

 }

 public void run() {

  try {

   while (true) {

    BufferedReader consoleReader = new BufferedReader(

      new InputStreamReader(System.in));

    String userInput = consoleReader.readLine();

    writer.write(userInput + "\r\n");

    writer.flush(); // send the data in buffer immediately

   }

  } catch (Exception e) {

   e.printStackTrace();

   return;

  }
 }
}


Receiver類:

package socketChat;

import java.io.BufferedReader;

public class Receiver extends Thread {

 BufferedReader reader;

 public Receiver(BufferedReader theSocketReader) {

  reader = theSocketReader;

 }

 public void run() {

  while (true) {

   try {

    String words = reader.readLine();
    System.out.println("\r\nRecieved: " + words);

   } catch (Exception e) {

    e.printStackTrace();

    return;

   }
  }
 }

}


SocketPerformer類:

package socketChat;

import java.io.BufferedReader;

import java.io.InputStreamReader;

import java.io.PrintWriter;

import java.net.Socket;

public class SocketPerformer {

 Socket socket;

 public SocketPerformer(Socket theSoc){

  socket = theSoc;

 }

 public void execut() throws Exception{

  BufferedReader socketReader = new BufferedReader(
    new InputStreamReader( socket.getInputStream()));

  PrintWriter socketWriter = new PrintWriter(socket.getOutputStream());

  System.out.println("connection built !");

  Receiver rec = new Receiver(socketReader);

  rec.start();

  Sender sender = new Sender(socketWriter);

  sender.start();
 
 }

}


Client類:

package socketChat;

import java.net.Socket;

public class Client {

 public static void main(String[] args) throws Exception {

  String ip = "127.0.0.1";

  int port = 30000;

  System.out.println("connecting to server: " + ip
    + " at port: " + port + " ...");

  Socket soc = new Socket(ip, port);

  new SocketPerformer(soc).execut();

 }

}


Server類:

package socketChat;


import java.net.ServerSocket;

import java.net.Socket;

public class Server {

 public static void main(String[] args) throws Exception {

  ServerSocket server = new ServerSocket(30000, 5);

  Socket socket = null;

  System.out.println("waiting incoming connection...");

  socket = server.accept();

  System.out.println("a connection built!");

  System.out.println("the peer ip is: " + socket.getInetAddress().getHostAddress());

  new SocketPerformer(socket).execut();

  server.close();

 }

}

 

本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/sunny3106/archive/2007/06/04/1637034.aspx

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章