在Web领域,实现数据通信时使用最多的就是HTTP,它是B/S架构使用的数据通信协议。虽然HTTP在开发效率上得到了保障,但是运行效率其实并不是最高的。因为HTTP属于高层协议,内部封装了很多细节,并且请求进入Web容器内部还要执行容器的内部代码,最后执行业务代码。如果想要实现高效率,高并发的数据通信机制,高层协议HTTP基本上就不适合,因此,底层技术Socket就成为必须掌握的内容。
Socket不是协议,而是一种实现计算机之间通信的技术,而HTTP才是协议。如果计算机之间像互相通信,就必须使用Socket技术,而能读懂对方传递过来的数据是要依靠协议的。
- 基于TCP的Socket通信
服务端代码
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
//客户端
public class Server {
public static void main(String[] args) throws IOException {
char[] charArray = new char[3];
ServerSocket serverSocket = new ServerSocket(8088);
Socket socket = serverSocket.accept();
InputStream inputStream = socket.getInputStream();
InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
int readLength = inputStreamReader.read(charArray);
while(readLength != -1){
String newString = new String(charArray, 0, readLength);
System.out.println(newString);
readLength = inputStreamReader.read(charArray);
}
inputStreamReader.close();
inputStream.close();
socket.close();
serverSocket.close();
}
}
客户端代码
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
public class Client {
public static void main(String[] args) throws UnknownHostException, IOException{
Socket socket = new Socket("localhost",8088);
OutputStream outputStream = socket.getOutputStream();
outputStream.write("我爱你".getBytes());
outputStream.close();
socket.close();
}
}
运行结果:
- 基于UDP的Socket通信
服务器代码:
package scoket;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class Server {
public static void main(String[] args) throws IOException{
DatagramSocket socket = new DatagramSocket(8888);
byte[] byteArray = new byte[10];
DatagramPacket myPacket = new DatagramPacket(byteArray,5);
socket.receive(myPacket);
socket.close();
System.out.println(new String(myPacket.getData(), 0, myPacket.getLength()));
}
}
客户端代码:
package scoket;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
public class Client {
public static void main(String[] args) throws IOException {
DatagramSocket socket = new DatagramSocket();
socket.connect(new InetSocketAddress("localhost",8888));
String newString = "abcde";
byte[] byteArray = newString.getBytes();
DatagramPacket myPacket = new DatagramPacket(byteArray, byteArray.length);
socket.send(myPacket);
socket.close();
}
}