需求:建立一个文本转换服务器。
客户端给服务端发送文本,服务端会将文本转成大写,再返回给客户端,
而且客户端可以不断的进行文本转换,当客户端输入over是,转换结束。
public class TCPDemo02 {//客户端
public static void main(String[] args) {try {
Socket socket=new Socket("172.60.20.120",10005);
//定义读取键盘数据的流对象
BufferedReader bufr=
new BufferedReader(new InputStreamReader(System.in));
//定义目的。将数据写入到socket输出流,发给服务端
BufferedWriter bufout=
new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
//定义一个socket读取流,读取服务端返回的大写信息
BufferedReader bufIn=
new BufferedReader(new InputStreamReader(socket.getInputStream()));
String line=null;
while ((line=bufr.readLine())!=null) {
//4.这是readlIne方法的解读,若服务器端程序不写newLine方法,则它在这个方法时,
就会发生阻塞,
if ("over".equals(line)) {break;
}
bufout.write(line);
bufout.newLine();
//1.必须要加,如果不加newline方法,那么不会写入换行符,同时服务器端不会读到换行符
bufout.flush();//记得刷新
System.out.println("server"+str);
}
bufr.close();
socket.close();//加个-1
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public class TCPServerDemo02 {//服务器端
public static void main(String[] args) {
try {
ServerSocket server=new ServerSocket(10005);
Socket socket=server.accept();
String ip=socket.getInetAddress().getHostAddress();
System.out.println(ip+"-----connected");
//读取socket读取流中的数据。
BufferedReader bufIn=
new BufferedReader(new InputStreamReader(socket.getInputStream()));
//目的。socket输出流。将大写数据写入到socket输出流,并发送给客户端。
BufferedWriter bufOut=
new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
String line=null;
while ((line=bufIn.readLine())!=null) {
//2.Reads a line of text. A line is considered to be terminated by any one
of a line feed ('\n'), a carriage return ('\r'), or a carriage return followed
immediately by a linefeed.
这时readlIne方法的解读,若客户端程序不写newLine方法,则它在这个方法时,就会
发生阻塞,
bufOut.write(line.toUpperCase());
bufOut.newLine();
//3.必须要加,如果不加newline方法,那么jiu不会写入换行符,同时客户端不会读到换行符
bufOut.flush();
}
socket.close();//客户端关掉
server.close();//服务端关掉
} catch (IOException e) {
e.printStackTrace();
}
}
}
用这个对象可以代替BufferedWriter对象,
PrintWriter out=new PrintWriter(socket.getOutputStream(),true);
因为这个对象可以使用println方法,相对来说代码会少一些
总结:
该例子出现的问题。
现象:客户端和服务端倒在莫名的等待。
原因:因为客户端和服务端都有阻塞式方法。这些方法没有读到结束标记,那么就一直等待,
从而,导致两端都在等待
虽然帖子晚了几分钟,但是小妞在睡觉之前补上了