java 网络编程——day24

来源:互联网 发布:网络直播版权 编辑:程序博客网 时间:2024/04/29 21:08

需求:上传图片

客户端:
1,端点
2,读取一个图片文件
3,通过socket输出流将数据发给服务端
4,读取服务端的反馈信息
5,关闭

package day24;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.InputStream;import java.io.OutputStream;import java.net.ServerSocket;import java.net.Socket;class PicClient {    public static void main(String[] args) throws Exception{        Socket s = new Socket("192.168.1.105",10011);        FileInputStream fis = new FileInputStream("c:\\b.jpg");        OutputStream out = s.getOutputStream();        byte[] buf = new byte[1024];        int len = 0;        while((len=fis.read(buf))!=-1){            out.write(buf,0,len);        }        s.shutdownOutput();        InputStream in = s.getInputStream();        byte[] bufIn = new byte[1024];        int num = in.read(bufIn);        System.out.println(new String(bufIn,0,num));        fis.close();        s.close();    }}class PicServer {    public static void main(String[] args) throws Exception{        ServerSocket ss= new ServerSocket(10011);        Socket s = ss.accept();        InputStream in = s.getInputStream();        FileOutputStream fos = new FileOutputStream("Sever.jpg");        byte[] buf = new byte[1024];        int len = 0;        while((len=in.read(buf))!=-1){            fos.write(buf,0,len);        }        OutputStream out = s.getOutputStream();        out.write("上传成功".getBytes());        fos.close();        s.close();        ss.close();    }}

这里写图片描述

利用多线程模仿服务器

以上例而言,
客户端:
1,端点
2,读取一个图片文件
3,通过socket输出流将数据发给服务端
4,读取服务端的反馈信息
5,关闭

服务端:
这个服务器有局限性,当A客户端连接上以后,被服务端获取到,服务端执行具体流程, 这时B服务端连接,只有等待。
因为服务端还没有处理完A客户端的请求,还没有回来执行下次accept方法。所以 暂时获取不到B客户端对象。

那么为了能让多个客户端同时并发访问服务端, 那么服务端最好就是将每个客户端封装到一个单独的线程中。 这样就可以同时处理多个客户端请求。

那么如何定义线程呢? 只要明确了每一个客户端要在服务端执行的代码即可。将该代码存入run方法中。

改进后的代码如下:

package day24;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.InputStream;import java.io.OutputStream;import java.net.ServerSocket;import java.net.Socket;class PicClient2 {    public static void main(String[] args) throws Exception {        if(args.length!=1){            System.out.println("请选择一个jpg格式的文件");            return;        }        File file = new File(args[0]);        if(!(file.exists() && file.isFile())){            System.out.println("该文件有问题,请重新选择");            return;        }        if(!file.getName().endsWith(".jpg")){            System.out.println("格式错误,请选择jpg格式文件");            return;        }        if(file.length()>1024*1024*5){            System.out.println("文件过大,请重新选择");        }        Socket s = new Socket("192.168.1.105", 10012);        FileInputStream fis = new FileInputStream(file);        OutputStream out = s.getOutputStream();        byte[] buf = new byte[1024];        int len = 0;        while ((len = fis.read(buf)) != -1) {            out.write(buf, 0, len);        }        s.shutdownOutput();        InputStream in = s.getInputStream();        byte[] bufIn = new byte[1024];        int num = in.read(bufIn);        System.out.println(new String(bufIn, 0, num));        fis.close();        s.close();    }}class PicThread implements Runnable {    private Socket s;    PicThread(Socket s) {        this.s = s;    }    public void run() {        String ip = s.getInetAddress().getHostAddress();        int count = 0;        try {            System.out.println(ip + "连接成功");            InputStream in = s.getInputStream();            File file = new File(ip+"("+(count)+")"+".jpg");            while(file.exists())                file = new File(ip+"("+(count++)+")"+".jpg");            FileOutputStream fos = new FileOutputStream(file);            byte[] buf = new byte[1024];            int len = 0;            while ((len = in.read(buf)) != -1) {                fos.write(buf, 0, len);            }            OutputStream out = s.getOutputStream();            out.write("上传成功".getBytes());            fos.close();            s.close();        } catch (Exception e) {            throw new RuntimeException(ip + "上传失败");        }    }}class PicServer2 {    public static void main(String[] args) throws Exception {        ServerSocket ss = new ServerSocket(10012);        while (true) {            Socket s = ss.accept();            new Thread(new PicThread(s)).start();        }//      ss.close();    }}

制作客户端并发登陆系统

需求: 客户端通过键盘录入姓名,服务端对这个用户名进行校验。
如果该用户存在,在服务端显示“xxx,已登录”
并在客户端显示“xxx,欢迎登陆!”

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

最多登陆三次。

package day24;import java.io.BufferedReader;import java.io.FileReader;import java.io.InputStreamReader;import java.io.PrintWriter;import java.net.ServerSocket;import java.net.Socket;class LoginClient {    public static void main(String[] args) throws Exception {        Socket s = new Socket("192.168.1.105", 10012);        BufferedReader bufr = new BufferedReader(new InputStreamReader(                System.in));        PrintWriter out = new PrintWriter(s.getOutputStream(), true);        BufferedReader bufIn = new BufferedReader(new InputStreamReader(                s.getInputStream()));        for (int x = 0; x < 3; x++) {            String line = bufr.readLine();            if (line == null)                break;            out.println(line);            String info = bufIn.readLine();            System.out.println("info:" + info);            if (info.contains("欢迎"))                break;        }        bufr.close();        s.close();    }}class UserThread implements Runnable {    private Socket s;    UserThread(Socket s) {        this.s = s;    }    public void run() {        String ip = s.getInetAddress().getHostAddress();        System.out.println(ip+"连接成功");        try {            for (int x = 0; x < 3; x++) {                BufferedReader bufIn = new BufferedReader(                        new InputStreamReader(s.getInputStream()));                String name = bufIn.readLine();                BufferedReader bufr = new BufferedReader(new FileReader(                        "user.txt"));                PrintWriter out = new PrintWriter(s.getOutputStream(),true);                String line = null;                boolean flag = false;                while ((line = bufr.readLine()) != null) {                    if (line.equals(name)) {                        flag = true;                        break;                    }                }                if(flag){                    System.out.println(name+",已登录");                    out.println(name+",欢迎登陆!");                    break;                }                else{                    System.out.println(name+",尝试登录");                    out.println(name+",用户名不存在");                }            }            s.close();        } catch (Exception e) {            throw new RuntimeException(ip+"校验失败");        }    }}class LoginServer {    public static void main(String[] args) throws Exception {        ServerSocket ss = new ServerSocket(10012);        while (true) {            Socket s = ss.accept();            new Thread(new UserThread(s)).start();        }    }}

用户端:
这里写图片描述

服务端
这里写图片描述

0 0
原创粉丝点击