IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> Java TCP协议下为什么服务器不能在接收玩文件后给客户端答复的解决方法? -> 正文阅读

[网络协议]Java TCP协议下为什么服务器不能在接收玩文件后给客户端答复的解决方法?

import java.io.*;
import java.net.InetAddress;
import java.net.Socket;
import java.util.Scanner;

//客户端代码

public class Client_home {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        try {
            System.out.println("我自己的IP:"+InetAddress.getLocalHost());
            InetAddress localHost = InetAddress.getLocalHost();
            Socket socket = new Socket(InetAddress.getLocalHost(),19999);
            //该线程用于发出图片文件
            new Thread(){
                @Override
                public void run() {
                    OutputStream os=null;
                    FileInputStream fis=null;
                    try {
                        os = socket.getOutputStream();
                        fis = new FileInputStream("C:\\Users\\17767\\Desktop\\屏幕截图 170946.png");
                        BufferedInputStream bis = new BufferedInputStream(fis);
                        byte[] b = new byte[1024];
                        int len;
                        while((len=bis.read(b))!=-1){
                            os.write(b,0,len);
                        }
                       //该处应该给服务器提示文件已经传输完毕,否则服务器一直在等待文件传输的循环中!!!
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                    finally{
                        try {
                            fis.close();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }.start();
            //该线程用于读取数据
            new Thread(){
                @Override
                public void run() {
                    try {
                        InputStream is = socket.getInputStream();
                        while(true){
                            byte[] b = new byte[100];
                            int len = is.read(b);
                            System.out.println(new String(b,0,len));
                        }
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }.start();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

上述代码是实现客户端向服务器端发送文件的,但是有一处注释我有写到文件传输完毕,没有任何提示,导致服务器能一直处于接收文件的状态下,下面我将会用服务器端进行测试

//服务器代码如下:
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {
    
    public static void main(String[] args) throws Exception {

        System.out.println("服务器开启");

        ServerSocket ss = new ServerSocket(19999);

        try {
            while (true) {
                System.out.println("-1");
                Socket s = ss.accept();
                //该线程用于接收用户上传的图片文件
                System.out.println("0");
                new Thread() {
                    @Override
                    public void run() {
                        FileOutputStream fos=null;
                        BufferedOutputStream bos=null;
                        try {
                            byte[] b = new byte[1024];
                            fos = new FileOutputStream("C:\\Users\\17767\\Desktop\\屏幕截图170946_copy.png");
                            bos = new BufferedOutputStream(fos);
                            InputStream is = s.getInputStream();
                            int len;
                            System.out.println("1");
                            while ((len = is.read(b)) != -1) {
                                System.out.println("100");
                                bos.write(b, 0, len);
                            }
                            System.out.println("2");
                            OutputStream os = s.getOutputStream();
                            System.out.println("3");
                            os.write("文件接收成功!".getBytes());
                            System.out.println("4");
                            os.flush();
                            System.out.println("5");
                        } catch (IOException e) {
                            e.printStackTrace();
                        }finally{
                            try {
                                bos.close();
                                fos.close();
                            } catch (IOException e) {
                                e.printStackTrace();
                            }
                        }
                    }
                }.start();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

因为运行的时候我发现,服务器无法回复客户端文件接收成功这句话,所以我添加了输出语句来判断到底是哪里代码没有走到,结果控制台只输出了如下代码:

?我们发现输出语句的"2","3","4","5" 迟迟没有走到,只有"100"在文件传输途中不停的出现,并且处于阻塞状态,所以我们得知文件在接收完毕后没有走出该循环.

于是我查询了1.6的API发现TCP的客户端还有一个方法可以结束输出语句,即:shutdownOutput

?我尝试将该方法增加到客户端上是,发现服务器能够正常输出"2","3","4","5",即接收代码块能正常运行到底了,不会出现阻塞状态了!(方法添加位置为客户端处,如下图)

?最终我成功的发现客户端的控制台上成功接收到,服务器发过来的语句:

?所以,在客户端代码上添加该方法成功解决该问题!!!

感谢您的观看!

?

?

?

?

?

?

?

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2021-10-20 12:51:43  更:2021-10-20 12:51:50 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年7日历 -2024/7/1 10:47:32-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码