解决了版本三的不能连续发送消息 实现了全双工
思路:创建一个新的线程来实现数据的发送,main线程用于接受数据
客户端
//服务端可以不断的发送信息给客户端 也可以不断的接受客户端的信息
//一个客户端 一个服务器
public class Client04 {
static Scanner sc = new Scanner(System.in);
static Socket socket;
public static void main(String[] args) {
//创建客户端套接字 用户交互服务器
try {
socket = new Socket("127.0.0.1", 8004);
//根据套接字获取输出流 把信息从内存拿出来就是输出 写进内存就是输入
new Thread(()->{
while (true) {
try {
DataInputStream dataInputStream = new DataInputStream(socket.getInputStream());
String s = null;
s = dataInputStream.readUTF();
System.out.println(s);
} catch (IOException e) {
e.printStackTrace();
}
}
//获取服务端发过来的消息
}).start();
while (true) {
OutputStream outputStream = socket.getOutputStream();
//将字节输出流包装成数据字节输出
DataOutputStream dataOutputStream = new DataOutputStream(outputStream);
dataOutputStream.flush();
//这行代码的确定缺点 程序会阻塞在这里等待输入
dataOutputStream.writeUTF("客户端说:"+sc.next());
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
服务器
//服务端可以不断的发送信息给客户端 也可以不断的接受客户端的信息
//一个客户端 一个服务器
public class Server04 {
static Scanner sc = new Scanner(System.in);
static ServerSocket serverSocket;
static Socket socket;
public static void main(String[] args) {
//创建服务端套接字ServerSocket 并指定端口号
try {
serverSocket = new ServerSocket(8004);
//通过服务端套接字 监听客户端的连接 如果没有客户端连接 程序会停留在此处
socket = serverSocket.accept();//返回的就是客户端的套接字 获取一个连接
//创建一个新的线程来服务器给客户端发送数据
new Thread(()->{
try {
while (true) {
//服务端继续给客户端发送消息 这里使用socket 而不是serverSocket 是因为服务端只有一个 客户端有很多个 给指定客户端发信息
DataOutputStream dataOutputStream = new DataOutputStream(socket.getOutputStream());
dataOutputStream.writeUTF("服务端说:"+sc.next());
dataOutputStream.flush();
}
} catch (IOException e) {
e.printStackTrace();
}
}).start();
while(true) {
//根据客户端套接字 获取对应的输入流
InputStream inputStream = socket.getInputStream();
//将字节输入流包装成 数据字节流
DataInputStream dataInputStream = new DataInputStream(inputStream);
String s = dataInputStream.readUTF();
System.out.println(s);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}