Java Socket編程 Tcp/Udp

*Socket套接字用於描述計算機ip地址和端口
 * 通信鏈的句柄,用戶各種計算機和虛擬機之間的
 * 通信,所有應用程序幾乎都用socket

我們先看Tcp通信範例:
服務端:
package review.socketTcpOrUdp;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class ServerTcp {

    publicstatic void main(String[] args) {
       try {
          ServerSocketserverSocket = new ServerSocket(9527);
          Socketsocket =serverSocket.accept();
         InputStreamReader inputStreamReader = newInputStreamReader(socket.getInputStream());
         BufferedReader bufferedReader = newBufferedReader(inputStreamReader);
         //將數據寫入socket通道並推出去
          PrintWriterprintWriter = new PrintWriter(socket.getOutputStream());
         while(true){
          StringclientStr = bufferedReader.readLine();
         printWriter.println("Server"+clientStr);
         printWriter.flush();
         if(clientStr.equals("exit")){
             break;
          }
          }
         serverSocket.close();
       } catch(IOException e) {
         e.printStackTrace();
       }

    }

}

客戶端:
package review.socketTcpOrUdp;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;

public class ClientTcp {

    publicstatic void main(String[] args) {
       try {
          SocketclientSocket = new Socket("127.0.0.1", 9527);
          //讀取控制檯輸入的數據
         InputStreamReader inputStreamReader = newInputStreamReader(System.in);
         BufferedReader bufferedReader = newBufferedReader(inputStreamReader);
          //將讀出來的程序寫入socket通道中
          OutputStreamoutputStream = clientSocket.getOutputStream();
          PrintWriterprintWriter = new PrintWriter(outputStream);
          //讀取來自服務端的數據迴應
         BufferedReader bufferedReaderServer = new BufferedReader(
                newInputStreamReader(clientSocket.getInputStream()));
         while(true){
          StringSystemStr = bufferedReader.readLine();
         printWriter.println(SystemStr);
         printWriter.flush();
         //打印服務器端迴應
          StringServerStr =bufferedReaderServer.readLine();
         System.out.println(ServerStr);
         if(SystemStr.equals("exit")){
             break;
          }
          }
         clientSocket.close();
       } catch(Exception e) {

       }

    }

}
再看udp:
服務端:

package review.socketTcpOrUdp;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

public class ServerUdp {

    publicstatic void main(String[] args) {
       try {
         DatagramSocket datagramSocket = new DatagramSocket(9578);
          while (true){
            DatagramPacket recieveDatagramPacket = new DatagramPacket(newbyte[1024], 1024);
            datagramSocket.receive(recieveDatagramPacket);
             StringclientUdpStr = new String(recieveDatagramPacket.getData());
            System.out.println(clientUdpStr);
             //發出數據包
            DatagramPacket sendDatagramPacket = new DatagramPacket("yes I canrecive".getBytes(),
                   "yes I canrecive".getBytes().length,recieveDatagramPacket.getAddress(),
                  recieveDatagramPacket.getPort());
            datagramSocket.send(sendDatagramPacket);
             if(clientUdpStr.trim().equals("exit")) {
                break;
             }
            //datagramSocket.close();
          }
         datagramSocket.close();
       } catch(Exception e) {
         e.printStackTrace();
       }

    }

}

客戶端:
package review.socketTcpOrUdp;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;

public class ClientUdp {

    publicstatic void main(String[] args)  {
       try{
      DatagramSocket datagramSocket = new DatagramSocket();
       while (true){
          //DatagramSocket datagramSocket =new DatagramSocket();
         InputStreamReader inputStreamReader = newInputStreamReader(System.in);
         BufferedReader bufferedReader = newBufferedReader(inputStreamReader);
          StringclientStr = bufferedReader.readLine();
         DatagramPacket sendDatagramPacket = newDatagramPacket(clientStr.getBytes(),clientStr.getBytes().length,
               InetAddress.getLocalHost(), 9578);
         datagramSocket.send(sendDatagramPacket);
         DatagramPacket recieveDatagramPacket =new DatagramPacket(newbyte[1024], 1024);
         datagramSocket.receive(recieveDatagramPacket);
          StringServerDatagramPacket = newString(recieveDatagramPacket.getData());
         System.out.println(ServerDatagramPacket);
         if(clientStr.equals("exit")){
             break;
          }
       }
          datagramSocket.close();
      }catch(Exception e){
         e.printStackTrace();
       }
      
    }
}
對比Tcp和Udp我們知道:
1:Tcp事先建立連接,按序到達,相對安全可靠(114查詢臺)
2:Udp不建立連接,不安序,但效率高,沒有主次之分(QQ聊天)

另外bufferedReader.readLine();方法控制檯輸入的字符完整內容是"zifu/n/t"所以服務段讀取內容時要把字符.trim方法消除首尾空格,這樣用equal方法就能比較了
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章