TCP通信(下)与Socket套接字
案例3-01
案例:实现客户端向服务端发送一条数据,Server接收到之后向Client响应信息。
注意点:accept()与read系列方法都阻塞的
flush()是因为DataOutputStream 是一个处理流,发送的数据先到缓冲区,如果不刷新,那么发送数据时会有残留在缓冲区里,导致数据丢失,所有要刷新
分析:案例3-01添加了服务端接收客户端发来的数据以后,要做出响应,及要在服务端添加响应的数据,发送到客户端,客户端再接收数据。
package cn_socket通信_聊天室版本301;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;
public class Clinet {
public static void main(String[] args) throws UnknownHostException, IOException {
//创建客户端Socket对象
//连接目标服务器的地址,localhost是目标服务器的地址,10086是目标服务器的端口
Socket socket = new Socket("localhost",10086);
//获取Socket流中的输出流,向服务器输出消息
DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
//写发送数据的大小
String data ="hello,Server响应Client";
byte[] bys=data.getBytes();
//发送的数据类型
dos.writeByte(1);
//发送数据长度
dos.writeInt(bys.length);
//要发送的数据 内容
dos.write(bys);
dos.flush();//刷新
//接收数据
//创建数据输入流对象
DataInputStream dis = new DataInputStream(socket.getInputStream());
//通过socket对象获取输入流,要读取服务端响应的数据
//接收数据类型
byte type=dis.readByte();
//接收数据长度
int len = dis.readInt();
//接收数据内容
byte[] bys0 = new byte[len];
dis.read(bys0);
System.out.println(new String(bys0,"utf-8"));
socket.close();
}
}
package cn_socket通信_聊天室版本301;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
public static void main(String[] args) throws IOException {
//接收Client发送的数据
//创建服务端对象
ServerSocket ss = new ServerSocket(10086);
//监听应用所在服务器的10086端口
//看有没有客户端连接过来,或者发送消息
//建立连接,获取链接过来的客户端对象
Socket socket=ss.accept(); //接受客户端请求,
DataInputStream dis = new DataInputStream(socket.getInputStream());
//通过socket对象获取输入流,要读取客户端发来的数据
//接收数据类型
byte type=dis.readByte();//默认是阻塞的,只有客户端先写数据,服务端接收到之后,才会执行的
//接收数据长度
int len = dis.readInt();
//接收数据内容
byte[] bys = new byte[len];
dis.read(bys);
System.out.println(new String(bys));
//向Client给出响应数据
//创建数据输出流对象
DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
//发送数据类型
dos.writeByte(1);
//发送数据长度
String data ="接收完毕,您已下线";
byte[] content = data.getBytes("utf-8");
dos.writeInt(content.length);
dos.write(content);
dos.flush();
ss.close();
}
}
程序运行结果
先运行服务端,后运行客户端