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方法就能比較了
* 通信鏈的句柄,用戶各種計算機和虛擬機之間的
* 通信,所有應用程序幾乎都用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方法就能比較了
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.