JAVA网络编程之Socket
Socket網絡編成是一種較為底層的網絡數據傳輸,很多語言都支持。
本例是根據菜鳥教程中的Java網絡編程而寫。
詳細內容參考請參考:http://www.runoob.com/java/java-networking.html
?
Socket 編程
套接字使用TCP提供了兩臺計算機之間的通信機制。 客戶端程序創建一個套接字,并嘗試連接服務器的套接字。
當連接建立時,服務器會創建一個 Socket 對象。客戶端和服務器現在可以通過對 Socket 對象的寫入和讀取來進行通信。
java.net.Socket 類代表一個套接字,并且 java.net.ServerSocket 類為服務器程序提供了一種來監聽客戶端,并與他們建立連接的機制。
以下步驟在兩臺計算機之間使用套接字建立TCP連接時會出現:
-
服務器實例化一個 ServerSocket 對象,表示通過服務器上的端口通信。
-
服務器調用 ServerSocket 類的 accept() 方法,該方法將一直等待,直到客戶端連接到服務器上給定的端口。
-
服務器正在等待時,一個客戶端實例化一個 Socket 對象,指定服務器名稱和端口號來請求連接。
-
Socket 類的構造函數試圖將客戶端連接到指定的服務器和端口號。如果通信被建立,則在客戶端創建一個 Socket 對象能夠與服務器進行通信。
-
在服務器端,accept() 方法返回服務器上一個新的 socket 引用,該 socket 連接到客戶端的 socket。
連接建立后,通過使用 I/O 流在進行通信,每一個socket都有一個輸出流和一個輸入流,客戶端的輸出流連接到服務器端的輸入流,而客戶端的輸入流連接到服務器端的輸出流。
TCP 是一個雙向的通信協議,因此數據可以通過兩個數據流在同一時間發送.以下是一些類提供的一套完整的有用的方法來實現 socket。
客戶端代碼:
import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.Socket;public class Client {public static void main(String[] args) { String serverName = args[0]; int port = Integer.parseInt(args[1]);try {System.out.println("連接到主機:" + serverName + ",端口號:" + port);Socket clientSocket = new Socket(serverName, port);System.out.println("遠程主機地址為:" + clientSocket.getRemoteSocketAddress());// 創建客戶端輸出流,用于向服務器發送數據OutputStream outToServer = clientSocket.getOutputStream();// 將輸出流轉換為數據輸出流DataOutputStream out = new DataOutputStream(outToServer);// 采用數據輸出流的writeUTF()方法向服務器發送數據out.writeUTF("Hello from" + clientSocket.getLocalSocketAddress());// 創建客戶端輸入流,用于向接收來自服務的數據流InputStream inFromServer = clientSocket.getInputStream();// 將輸入流轉換為數據輸入流DataInputStream in = new DataInputStream(inFromServer);// 讀來自服務器的數據System.out.println("服務器響應:" + in.readUTF());// 關閉服務器套接字clientSocket.close();}catch(IOException e) {e.printStackTrace();} }服務器端代碼:
import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; import java.net.SocketTimeoutException;public class Server extends Thread{// Server類有一個私有的serverSocket對象引用,用于與客戶端鏈接private ServerSocket serverSocket;// 構造函數,初始化serverSocketpublic Server(int port) throws IOException{// 創建一個ServerSocket對象,綁定到本地port數值表示的端口serverSocket = new ServerSocket(port);// 設置服務器超時時間為10000毫秒serverSocket.setSoTimeout(10000);}// 主功能模塊public void run() {while(true) {try {System.out.println("等待遠程連接,端口號為:" + serverSocket.getLocalPort() + "...");// 等待客戶端連接Socket server = serverSocket.accept();// 執行到這時,客戶端已成功連接,打印客戶端socket地址System.out.println("遠程主機地址:" + server.getRemoteSocketAddress() );// 創建數據輸入流,接收來自客戶端的數據DataInputStream in = new DataInputStream(server.getInputStream());// 打印接受的數據System.out.println(in.readUTF());// 創建數據輸出流DataOutputStream out = new DataOutputStream(server.getOutputStream());// 通過數據輸出流,向客戶端的發送數據out.writeUTF("謝謝連接我:" + server.getLocalSocketAddress() + "\nGood bye!");server.close();}catch(SocketTimeoutException ste) {System.out.println("Socket timed out!");break;}catch(IOException ioe) {ioe.printStackTrace();break;}}}// 程序入口 public static void main(String[] args) {int port = Integer.parseInt(args[0]);try {Thread t = new Server(port);t.run();}catch(IOException ioe) {ioe.printStackTrace();}} }?
總結
以上是生活随笔為你收集整理的JAVA网络编程之Socket的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java操作数据库Sqlite样例代码
- 下一篇: 三种常见字符编码简介:ASCII、Uni