HTTP连接是采用“请求–响应”的方式,而Socket是在双方建立起连接后就可以直接进行数据的传输,不需要每次向服务器发送请求。
Socket连接包含5个必须的信息:
1、连接协议;
2、本地主机IP地址;
3、本地进程的协议端口;
4、远程主机的IP地址;
5、远程进程的协议端口。
Java中网络通信方式:
一、基于TCP协议的Socket实现原理:
(1)客户端:
public class TCPClient {
public static void main(String[] args) {
try {
// 创建一个Socket对象,指定服务器端的IP和端口
Socket socket = new Socket("192.168.1.1", 9090);
// 使用InputStream读取硬盘上的文件
InputStream is = new FileInputStream("D://test/my_file.text");
// 从Socket中得到OutputStream
OutputStream os = socket.getOutputStream();
byte b[] = new byte[1024];
int len = 0;
// 取出InputStream中的数据,并写入到OutputStream中
while ((len = is.read(b)) != -1) {
os.write(b, 0, len);
}
os.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
}
(2)服务器端:
public class TCPServer {
public static void main(String[] args) {
ServerSocket serverSocket = null;
try {
// 创建一个ServerSocket对象,并让Socket在9090端口监听
serverSocket = new ServerSocket(9090);
// 接收客户端发送的请求,如果客户端没有发送请求,那么该线程处于阻塞状态
Socket socket = serverSocket.accept();
// 从Socket中得到InputStream对象
InputStream is = socket.getInputStream();
byte b[] = new byte[1024];
int len = 0;
// 从InputStream中取出客户端发送的数据,并写入到OutputStream中
while ((len = is.read(b)) != -1) {
System.out.println(new String(b, 0, len));
}
} catch (IOException e) {
}
}
}
二、基于UDP协议的数据传输实现原理:
(1)客户端:
public class UDPClient {
public static void main(String[] args) {
try {
// 创建一个DatagramSocket对象
DatagramSocket dSocket = new DatagramSocket(5050);
// 创建一个InetAddress对象,类似于一个网络的发送地址
InetAddress iAddress = InetAddress.getByName("192.168.1.1");
String s = "Hello World";
// 将要传输的数据转为字节码
byte data[] = s.getBytes();
// 创建一个DatagramPacket对象,并指定地址和端口号
DatagramPacket dPacket = new DatagramPacket(data, data.length, iAddress, 5050);
// 调用DatagramSocket对象的send()方法,发送数据
dSocket.send(dPacket);
} catch (Exception e) {
e.printStackTrace();
}
}
}
(2)服务器端:
public class UDPService {
public static void main(String[] args) {
DatagramSocket dSocket;
try {
// 创建一个DatagramSocket对象,并指定端口号
dSocket = new DatagramSocket(5050);
// 创建一个空的DatagramPacket对象
byte data[] = new byte[1024];
// 接收客户端发送的数据,如果客户端没有发送数据,那么该线程处于阻塞状态
DatagramPacket dPacket = new DatagramPacket(data, data.length);
dSocket.receive(dPacket);
String result = new String(dPacket.getData(), dPacket.getOffset(), dPacket.getLength());
System.out.println("result:" + result);
} catch (Exception e) {
e.printStackTrace();
}
}
}