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();
}
}
}