-
public class ServerSocket
- extends Object
此類實現服務器套接字。服務器套接字等待請求通過網絡傳入。它基于該請求執行某些操作,然后可能向請求者返回結果。
服務器套接字的實際工作由 SocketImpl
類的實例執行。應用程序可以更改創建套接字實現的套接字工廠來配置它自身,從而創建適合本地防火墻的套接字。
-
public class Socket
- extends Object
此類實現客戶端套接字(也可以就叫“套接字”)。套接字是兩臺機器之間的通信端點。
套接字的實際工作由 SocketImpl
類的實例執行。應用程序通過更改創建套接字實現的套接字工廠可以配置它自身,以創建適合本地防火墻的套接字。
/**
* 為了驗證我們的服務器程序能否正常工作,還必須有一個客戶端程序與之通信。
* 我們也沒必要每次都要編寫客戶端程序來測試。其實, Windows提供的telnet
* 程序,就是一個TCP客戶端程序,我們只要使用telnet程序對我們的服務器程序
* 進行測試,我們只要在運行telnet程序時指定所要連接的服務器程序的IP地址
* 和端口號,telnet程序就會按照指定的參數去與服務器程序進行連接。建立連接
* 后,在telnet程序窗口中鍵入的內容會發送到服務器,從服務器端接收到的數據
* 會顯示在窗口中。
* 先運行TcpServer程序,然后在命令行中輸入 telnet 10.214.16.80 8001
* 就會執行
*/
// TCP 服務端程序
public class TcpServer {
public static void main(String[] args){
try{
//建立一個在8001端口上等待連接的ServerSocket對象
ServerSocket ss = new ServerSocket(8001);
//偵聽并接受到此套接字的連接。此方法在進行連接之前一直阻塞,返回客戶端套接字
Socket s = ss.accept();
InputStream ips = s.getInputStream();//返回此套接字的輸入流
OutputStream ops = s.getOutputStream();//返回此套接字的輸出流
//將字節從指定的字節數組寫入此輸出流
ops.write("chenweicai...".getBytes());
// byte[] buf = new byte[1024];
// // 從輸入流中讀取一定數量的字節并將其存儲在緩沖區數組buf中
// int len = ips.read(buf);
// System.out.println(new String(buf, 0, len));
//由于telent只要輸入就發送,而不管有沒有回車,所以只有第一個字符被發送。
//java提供了一個BufferedReader類,可以幫助我們按行處理輸入流。
BufferedReader br = new BufferedReader (new InputStreamReader(ips));
System.out.println("The message comes form client: " + br.readLine());//輸出客戶端輸入的內容
br.close();//關閉包裝類,會自動關閉包裝類中所包裝的底層類,所以不用調用ips.close().
// ips.close();
ops.close();
s.close();
ss.close();
}catch (Exception e){
e.printStackTrace();
}
}
}
給個具體的例子
/**
* 實現服務器和客戶端之間的對話功能
*/
public class Servicer implements Runnable {
Socket s;
public Servicer (Socket s){
this.s = s;
}
public void run(){
try {
InputStream ips = s.getInputStream();
OutputStream ops = s.getOutputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(ips));
DataOutputStream dos = new DataOutputStream(ops);
while(true){
String strWord = br.readLine();
System.out.println("From Client StrWord: " + strWord + strWord.length());
if(strWord.equalsIgnoreCase("quit"))
break;
String strEcho = (new StringBuffer(strWord).reverse()).toString();
dos.writeBytes(strWord + "---->" + strEcho + System.getProperty("line.separator"));
}
br.close();
dos.close();
s.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
import java.net.ServerSocket;
import java.net.Socket;
public class TcpServer {
public static void main(String[] args){
try{
ServerSocket ss = new ServerSocket(8001);
while(true){
Socket s = ss.accept();
new Thread(new Servicer(s)).start();
}
}catch(Exception e){
}
}
}
public class TcpClient {
public static void main(String[] args){
try{
if(args.length < 2){
System.out.println("Usage: java TcpClient ServerIP ServerPort");
return;
}
Socket s = new Socket(InetAddress.getByName(args[0]), Integer.parseInt(args[1]));
InputStream ips = s.getInputStream();
OutputStream ops = s.getOutputStream();
BufferedReader brKey = new BufferedReader(new InputStreamReader(System.in));
DataOutputStream dos = new DataOutputStream(ops);
BufferedReader brNet = new BufferedReader(new InputStreamReader(ips));
while(true){
String strWord = brKey.readLine();
dos.writeBytes(strWord + System.getProperty("ling.separator"));
if(strWord.equalsIgnoreCase("quit"))
break;
else
System.out.println(brNet.readLine());
}
dos.close();
brNet.close();
brKey.close();
s.close();
}catch (Exception e){
}
}
}