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