网络编程之TCP例子一(帅帅老师讲堂)

例:客户端文本文件,服务器输出文本文件了(文件上传)

package com.simple_tcp4;

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

/*
* 通过键盘录入让服务器端收到消息
* 通过文本文件输入
*
* shutDownOutputStream()
* */
public class TcpSenderDemo {
    public static void main(String[] args) {

        try(    //socket能关闭,流资源也会关闭
                ////发送资源,发起连接请求
                Socket socket = new Socket("192.168.3.76",7777);
                //new一个输入流,读文件,用BufferefReader包装一下
                BufferedReader br = new BufferedReader(new InputStreamReader(
                        new FileInputStream("D:\\javaEE\\Inet4\\src\\com\\simple_tcp2\\TcpSenderDemo.java")))

                ) {
           //把字符串读进来
           // String s = br.readLine();
            //创建流
            //拿到发送端的OutputStream,准备发送数据到接收端
            OutputStream out = socket.getOutputStream();
            //把OutputStream包装成缓冲流
            BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(out));
            String s1=null;
            while ((s1 = br.readLine())!= null){
                bw.write(s1);
                //如果接收到通过readLine来接受消息,newLine必不可少
                bw.newLine();//换行符分隔
                //因为此处使用的输入流是标准输入流,不能放在循环外,否则会执行不到

            }
            bw.flush();
            socket.shutdownOutput();//关闭发送端
            byte[] buffer = new byte[1024];
            InputStream inputStream = socket.getInputStream();
            //Socket流中的read方法为阻塞方法
            int len = inputStream.read(buffer);
            System.out.println(new String(buffer , 0 ,len));

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
package com.simple_tcp4;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
/*
* 数据接收服务端:
* 在读取文件内容完毕后,由于当前接收端socket的
* 输入流中,没有数据了,于是,接收端的read阻塞(等待发送端继续发送数据到服务端)
*
* 发送端:
* 在发送完数据后,紧接着,准备从服务端接收回馈信息(“文件上传成功”)
* 但是服务因为处在阻塞状态(等着),这样一来,发送端接收不到服务端的回馈,一直阻塞在read方法
*
*解决方案1:
*1、自定义结束标志。比如“over"(在要传输的文本文件后添加一个over标志)  有缺陷1
*2、禁用套接字socket输出流,对于TCP套接字,任何以前了写入的数据都被发送,并
*   且后跟Tcp的正常连接终止序列。如果套接字调用shutdownOutput()后跟写入套接字输出流
*   则该流将抛出IOException
 *  */
public class TcpReceiverDemo {
    public static void main(String[] args) {
        try (
                ServerSocket serverSocket = new ServerSocket(7777);
                Socket accpet = serverSocket.accept();
        ){
            InputStream in = accpet.getInputStream();
            BufferedReader br = new BufferedReader(new InputStreamReader(in));
            FileOutputStream fileout = new FileOutputStream("b.txt",true);

            String s =null;

            //此处readLine也是阻塞方法,一开始有数据的时候,也在不停地传输数据
           //数据读完后会阻塞
            /*
            *  s = br.readLine())!=null
             *  1、执行br.readLine()   【一旦流中没有数据,就在readLine中阻塞】
             *  2、当br.readLine()方法返回后,将返回值赋值给s
             *  3、s的值是否1等于null
             *  */
            while((s = br.readLine())!= null){
              //  System.out.println("接收到信息:"+s);
                //自定义结束标志
               /* if("over".equals(s)) {
                   break;
               }*/
                s += "\n";
                fileout.write(s.getBytes());

            }

            //此时接收端没有数据时,会一直阻塞在这里,而下边进程会一直在等待
            //给输出端一个回应
            OutputStream outputStream = accpet.getOutputStream();
            outputStream.write("文件上传完毕!".getBytes());

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值