(101)Tcp网络编程练习:上传文件、上传图片、用户登录

需求一上传文件
这个练习的难点是服务端的while不能结束,要通过以下三种方式可以使服务端知道文件已经上传完毕

package com.tcp4;
import java.io.*;
import java.net.*;
import java.util.*;
public class client4 {

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

        Socket s=new Socket("192.168.1.103",10003);

        //目的:服务端
        BufferedWriter bufw=new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));

        BufferedReader bufr=new BufferedReader(new FileReader("E:\\Circle.java"));

        String   line=null;

        //第二种解决方式:时间戳(就是用时间作为结束标记,时间具有唯一性)
        //做法:获取某个时间,然后告诉服务端,这个时间,后面的做法和方法一相同
        DataOutputStream dos=new DataOutputStream(s.getOutputStream());
        long l=System.currentTimeMillis();
        dos.writeLong(l);

        while((line=bufr.readLine())!=null)
        {
            bufw.write(line);
            bufw.newLine();
            bufw.flush();


        }
        //第三种做法(标准做法),
        s.shutdownOutput();//关闭客户端的输出流,相当于给流中加了结束标记-1

        //第一种解决方式:用特定字符作为结束标记,当服务器端读到over一行时,代表读完,跳出循环,继续后面的操作
       /* 但是若用特定的字符,容易和待复制的数据重复
        * bufw.write("over");
        bufw.newLine();
        bufw.flush();
        */

        /*第二种方式(在输出流最后写时间戳,作为服务端读的结束标记)
        bufw.write(l+"");
        bufw.newLine();
        bufw.flush();
        */
        BufferedReader bufrS=new BufferedReader(new InputStreamReader(s.getInputStream()));
        String str=bufrS.readLine();
        System.out.println(str);

        bufr.close();
        s.close();  
    }

}

package com.tcp4;
import java.io.*;
import java.net.*;
import java.util.*;
public class server4 {

    public static void main(String[] args)throws Exception {
        ServerSocket ss=new ServerSocket(10003);

        Socket s=ss.accept();
        String ip=s.getInetAddress().getHostAddress();
        System.out.println(ip+".....connect");

        //从客户端读数据
        BufferedReader bufr=new BufferedReader(new InputStreamReader(s.getInputStream()));

        //写入文件中(而不是客户端了啊)
        BufferedWriter bufw=new BufferedWriter(new FileWriter("e:\\copy.java"));



        //第二种方式。从客户端获得时间戳
        DataInputStream dis=new DataInputStream(s.getInputStream());
        long l=dis.readLong();
        String str=(l+"");

        String line=null;
        while((line=bufr.readLine())!=null)
        {
            //第一种解决方式
            /*if("over".equals(line))
                break;
            */
            /*第二种方式
            if(str.equals(line))
                break;
            */
            bufw.write(line);
            bufw.newLine();
            bufw.flush();

        }


      /*  OutputStream out=s.getOutputStream();
        byte[] buf="已经将文件复制成功哈哈哈哈".getBytes();
       // System.out.println(buf.toString());
         out.write(buf);
       */
        BufferedWriter bufwS=new BufferedWriter (new OutputStreamWriter(s.getOutputStream()));
        bufwS.write("数据复制成功");
        bufwS.newLine();
        bufwS.flush();

        bufw.close();
        s.close();


    }

}

二、上传文件是以字符流方式上传的,下面以上传图片为例字节流演示

import java.io.*;
import java.net.*;
public class client5 {

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

        Socket s=new Socket("192.168.1.103",10011);

        //读文件
        FileInputStream fis=new FileInputStream("e:\\a.png");

        //目的,服务端(写)
        OutputStream out=s.getOutputStream();


        int len=0;
        byte[]buf=new byte[1024];
        while((len=fis.read(buf))!=-1)
        {
            out.write(buf,0,len);
        }
        s.shutdownOutput();

        BufferedReader bufr=new BufferedReader(new InputStreamReader(s.getInputStream()));
        String str=bufr.readLine();
        System.out.println(str);


        fis.close();
        s.close();  
    }

}

import java.io.*;
import java.net.*;
public class server5 {

    public static void main(String[] args)throws Exception {
        ServerSocket ss=new ServerSocket(10011);
        Socket s=ss.accept();
        String ip=s.getInetAddress().getHostAddress();
        System.out.println(ip+"......connected");

        //从客户端读
        InputStream in=s.getInputStream();

        //写入磁盘中
        FileOutputStream fos=new FileOutputStream("copy.png");

        int len=0;
        byte[] buf=new byte[1024];

        while((len=in.read(buf))!=-1)
        {
            fos.write(buf,0,len);

        }

        BufferedWriter bufw=new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
        bufw.write("图片复制完毕");
        bufw.newLine();
        bufw.flush();

        fos.close();
        s.close();
        ss.close();

    }

}

需求三
客户端通过键盘录入用户名。
服务端对这个用户名进行校验。

如果该用户存在,在服务端显示xxx,已登陆。
并在客户端显示 xxx,欢迎光临。

如果该用户存在,在服务端显示xxx,尝试登陆。
并在客户端显示 xxx,该用户不存在。

最多就登录三次。

import java.io.*;
import java.net.*;
public class client {

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

        Socket s=new Socket ("192.168.1.103",10008);
        BufferedReader bufr=new BufferedReader(new InputStreamReader(System.in));

        //写入服务器
        BufferedWriter bufw=new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));

        //读取从服务器端返回的数据
        BufferedReader bufrS=new  BufferedReader(new InputStreamReader(s.getInputStream()));
        String line=null;
        for(int x=0;x<3;x++)
        {
           System.out.println("请输入用户名");
            line=bufr.readLine();

            //写入服务器中
            bufw.write(line);
            bufw.newLine();
            bufw.flush();   

            //判断是否登录成功
            String info=bufrS.readLine();
            System.out.println("infor"+info);
            if(info.contains("欢迎光临"))
            {
                 System.out.println(line+"该用户登陆成功");
                 break;
            }
        }
        s.close();


    }

}

import java.io.*;
import java.net.*;
public class server {
    public static void main(String[] args)throws Exception {

        ServerSocket ss=new ServerSocket(10008);
        Socket s=ss.accept();
        for(int x=0;x<3;x++)
        {
        //从客户端读
        BufferedReader bufr=new BufferedReader(new InputStreamReader(s.getInputStream()));

        //根据客户端数据读文件查询是否有这个人
        FileReader fr=new   FileReader("e:\\a.txt");
        BufferedReader bfr=new BufferedReader(fr);

        //对客户端反馈数据(写)
        BufferedWriter bufw=new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
        String name=bufr.readLine();
        String line=null;
        boolean flag=false;
        while((line=bfr.readLine())!=null)
        {
            if(name.equals(line))
            {
                flag=true;
                break;

            }
        }
        if(flag)
        {
            System.out.println(name+"已登陆登陆");
            bufw.write(name+"欢迎光临");
            bufw.newLine();
            bufw.flush();
            bfr.close();
            break;
        }
        else
        {
            System.out.println(name+"尝试登陆");
            bufw.write(name+"该用户不存在");
            bufw.newLine();
            bufw.flush();
        }

        }

        s.close();
        ss.close();



    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值