当Socket端和ServerSocket建立连接以后,使用BufferedReader和BufferedWriter作为输入输出流读取和发送数据,如果Socket端使用两个线程分别实现收发数据的功能,那么当接收数据的线程被readLine方法阻塞时,另一个线程能否使用write方法向ServerSocket端成功的发送数据?
可以的,双向管道,在Client中,在主线程中发送数据之前,将TestSocket使用readLine()方法阻塞,然后主线程发送数据,在Server端直接读取,以下为具体实现
package com.mayb.Net.TCP; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.net.Socket; import java.net.UnknownHostException; public class Client { public static BufferedReader read; public static BufferedWriter send; public static Socket client; public static boolean flag = true; public static void main(String[] args) throws UnknownHostException, IOException { client = new Socket("localhost", 8888); read = new BufferedReader(new InputStreamReader(client.getInputStream())); send = new BufferedWriter(new OutputStreamWriter(client.getOutputStream())); new TestSocket(client).start(); try { Thread.currentThread().sleep(2000); } catch (InterruptedException e) { // TODO 自动生成的 catch 块 e.printStackTrace(); } System.out.println("发送数据"); send.write("yes ,you can\n"); send.flush(); } } class TestSocket extends Thread { private Socket c; public TestSocket (Socket socket) { // TODO 自动生成的构造函数存根 c = socket; } @Override public void run() { try { System.out.println("准备读取....."); Client.read.readLine(); System.out.println("读取结束....."); System.out.println("关闭Client"); c.close(); Client.flag = false; } catch (IOException e) { // TODO 自动生成的 catch 块 e.printStackTrace(); } } } //服务端实现 package com.mayb.Net.TCP; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.net.ServerSocket; import java.net.Socket; public class Server { public static void main(String[] args) throws IOException { ServerSocket server = new ServerSocket(8888); Socket sss = server.accept(); BufferedReader read = new BufferedReader(new InputStreamReader(sss.getInputStream())); BufferedWriter send = new BufferedWriter(new OutputStreamWriter(sss.getOutputStream())); try { Thread.currentThread().sleep(3000); } catch (InterruptedException e) { // TODO 自动生成的 catch 块 e.printStackTrace(); } String string = read.readLine(); System.out.println(string + "One Client has connected"); while (Client.flag) ; System.out.println("关闭Server"); try { Thread.currentThread().sleep(40000); } catch (InterruptedException e) { // TODO 自动生成的 catch 块 e.printStackTrace(); } server.close(); } }