客户端:数据来自于键盘录入,直到输入的数据是886,发送数据结束
服务器:接收到的数据在控制台输出
package com.inetTes01; /* 客户端:数据来自于键盘录入,直到输入的数据是886,发送数据结束 */ import java.io.*; import java.net.Socket; public class ClientDemo01 { public static void main(String[] args) throws IOException { //创建客户端Socket对象 Socket s = new Socket("192.168.18.6", 10000); // 数据来自于键盘录入,直到输入的数据是886,发送数据结束 BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); //封装输出流对象 BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream())); String line; while ((line = br.readLine()) != null) { if("886".equals(line)) { break; } // //获取输出流对象 // OutputStream os = s.getOutputStream(); // os.write(line.getBytes()); bw.write(line); bw.newLine(); bw.flush(); } //释放资源 s.close(); } }
package com.inetTes01; /* 服务器:接收到的数据在控制台输出 */ import java.io.*; import java.net.ServerSocket; import java.net.Socket; public class ServerDemo01 { public static void main(String[] args) throws IOException { //创建服务器Socket对象 ServerSocket ss = new ServerSocket(10000); //监听客户端的连接返回一个对应的Socket对象 Socket s = ss.accept(); //获取输入流 // InputStream is = s.getInputStream(); // InputStreamReader isr = new InputStreamReader(is); // BufferedReader br = new BufferedReader(isr); BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream())); String line; while ((line = br.readLine())!= null) { System.out.println(line); } //ss.close(); } }
练习3 客户端与练习2相同
服务器端,将接受的数据写入文件
package com.inetTes01; /* 服务器:接收到的数据写入文本文件 */ import java.io.*; import java.net.ServerSocket; import java.net.Socket; public class ServerDemo02 { public static void main(String[] args) throws IOException { //创建服务器Socket对象 ServerSocket ss = new ServerSocket(10002); //监听客户端连接,返回对应的Socket对象 Socket s = ss.accept(); //获取输入流,读数据 BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream())); //创建输出流对象 BufferedWriter bw = new BufferedWriter(new FileWriter("IDEA_Test\\s.txt")); String line; while ((line = br.readLine()) != null) { bw.write(line); bw.newLine(); bw.flush(); } ss.close(); bw.close(); br.close(); } }
练习4.服务器端与练习三相同。
客户端,数据来自于文本文件
package com.inetTes01; /* 客户端:数据来自于文本文件 */ import java.io.*; import java.net.Socket; public class ClientDemo02 { public static void main(String[] args) throws IOException { //创建Socket对象 Socket s = new Socket("192.168.18.6",10003); //封装输出流,写数据 BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream())); //数据来自于文本文件,读取文本文件,然后写入bw数据 //封装文本文件的数据 BufferedReader br = new BufferedReader(new FileReader("IDEA_Test\\diamond.txt")); String line; while((line = br.readLine())!= null) { bw.write(line); bw.newLine(); bw.flush(); } s.close(); br.close(); } }
练习5
●客户端: 数据来自于文本文件,接收服务器反馈
●服务器: 接收到的数据写入文本文件,给出反馈
●出现问题: 程序- -直等待
●原因: 读数据的方法是阻塞式的
●解决办法: 自定义结束标记;使用shutdownOutput(方法(推荐)
客户端代码
package com.inetTes01; /* 客户端:数据来自于文本文件 */ import java.io.*; import java.net.Socket; public class ClientDemo02 { public static void main(String[] args) throws IOException { //创建Socket对象 Socket s = new Socket("192.168.18.6", 10005); //封装输出流,写数据 BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream())); //数据来自于文本文件,读取文本文件,然后写入bw数据 //封装文本文件的数据 BufferedReader br = new BufferedReader(new FileReader("IDEA_Test\\diamond.txt")); String line; while ((line = br.readLine()) != null) { bw.write(line); bw.newLine(); bw.flush(); } //自定义结束标记 // bw.write("886"); // bw.newLine(); // bw.flush(); s.shutdownOutput(); //接收反馈:相当于读取数据 BufferedReader bwClient = new BufferedReader(new InputStreamReader(s.getInputStream())); String x = bwClient.readLine(); System.out.println(x); s.close(); br.close(); bwClient.close(); } }
服务器端
package com.inetTes01; /* 服务器:接收到的数据写入文本文件 */ import java.io.*; import java.net.ServerSocket; import java.net.Socket; public class ServerDemo02 { public static void main(String[] args) throws IOException { //创建服务器Socket对象 ServerSocket ss = new ServerSocket(10005); //监听客户端连接,返回对应的Socket对象 Socket s = ss.accept(); //获取输入流,读数据 BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream())); //创建输出流对象 BufferedWriter bw = new BufferedWriter(new FileWriter("IDEA_Test\\s.txt")); String line; while ((line = br.readLine()) != null) { bw.write(line); bw.newLine(); bw.flush(); } //服务器给出反馈相当于写入数据 BufferedWriter bwServer = new BufferedWriter(new OutputStreamWriter(s.getOutputStream())); bwServer.write("文件上传成功"); bwServer.newLine(); bwServer.flush(); bwServer.close(); ss.close(); bw.close(); } }
客户端和练习5一样
服务器如下:
package com.inetTes01; /* 服务器 。 接收到的数据写入文本文件,给出反馈,代码用线程进行封装,为每一个客户端开启一个线程 */ import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; public class ServerDemo03 { public static void main(String[] args) throws IOException { //创建服务器Socket对象 ServerSocket ss = new ServerSocket(10007); while (true) { 监听客户端连接,返回一个对应的Socket对象 Socket s = ss.accept(); //为每一个客户端开启一个线程 new Thread(new ServerThread(s)).start(); } // ss.close(); //因为要进行死循环,所以不需要释放资源了 } }
线程类如下:
package com.inetTes01; import java.io.*; import java.net.Socket; public class ServerThread implements Runnable { private Socket s; public ServerThread(Socket s) { this.s = s; } @Override public void run() { //接收数据写到文本文件 //封装输入流,读数据 ,封装输出流,写数据到文件上 try { BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream())); // BufferedWriter bw = new BufferedWriter(new FileWriter("IDEA_Test\\s.txt")); //为了解决接收多次文件的名称冲突问题 int count = 0; File file = new File("IDEA_Test\\s" + count + ".txt"); while (file.exists()) { count++; file = new File("IDEA_Test\\s" + count + ".txt"); } BufferedWriter bw = new BufferedWriter(new FileWriter(file)); String line; while ((line = br.readLine()) != null) { bw.write(line); bw.newLine(); bw.flush(); } //给出反馈 BufferedWriter Serverback = new BufferedWriter(new OutputStreamWriter(s.getOutputStream())); Serverback.write("文件上传成功啦"); Serverback.flush(); s.close(); bw.close(); } catch (IOException e) { e.printStackTrace(); } // } }