栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

TCP通信程序的练习5

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

TCP通信程序的练习5

TCP通信程序的练习5
  • TCP通信程序的练习5
  • BUG系列(重点)
      • BUG1
      • BUG2
  • 正确的写法

TCP通信程序的练习5
  • 客户端:数据来自文本文件,接受服务器反馈
  • 服务器:接收的数据写入文本文件,给出反馈
  • 出现的问题:程序一直等待
  • 原因:读数据的方法是阻塞式的
  • 解决的方法:自定义结束标记。使用shutdownOutput()方法(推荐)
BUG系列(重点)

如果用于整人那真的很恶心!

BUG1
  1. ClientDemo类(客户端)
package Demo;

import java.io.*;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;

public class ClientDemo {
    public static void main(String[] args) throws IOException {
        //建立客户端
        Socket sgs = new Socket(InetAddress.getByName("sgs").getHostAddress(), 1110);
        //获取输出流,写数据,采取字符缓冲流(一次写入一行),接受服务器反馈
        BufferedReader br = new BufferedReader(new FileReader("C:\LianXi\java1.txt"));



        BufferedReader br1 = new BufferedReader(new InputStreamReader(sgs.getInputStream()));
        String line, line2;
        while ((line = br.readLine()) != null) {
            bw.write(line);
            bw.newLine();
            bw.flush();

        }

        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(sgs.getOutputStream()));

        //给出反馈信息
        while (((line2 = br1.readLine()) != null)) {
            System.out.println("服务器" + line2);

        }

            //释放资源
            sgs.close();
        }
}
  1. ServerDemo类(服务器)
package Demo;


import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

public class ServerDemo {
    public static void main(String[] args) throws IOException {
        //建立服务器
        ServerSocket sk = new ServerSocket(1110);

        //侦听此客户端套接字并建立连接
        Socket sgs = sk.accept();

        //获取输入流,读数据,并写入文本文件中
        BufferedReader br = new BufferedReader(new InputStreamReader(sgs.getInputStream()));

        BufferedWriter bw = new BufferedWriter(new FileWriter("c:\Lianxi\javaCopy.txt"));

        String line;
        while((line=br.readLine())!=null) {
            bw.write(line);
            bw.newLine();
            bw.flush();
        }
        //给客户端反馈信息
        BufferedWriter bw1 = new BufferedWriter(new OutputStreamWriter(sgs.getOutputStream()));
        bw1.write("已传输完成");
        bw1.newLine();
        bw1.flush();

        //释放资源
        sk.close();
    }
}
  • 输出的结果为:
  • 原因:!!(一定要看!!!!!!!!!!)
BUG2
  1. ClientDemo类(客户端)
package Demo;

import java.io.*;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;


public class ClientDemo {
    public static void main(String[] args) throws IOException {
        //建立客户端
        Socket sgs = new Socket(InetAddress.getByName("sgs").getHostAddress(), 1110);
        //获取输出流,写数据,采取字符缓冲流(一次写入一行),接受服务器反馈
        BufferedReader br = new BufferedReader(new FileReader("C:\LianXi\java1.txt"));

        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(sgs.getOutputStream()));

        String line, line2;
        while ((line = br.readLine()) != null) {
            bw.write(line);
            bw.newLine();
            bw.flush();

        }

        //自定义结束标记
        bw.write("886");
        bw.newLine();
        bw.flush();



        //给出反馈信息
        BufferedReader br1 = new BufferedReader(new InputStreamReader(sgs.getInputStream()));

        //给出反馈信息
        while (((line2 = br1.readLine()) != null)) {
            System.out.println("服务器" + line2);

        }

            //释放资源
            sgs.close();
        }
}
  1. ServerDemo类(服务器)
package Demo;


import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

public class ServerDemo {
    public static void main(String[] args) throws IOException {
        //建立服务器
        ServerSocket sk = new ServerSocket(1110);

        //侦听此客户端套接字并建立连接
        Socket sgs = sk.accept();

        //获取输入流,读数据,并写入文本文件中
        BufferedReader br = new BufferedReader(new InputStreamReader(sgs.getInputStream()));

        BufferedWriter bw = new BufferedWriter(new FileWriter("c:\Lianxi\javaCopy.txt"));


        String line;
        while((line=br.readLine())!=null) {
            if ("886".equals(line)){
                break;
            }
            bw.write(line);
            bw.newLine();
            bw.flush();
        }

        //给客户端反馈信息
        BufferedWriter bw1 = new BufferedWriter(new OutputStreamWriter(sgs.getOutputStream()));
        bw1.write("已传输完成");
        bw1.newLine();
        bw1.flush();

        //释放资源
        sk.close();
    }
}

  • 输出的结果为:

  • 原因!!!(重点)
    分析一:

分析二:
1

2

3

正确的写法

牵扯Socket类方法

方法名说明
void shutdownOutput();禁用此套接字的输出流(说白点就是作为结束的标记发送给"服务器"让服务器识别后也结束自己的代码)

ClientDemo类(客户端)

package Demo;

import java.io.*;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;


public class ClientDemo {
    public static void main(String[] args) throws IOException {
        //建立客户端
        Socket sgs = new Socket(InetAddress.getByName("sgs").getHostAddress(), 1110);
        //获取输出流,写数据,采取字符缓冲流(一次写入一行),接受服务器反馈
        BufferedReader br = new BufferedReader(new FileReader("C:\LianXi\java1.txt"));

        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(sgs.getOutputStream()));

        String line, line2;
        while ((line = br.readLine()) != null) {
            bw.write(line);
            bw.newLine();
            bw.flush();

        }

//        //自定义结束标记
//        bw.write("886");
//        bw.newLine();
//        bw.flush();

        //void shutdownOutput(); 禁用此套接字的输出流。
        sgs.shutdownOutput();


        //给出反馈信息
        BufferedReader br1 = new BufferedReader(new InputStreamReader(sgs.getInputStream()));

        //给出反馈信息
        while (((line2 = br1.readLine()) != null)) {
            System.out.println("服务器" + line2);

        }

            //释放资源
            sgs.close();
        }
}

ServerDemo类(服务器)

package Demo;


import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

public class ServerDemo {
    public static void main(String[] args) throws IOException {
        //建立服务器
        ServerSocket sk = new ServerSocket(1110);

        //侦听此客户端套接字并建立连接
        Socket sgs = sk.accept();

        //获取输入流,读数据,并写入文本文件中
        BufferedReader br = new BufferedReader(new InputStreamReader(sgs.getInputStream()));

        BufferedWriter bw = new BufferedWriter(new FileWriter("c:\Lianxi\javaCopy.txt"));


        String line;
        while((line=br.readLine())!=null) {//等待发送的数据
//            if ("886".equals(line)){
//                break;
//            }
            bw.write(line);
            bw.newLine();
            bw.flush();
        }

        //给客户端反馈信息
        BufferedWriter bw1 = new BufferedWriter(new OutputStreamWriter(sgs.getOutputStream()));
        bw1.write("已传输完成");
        bw1.newLine();
        bw1.flush();

        //释放资源
        sk.close();
    }
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/885633.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号