TCP(面向鏈接) 在正式收發(fā)數(shù)據(jù)前,必須和對(duì)方建立可靠的鏈接
特點(diǎn):安全(面向鏈接,保證對(duì)象一定能收到數(shù)據(jù)),傳輸數(shù)據(jù)大小無限制
缺點(diǎn):效率低(因?yàn)橛腥挝帐?
UDP和TCP一樣是面向無連接的傳輸層協(xié)議,提供面向事務(wù)的簡單不可靠信息傳送服務(wù)
特點(diǎn):無連接,安全,可靠性不高,效率高
發(fā)送方->接受方
1.創(chuàng)建DatagramSocket
2.準(zhǔn)備要發(fā)送的數(shù)據(jù)
3.將發(fā)送的數(shù)據(jù)放到包裹里面
4.通過DatagramSocket將包裹發(fā)送出去
5.關(guān)閉Socket
發(fā)送方
1.不需要地址和端口號(hào)
DatagramSocket socket = new DatagramSocket();
String str = "好開心啊";
DatagramPack pack = new DatagramPacket(str.getBytes(),str.length,127.0.0.1,2333)
Socket.send(packet);
接收方
DatagramSocket socket = new DatagramSocket(2333);
byte[] buf = new byte[1024];
DatagramPacket packet = new DatagramPacket(buf,length);
//阻塞程序向下進(jìn)行
socket.receve(packet);
String str = new String(packet.getData(),0,pack.length);
System.out.println(str);
利用udp實(shí)現(xiàn)互相聊天
服務(wù)端
package com.qf.demo3;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.InterfaceAddress;
import java.net.SocketException;
import java.util.Scanner;
public class Recive {
public static void main(String[] args) {
// 1 接收方的socket需要端口號(hào)
DatagramSocket socket = null;
try {
socket = new DatagramSocket(5577);
Scanner in = new Scanner(System.in);
while (true) {
// 接收
byte[] buf = new byte[1024];
DatagramPacket p = new DatagramPacket(buf, buf.length);
socket.receive(p);
String string = new String(p.getData(), 0, p.getLength());
System.out.println("發(fā)送方發(fā)送的" + string + " " + p.getAddress().getHostAddress());
// 回復(fù)數(shù)據(jù)
System.out.println("包裹端口:"+p.getPort());
System.out.println("請輸入回復(fù)內(nèi)容:");
String string2 = in.next();
DatagramPacket packet = new DatagramPacket(string2.getBytes(), string2.getBytes().length,
InetAddress.getLocalHost(), p.getPort());
socket.send(packet);
}
} catch (SocketException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
if (socket != null) {
socket.close();
}
}
}
}
客戶端
package com.qf.demo3;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.util.Scanner;
/**
* 1 發(fā)送方: socket 沒有參數(shù)的 接收方 : socket 是有端口號(hào)
* 2 send 的 packet 是帶有 byte lenth InetAddress port receive的 packet 是帶有 byte
* lenth
* 作業(yè): 實(shí)現(xiàn)循環(huán)的發(fā)送和接收 數(shù)據(jù)由控制臺(tái)輸入
*/
public class Send {
public static void main(String[] args) {
// 1 發(fā)送方的快遞點(diǎn)不需要參數(shù)
DatagramSocket socket = null;
Scanner in = new Scanner(System.in);
try {
socket = new DatagramSocket();
while (true) {
// 2
System.out.println("請輸入內(nèi)容:");
String string = in.next();
// 3 將數(shù)據(jù)放到包裹里面
DatagramPacket packet = new DatagramPacket(string.getBytes(), string.getBytes().length,
InetAddress.getLocalHost(), 5577);
// 4 發(fā)送
socket.send(packet);
// 接收 接收端的 回復(fù)
byte[] buf = new byte[1024 * 63];
DatagramPacket p = new DatagramPacket(buf, buf.length);
socket.receive(p);
String string2 = new String(p.getData(), 0, p.getLength());
System.out.println("接收方回復(fù)" + string2);
}
} catch (SocketException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
if (socket != null) {
socket.close();
}
}
}
}