您的位置:首页 > 理论基础 > 计算机网络

JAVA 网络编程——客户端&服务器之间的文件上传和下载(TCP通信程序)

2020-02-04 11:08 483 查看

TCP通信程序

  • 案例需求

    客户端:数据来自于文本文件,接收服务器反馈

    服务器:接收到的数据写入文本文件,给出反馈,代码用线程进行封装,为每一个客户端开启一个线程

  • 案例分析

    创建客户端对象,创建输入流对象指向文件,每读入一行数据就给服务器输出一行数据,输出结束后使用shutdownOutput()方法告知服务端传输结束
  • 创建多线程类,在run()方法中读取客户端发送的数据,为了防止文件重名,使用计数器给文件名编号,接受结束后使用输出流给客户端发送反馈信息。
  • 创建服务端对象,每监听到一个客户端则开启一个新的线程接受数据。
  • 客户端接受服务端的回馈信息
  • 代码实现
    1.创建客户端对象,创建输入流对象指向文件,每读入一行数据就给服务器输出一行数据,输出结束后使用shutdownOutput()方法告知服务端传输结束

  • import java.io.*;
    import java.net.Socket;
    
    /*
    客户端:数据来自于文本文件,接收服务器反馈
    */
    public class ClientDemo {
    public static void main(String[] args) throws IOException {
    //创建客户端Socket对象
    //本机IP地址和端口,如果运行时报出java.net.BindException: Address already in use: NET_Bind异常,
    //表明端口号已被占用,则换一个1024到65535之间的端口号
    Socket s = new Socket("192.168.111.1",10086);
    
    //封装文本文件的数据
    BufferedReader br = new BufferedReader(new FileReader("myNet\\InetAddressDemo.java"));
    //封装输出流写数据
    BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
    
    String line;
    while ((line=br.readLine())!=null) {
    bw.write(line);
    bw.newLine();
    bw.flush();
    }
    
    s.shutdownOutput();
    
    //接收反馈
    BufferedReader brClient = new BufferedReader(new InputStreamReader(s.getInputStream()));
    String data = brClient.readLine(); //等待读取数据
    System.out.println("服务器的反馈:" + data);
    
    //释放资源
    br.close();
    s.close();
    }

    2.创建多线程类,在run()方法中读取客户端发送的数据,为了防止文件重名,使用计数器给文件名编号,接受结束后使用输出流给客户端发送反馈信息。

    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("myNet\\Copy.java"));
    //解决名称冲突问题
    int count = 0;
    File file = new File("35myNet\\Copy["+count+"].java");
    while (file.exists()) {
    count++;
    file = new File("35myNet\\Copy["+count+"].java");
    }
    BufferedWriter bw = new BufferedWriter(new FileWriter(file));
    
    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();
    
    //释放资源
    s.close();
    } catch (IOException e) {
    e.printStackTrace();
    }
    }
    }

    3.创建服务端对象,每监听到一个客户端则开启一个新的线程接受数据。

    import java.io.IOException;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    /*
    服务器:接收到的数据写入文本文件,给出反馈,代码用线程进行封装,为每一个客户端开启一个线程
    */
    public class ServerDemo {
    public static void main(String[] args) throws IOException {
    //创建服务器Socket对象
    ServerSocket ss = new ServerSocket(10086);
    
    while (true) {//用while循环一直监听,有客户端请求则为每一个客户端开启一个线程
    //监听客户端连接,返回一个对应的Socket对象
    Socket s = ss.accept();
    //为每一个客户端开启一个线程
    new Thread(new ServerThread(s)).start();
    }
    
    //        ss.close();
    }
    }

    运行截图:

    提示:
    如果运行时报出java.net.BindException: Address already in use: NET_Bind异常,表明端口号已被占用,则换一个1024到65535之间的端口号。

    • 点赞
    • 收藏
    • 分享
    • 文章举报
    我不是靓仔ing 发布了48 篇原创文章 · 获赞 1 · 访问量 1073 私信 关注
    内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
    标签: 
    相关文章推荐