【需求】:建立一个文本转换服务器
- 客户端给服务端发送文本,服务端会转成大写再返回给客户端。
- 客户端可以不断地进行文本转换,当客户端输入over时,转换结束。
【代码实现】:
import java.io.*;
import java.net.*;
class TcpClient3
{
public static void main(String[] args) throws Exception
{
Socket s=new Socket("127.0.0.1",10004);
//定义键盘录入
BufferedReader bufr=new BufferedReader(new InputStreamReader(System.in));
//定义Socket的输出流
BufferedWriter out=new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
BufferedReader in=new BufferedReader(new InputStreamReader(s.getInputStream()));
String line=null;
while((line=bufr.readLine())!=null){
if(line.equals("over")) {
break;
}
out.write(line);
out.newLine();
out.flush();
String str=in.readLine();
System.out.println("Server::"+str);
}
bufr.close();
s.close();
}
}
class TcpServer3
{
public static void main(String[] args) throws Exception
{
ServerSocket ss=new ServerSocket(10004);
Socket s=ss.accept();
String ip=s.getInetAddress().getHostAddress();
System.out.println("ip:"+ip+"connected...");
//读
BufferedReader in=new BufferedReader(new InputStreamReader(s.getInputStream()));
//写
BufferedWriter out=new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
String line=null;
while((line=in.readLine())!=null){
System.out.println("Client::"+line);
out.write(line.toUpperCase());
out.newLine();
out.flush();
}
s.close();
ss.close();
}
}
【截图】:
【问题】
在该练习中出现的问题---
问题:我们会看到客户端和服务端会陷入等待状态;
原因:因为客户端和服务端都存在阻塞式方法,这些方法没有读到结束标记,就会一直等待。