二.四 接收和响应客户端请求数据
二.四.一 客户端
public static void main(String[] args) { try { client4Test(); // 写多个 client5Test(), client6Test() 等 } catch (Exception e) { e.printStackTrace(); } } public static void client4Test() throws Exception{ System.out.println("启动客户端"); BufferedReader bufferedReader=new BufferedReader(new InputStreamReader((System.in))); System.out.println("请输入用户名:"); String userName=bufferedReader.readLine(); System.out.println("请输入密码:"); String password=bufferedReader.readLine(); Socket socket=new Socket("localhost",9999); //发送数据 //客户端的输入 OutputStream outputStream= socket.getOutputStream(); DataOutputStream dataOutputStream=new DataOutputStream(outputStream); //拼接请求参数 String query="userName="+userName+"&password="+password; dataOutputStream.writeUTF(query); dataOutputStream.flush(); //获取内容 DataInputStream dataInputStream=new DataInputStream(socket.getInputStream()); String content=dataInputStream.readUTF(); System.out.println("接收服务器端返回的内容:"+content); dataInputStream.close(); dataOutputStream.close(); socket.close(); }
二.四.二 服务器端
@Test public void server4Test() throws Exception{ System.out.println("服务器启动中"); ServerSocket serverSocket=new ServerSocket(9999); //阻塞式接收 Socket client=serverSocket.accept(); System.out.println("连接一个客户端程序,响应数据"); InputStream inputStream=client.getInputStream(); DataInputStream dataInputStream=new DataInputStream(inputStream); String query=dataInputStream.readUTF(); //拆分 String[] qArr=query.split("&"); String userName=""; String password=""; for(String str:qArr){ String[] tempArr=str.split("="); if("userName".equals(tempArr[0])){ userName=tempArr[1]; }else if("password".equals(tempArr[0])){ password=tempArr[1]; } } String responseData=""; System.out.printf("接收的用户名为:%s,密码为%s",userName,password); //返回数据 if("两个蝴蝶飞".equals(userName)&&"1234".equals(password)){ responseData="用户名和密码输入正确,登录成功"; }else{ responseData="用户名或者密码错误,登录失败"; } DataOutputStream dataOutputStream=new DataOutputStream(client.getOutputStream()); dataOutputStream.writeUTF(responseData); dataOutputStream.close(); dataInputStream.close(); }
二.四.三 测试运行
先运行服务器端
再运行客户端, 输入错误的密码
这时,查看服务器端
再次重新测试, 输入正确的用户名和密码
发现,服务器端可以接收客户端传递过来的数据,并且可以响应数据, 客户端也能够获取到响应的数据。
二.五 传输文件
IOUtils 仍然与第二章节的 工具类一致。
二.五.一 客户端
public static void client5Test() throws Exception{ System.out.println("启动客户端,发送文件"); Socket socket=new Socket("localhost",9999); //发送数据 //客户端的输入 OutputStream outputStream= socket.getOutputStream(); DataOutputStream dataOutputStream=new DataOutputStream(outputStream); String path="E:"+ File.separator+"ideaWork"+File.separator+"Java2"+File.separator+"fileSrc" +File.separator+"129.png"; //将文件转换成字节 byte[] bytes= IOUtils.fileToByteArray(path); //写入图片 dataOutputStream.write(bytes); dataOutputStream.flush(); DataInputStream dataInputStream=new DataInputStream(socket.getInputStream()); String content=dataInputStream.readUTF(); System.out.println("接收服务器端返回的内容:"+content); dataInputStream.close(); dataOutputStream.close(); socket.close(); }
二.五.二 服务器端
@Test public void server5Test() throws Exception{ System.out.println("服务器启动中"); ServerSocket serverSocket=new ServerSocket(9999); //阻塞式接收 Socket client=serverSocket.accept(); System.out.println("连接一个客户端程序"); InputStream inputStream=client.getInputStream(); DataInputStream dataInputStream=new DataInputStream(inputStream); //图片大小为17k, 这儿接收时接收 20k byte[] bytes=new byte[1024*20]; dataInputStream.read(bytes); //将字节转换成图片 String path="E:"+ File.separator+"ideaWork"+File.separator+"Java2"+File.separator+"fileSrc" +File.separator+"129Tcp.png"; IOUtils.byteArrayToFile(bytes,path); String responseData="传输文件成功"; DataOutputStream dataOutputStream=new DataOutputStream(client.getOutputStream()); dataOutputStream.writeUTF(responseData); dataOutputStream.close(); dataInputStream.close(); }
二.五.三 测试运行
启动服务器端,再启动客户端, 客户端控制台打印输出
查看文件系统
图片,也可以正常的显示出来,没有破坏。
二.六 经典的 echo 程序
简单来说,就是响应数据 echo:客户端传递过来的数据
二.六.一 单次 echo
二.六.一.一 客户端
public static void client6Test() throws Exception{ System.out.println("启动客户端"); BufferedReader bufferedReader=new BufferedReader(new InputStreamReader((System.in))); Socket socket=new Socket("localhost",9999); //发送数据 //客户端的输入 OutputStream outputStream= socket.getOutputStream(); DataOutputStream dataOutputStream=new DataOutputStream(outputStream); String content=bufferedReader.readLine(); //写入数据 dataOutputStream.writeUTF(content); DataInputStream dataInputStream=new DataInputStream(socket.getInputStream()); //读取数据,并且打印 String respnseContent=dataInputStream.readUTF(); System.out.println(respnseContent); dataInputStream.close(); dataOutputStream.close(); socket.close(); }
二.六.一.二 服务器
@Test public void server6Test() throws Exception{ System.out.println("服务器启动中"); ServerSocket serverSocket=new ServerSocket(9999); //阻塞式接收 Socket client=serverSocket.accept(); System.out.println("连接一个客户端程序"); InputStream inputStream=client.getInputStream(); DataInputStream dataInputStream=new DataInputStream(inputStream); String content=dataInputStream.readUTF(); String responseData="echo:"+content; DataOutputStream dataOutputStream=new DataOutputStream(client.getOutputStream()); dataOutputStream.writeUTF(responseData); dataOutputStream.close(); dataInputStream.close(); }
二.六.一.三 测试运行
先运行服务器端,再运行客户端
二.六.二 多次echo
用while() 进行循环接收控制台传递过来的数据。
二.六.二.一 客户端
public static void client7Test() throws Exception{ System.out.println("启动客户端,多次echo 程序"); BufferedReader bufferedReader=new BufferedReader(new InputStreamReader((System.in))); Socket socket=new Socket("localhost",9999); //发送数据 //客户端的输入 OutputStream outputStream= socket.getOutputStream(); DataOutputStream dataOutputStream=new DataOutputStream(outputStream); DataInputStream dataInputStream=new DataInputStream(socket.getInputStream()); boolean isRun=true; while(isRun){ //循环接收数据 String content=bufferedReader.readLine(); dataOutputStream.writeUTF(content); String respnseContent=dataInputStream.readUTF(); System.out.println(respnseContent); if("bye".equalsIgnoreCase(content)||"quit".equalsIgnoreCase(content)){ break; } } dataInputStream.close(); dataOutputStream.close(); socket.close(); }
二.六.二.二 服务器端
@Test public void server7Test() throws Exception{ System.out.println("服务器启动中"); ServerSocket serverSocket=new ServerSocket(9999); boolean isRun=true; while(isRun){ //阻塞式接收 Socket client=serverSocket.accept(); System.out.println("连接一个客户端程序"); InputStream inputStream=client.getInputStream(); DataInputStream dataInputStream=new DataInputStream(inputStream); DataOutputStream dataOutputStream=new DataOutputStream(client.getOutputStream()); boolean isBye=false; while(!isBye){ String content=dataInputStream.readUTF(); String responseData=""; if("bye".equalsIgnoreCase(content)||"quit".equalsIgnoreCase(content)){ responseData="echo:欢迎下次再来"; isBye=true; }else{ responseData= "echo:"+content; } dataOutputStream.writeUTF(responseData); } dataOutputStream.close(); dataInputStream.close(); } }