Java Socket套接字
阿新 • • 發佈:2018-12-07
1. Socket
Socket主要用來收發伺服器資料。
-
主要方法
socket.getInputStream() // 接收伺服器輸入 socket.getOutputStream() // 傳送伺服器輸出 socket.getInetAddress() // 伺服器地址 socket.getPort() // 伺服器埠號 socket.getLocalAddress() // 本地地址 socket.getLocalPort() // 本地埠號 socket.shutdownInput() // 半關閉輸入 socket.shutdownOutput() // 半關閉輸出
-
Socket 的選項
- TCP_NODELAY,是否使用Nagle演算法。對應方法
setTcpNoDelay(boolean)
設定為true表示立即傳送資料包。 - SO_TIMEOUT,指定系統等待的時間。對應方法
setSoTimeout(int)
設定0為一直等待,為預設值。 - SO_LINGER,指定Socket關閉後如何處理尚未傳送的資料包。對應方法
setSoLinger(boolean, int)
設定為true時,close()
方法會被阻塞指定的秒數,等待發送資料和接受確認。 - SO_SNDBUF,設定傳送快取區大小。對應方法
setSendBufferSize(int)
- SO_RCV_BUF,設定接收快取區大小。對應方法
setReceiveBufferSize(int)
。 - SO_KEEPALIVE,設定是否與伺服器保持連線。對應方法
setKeepAlive(boolean)
。 - OOBINLINE,傳送單位元組緊急資料。socket.setOOBInline(boolean),socket.sendUrgentData(int)。
- SO_REUSEADDR,是否允許重用Socket所繫結的本地地址。對應方法
setReuseAddress(boolean)
。 - IP_TOS,設定不同效能要求。對應方法
setTrafficClass(int)
- TCP_NODELAY,是否使用Nagle演算法。對應方法
2. Socket進行TCP通訊
-
服務端
int TCP_SERVER_PORT = 1234; // 建立一個ServerSocket物件 ServerSocket serverSocket = null; try { serverSocket = new ServerSocket(TCP_SERVER_PORT); // 監聽連線請求 Socket socket = serverSocket.accept(); // 獲取輸入流 BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); // 獲取輸出流 BufferedWriter out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); // 讀取接收資訊,轉換為字串 String incomingMsg = in.readLine(); System.out.println(incomingMsg); String outgoingMsg = "receive data from port " + TCP_SERVER_PORT + System.getProperty("line.separator"); out.write(outgoingMsg); out.flush(); socket.close(); } catch (Exception e) { e.printStackTrace(); } finally { if (serverSocket != null) { try { serverSocket.close(); } catch (IOException e) { } } }
-
客戶端
String serverIp = "127.0.0.1"; int TCP_SERVER_PORT = 1234; try { Socket socket = new Socket(serverIp, TCP_SERVER_PORT); // 獲取輸入流 BufferedReader in = new BufferedReader(new InputStreamReader( socket.getInputStream())); // 生成輸出流 BufferedWriter out = new BufferedWriter(new OutputStreamWriter( socket.getOutputStream())); String outMsg = "Socket TCP connecting to " + TCP_SERVER_PORT + System.getProperty("line.separator"); out.write(outMsg); out.flush(); String inMsg = in.readLine(); System.out.println(inMsg); // 關閉連線 socket.close(); } catch (Exception e) { e.printStackTrace(); }
3. Socket進行UDP通訊
-
服務端
int UDP_SERVER_PORT = 1234; int MAX_LEN = 1024; byte[] buffer = new byte[MAX_LEN]; DatagramPacket dp = new DatagramPacket(buffer, MAX_LEN); // 新建一個DatagramSocket類 DatagramSocket ds = null; try { // UDP伺服器監聽的埠 ds = new DatagramSocket(UDP_SERVER_PORT); // 準備接收資料 ds.receive(dp); System.out.println(new String(dp.getData(), 0, dp.getLength())); } catch (Exception e) { e.printStackTrace(); } finally { if (ds != null) { ds.close(); } }
-
客戶端
String serverIp = "127.0.0.1"; int UDP_SERVER_PORT = 1234; byte[] buffer = ("data from UDP client " + UDP_SERVER_PORT).getBytes(); //新建一個DatagramSocket物件 DatagramSocket ds = null; try { ds = new DatagramSocket(); //初始化InetAddress物件 InetAddress serverAddr = InetAddress.getByName(serverIp); //初始化DatagramPacket物件 DatagramPacket dp = new DatagramPacket(buffer, buffer.length, serverAddr, UDP_SERVER_PORT); ds.send(dp); } catch (Exception e) { e.printStackTrace(); } finally { if (ds != null) { ds.close(); } }