JAVA Socket 编程
socket——TCP通信
accept方法阻塞请求,无法并发,效率太低,如果当前的请求没有处理完,那么后面的请求只能被阻塞,服务器的吞吐量太低。
server服务端
public class server {
public static void main(String[] args) throws IOException {
//打开一个连接
ServerSocket server = new ServerSocket(1000);
Socket socket = server.accept();
//接收数据并打印
InputStream inputStream = socket.getInputStream();
byte[] bytes = new byte[1024];
StringBuilder stringBuilder = new StringBuilder();
int len;
while((len = inputStream.read(bytes)) != -1){
stringBuilder.append(new String(bytes,0,len,"UTF-8"));
}
System.out.println("get "+stringBuilder);
// 回传数据
// OutputStream outputStream = socket.getOutputStream();
// outputStream.write("Hello Client,I get the message.".getBytes("UTF-8"));
// outputStream.close();
inputStream.close();
socket.close();
server.close();
}
}
client客户端
public class client {
public static void main(String[] args) throws IOException {
Socket socket = new Socket("127.0.0.1",1000);
//输出数据到服务器
String message = "hello world!";
OutputStream outputStream = socket.getOutputStream();
outputStream.write(message.getBytes("UTF-8"));
//通过shutdownOutput告诉服务器已经发送完数据,后续只能接受数据
// socket.shutdownOutput();
//接收数据
// InputStream inputStream = socket.getInputStream();
// byte[] bytes = new byte[1024];
// StringBuilder sb = new StringBuilder();
// int len = 0;
// while((len = inputStream.read(bytes))!=-1){
// sb.append(new String(bytes,0,len));
// }
// System.out.println("get from server "+sb);
// inputStream.close();
outputStream.close();
socket.close();
}
}
DatagramSocket——UDP通信
Socket使用的tcp连接,需要先连接之后才能发送数据。
DatagramSocket使用的UDP连接,客户端不需要先连接数据,可以直接发送给指定服务端。
client客户端
public class client {
public static void main(String[] args) throws IOException {
DatagramSocket client = new DatagramSocket(666);
String msg = "I love you!";
byte[] bytes = msg.getBytes();
//创建一个DatagramPacket对象,用于发送数据。
//参数一:要发送的数据 参数二:数据的长度 参数三:服务端的网络地址 参数四:服务器端端口号
DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length,new InetSocketAddress("127.0.0.1",1024));
client.send(datagramPacket);
client.close();
}
}
server服务端
public class server {
public static void main(String[] args) throws IOException {
//创建一个服务器端套接字,并绑定到指定端口上。用于监听客户端的请求
DatagramSocket server = new DatagramSocket(1024);
byte[] container = new byte[1024];
DatagramPacket datagramPacket = new DatagramPacket(container,container.length);
//接收数据
server.receive(datagramPacket);
byte[] msg = datagramPacket.getData();
int length = msg.length;
String message = new String(msg,0,length);
System.out.println(message);
server.close();
}
}
相关API、类及其描述
API 或 类 | 描述 |
---|---|
ServerSocket | Socket类代表一个客户端套接字,即任何时候连接到一个远程服务器应用时构建所需的socket。现在,要实现一个服务器应用,需要不同的做法。服务器需随时待命,因为不知道客户端什么时候会发来请求,此时,我们需要使用ServerSocket,对应的是java.net.ServerSocket类。 ServerSocket与Socket不同,ServerSocket是等待客户端的请求,一旦获得一个连接请求,就创建一个Socket示例来与客户端进行通信。 |
Socket | 根据指定服务端的 IP 地址或端口号构造 Socket 类对象。若服务器端响应,则建立客户端到服务器的通信线路。若连接失败,会出现异常。 |
accept() | 监听连接请求,如果客户端请求连接,则接受连接,返回通信套接字对象 |
shutdownOutput() | 通过shutdownOutput高速服务器已经发送完数据,后续只能接受数据 |
DatagramSocket | 基于UDP 协议进行通信的包装类,创建客户端,UDP数据报通过数据报套接字 DatagramSocket 发送和接 |
DatagramPacket | 封装了UDP数据报,在数据报中包含了发送端的IP地址和端口号以及接收端的IP地址和端口号 |
receive() | 接收DatagramPacket数据 |
send() | 发送datagramPacket数据报 |