可变数据长度的示例
Socket 服务端
public class SocketServer {
public static void main(String[] args) throws IOException {
//启动socket服务端
ServerSocket server = new ServerSocket(8888);
while (true) {
//监听客户端请求
Socket socket = server.accept();
//实际开发中,应将下面的代码放入到线程中执行。若客户端同时发起多个socket请求时,会发生阻塞
//获取客户端请求数据
InputStream is = socket.getInputStream();
ByteArrayOutputStream baos = new ByteArrayOutputStream(4096);
byte[] buff = new byte[4096];
int len;
while ((len = is.read(buff)) != -1) {
baos.write(buff, 0, len);
}
//输出请求数据
System.out.println(baos.toString("utf-8"));
//根据实际业务需求,考虑是否需要响应给客户端
OutputStream os = socket.getOutputStream();
os.write("ServerSocket的回复".getBytes("utf-8"));
socket.shutdownOutput(); //关闭数据输出
socket.close(); //关闭当前客户端通信,调用socket.close()会自动关闭输入流和输出流
}
//server.close(); //关闭socket服务端(停止服务)
}
}
Socket 客户端
public class SocketClient {
public static void main(String args[]) throws UnknownHostException, IOException{
//连接socket服务端
Socket socket = new Socket("127.0.0.1", 8888);
//向服务端发送数据
OutputStream os = socket.getOutputStream();
os.write("我是一个中国人".getBytes("utf-8"));
socket.shutdownOutput(); //关闭数据输出,若不关闭则服务端接收客户端数据的输入流会一直阻塞
//os.close(); //这里不要调用close,否则socket连接就断开了
//根据实际业务需求,考虑是否需要接收服务端响应
InputStream is = socket.getInputStream();
ByteArrayOutputStream baos = new ByteArrayOutputStream(4096);
byte[] buff = new byte[4096];
int len;
while ((len = is.read(buff)) != -1) {
baos.write(buff, 0, len);
}
//输出服务端响应信息
System.out.println(baos.toString("utf-8"));
//关闭资源
socket.close(); //关闭与服务端的通信,并自动关闭输入流和输出流
}
}
固定长度的示例
Socket 服务端
public static void main(String[] args) throws IOException {
ServerSocket server = new ServerSocket(8888);
while (true) {
Socket socket = server.accept();
//读取客户端请求数据,dis.read会阻塞,直到客户端write数据后才能读到数据
DataInputStream dis = new DataInputStream(socket.getInputStream());
byte[] buff = new byte[dis.readInt()]; //先读取4个字节的数据(int类型的数据占4个字节),获取真实数据长度
dis.read(buff); //读取真实数据
System.out.println(new String(buff,"utf-8")); //输出请求数据
//向客户端响应数据
byte[] data = ("ServerSocket" + System.currentTimeMillis()).getBytes("utf-8");
DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
dos.writeInt(data.length); //先发送4个字节的数据过去,告诉客户端真实数据的长度为多少
dos.write(data); //发送真实数据
socket.close();
}
//server.close(); //关闭socket服务端(停止服务)
}
Socket 客户端
public static void main(String args[]) throws UnknownHostException, IOException{
Socket socket = new Socket("127.0.0.1", 8888);
//向服务端发送数据
byte[] data = "我是一个中国人".getBytes("utf-8");
DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
dos.writeInt(data.length); //先发送4个字节的数据过去(int类型的数据占4个字节),告诉服务端真实数据的长度为多少
dos.write(data); //发送真实数据
//读取服务器响应的数据
DataInputStream dis = new DataInputStream(socket.getInputStream());
byte[] buff = new byte[dis.readInt()]; //先读取4个字节的数据,获取真实数据长度
dis.read(buff); //读取真实数据
System.out.println(new String(buff,"utf-8")); //输出响应数据
socket.close();
}