Socket使用的TCP連接,需要先連接之後才能發送數據。
DatagramSocket使用的UDP連接,客戶端不需要先連接數據,可以直接發送給指定服務端。
使用UDP協議
發送端:
package socket;
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;
/**
*
* @author Administrator
* 發送端
*/
public class TestSend {
public static void main(String[] args) {
try {
//1.創建自己的套接字(8000以後)—— DatagramSocket
DatagramSocket client = new DatagramSocket();
//2.發送內容
Scanner sc = new Scanner(System.in);
System.out.println("輸入發送的內容:");
String msg = sc.nextLine();
//3.打包
//創建一個IP對象
InetAddress adds = InetAddress.getByName("192.168.1.105");
DatagramPacket packet = new DatagramPacket(msg.getBytes(), msg.getBytes().length ,adds,12306);
//4.發送包
client.send(packet);
client.close();
} catch (SocketException e) {
// TODO 自動生成的 catch 塊
e.printStackTrace();
} catch (UnknownHostException e) {
// TODO 自動生成的 catch 塊
e.printStackTrace();
} catch (IOException e) {
// TODO 自動生成的 catch 塊
e.printStackTrace();
}
}
}
接收端
package socket;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
/**
*
* @author Administrator
* 接收端
*/
public class TestRec {
public static void main(String[] args) {
try {
//1.創建自己的套接字(8000以後)—— DatagramSocket
DatagramSocket server = new DatagramSocket(9998);
//2.準備接收容器
byte []buf = new byte[1024];
//3.封裝成包裹 —— DatagramPacket
DatagramPacket packet = new DatagramPacket(buf, buf.length);
//3.讀取的過程,分析數據
server.receive(packet);
System.out.println("對方IP:"+packet.getAddress());
System.out.println("對方發送的數據:"+new String(packet.getData()));
} catch (SocketException e) {
// TODO 自動生成的 catch 塊
e.printStackTrace();
} catch (IOException e) {
// TODO 自動生成的 catch 塊
e.printStackTrace();
}
}
}
使用TCP協議
發送端
package socketTCP;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
/**
* TCP協議,客戶端(發送端)
* @author Administrator
*
*/
public class Client {
public static void main(String[] args) throws IOException {
//創建套接字,連接服務器端IP和端口
Socket client = new Socket("192.168.1.107",10087);
//創建輸出流
OutputStream output = client.getOutputStream();
//創建要發送的內容
String msg = "Hello World!";
//發送數據,先將字符創裝換成字節
output.write(msg.getBytes());
//接收對方回覆
//創建輸入流
InputStream input = client.getInputStream();
byte buf[] = new byte[1024];
int len = input.read(buf);
System.out.println("接收到的回覆:"+new String(buf,0,len));
}
}
接收端
package socketTCP;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
/**
* TCP協議,服務器端(接收端)
* @author Administrator
*
*/
public class Server {
public static void main(String[] args) {
try {
//創建套接字
ServerSocket server = new ServerSocket(8888);
//創建監聽,等待客戶端的連接,並得到客戶端的套接字
Socket client = server.accept();
//獲取輸入流
InputStream input = client.getInputStream();
//創建存放數據的數組
byte buf[] = new byte[1024];
//從流中讀取數據到數組中,並獲取讀取的長度
int len = input.read(buf);
//判斷是否讀取成功
if (len != -1) { //讀取成功
System.out.println("對方IP:"+client.getInetAddress());
System.out.println("對方發送的數據:"+ new String(buf, 0,len));
}
OutputStream output = client.getOutputStream();
System.out.println("回覆對方");
String msg = "Hello World too!";
output.write(msg.getBytes());
} catch (IOException e) {
// TODO 自動生成的 catch 塊
e.printStackTrace();
}
}
}