zoukankan      html  css  js  c++  java
  • Java学习笔记53(网络编程:TCP协议案例)

    简易的案例

    客户端:

    package demo;
    
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.net.Socket;
    
    public class TCPClient {
        public static void main(String[] args) throws IOException {
            Socket socket = new Socket("127.0.0.1", 7000);
            OutputStream out = socket.getOutputStream();
            out.write("hello".getBytes());
            InputStream in = socket.getInputStream();
            byte[] data = new byte[1024];
            int len = in.read(data);
            System.out.println(new String(data, 0, len));
            socket.close();
        }
    }
    View Code

    服务器端:

    package demo;
    
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    public class TCPServer {
        public static void main(String[] args) throws IOException {
            ServerSocket server = new ServerSocket(7000);
            Socket socket = server.accept();
            InputStream in = socket.getInputStream();
            byte[] data = new byte[1024];
            int len = in.read(data);
            System.out.println(new String(data, 0, len));
            OutputStream out = socket.getOutputStream();
            out.write("收到".getBytes());
            socket.close();
            server.close();
        }
    }
    View Code

    先启动服务器端,再启动客户端,服务器端打印:hello,然后客户端打印:收到

    注意区分这里的流对象

    接下来在这个案例基础上做一个图片上传案例

    图片上传的本质就是文件复制

    客户端:

    package demo1;
    
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.net.Socket;
    
    public class TCPClient {
        public static void main(String[] args) throws IOException {
            Socket socket = new Socket("127.0.0.1", 7000);
            OutputStream out = socket.getOutputStream();
            FileInputStream fis = new FileInputStream("d:\666.jpeg");
            int len = 0;
            byte[] bytes = new byte[1024];
            while ((len = fis.read(bytes)) != -1) {
                out.write(bytes, 0, len);
            }
            socket.shutdownOutput();
            // 服务器端读不到-1,不会终止,调用这个方法可以终止
            InputStream in = socket.getInputStream();
            len = in.read(bytes);
            System.out.println(new String(bytes, 0, len));
            fis.close();
            socket.close();
        }
    }
    View Code

    服务器端:

    package demo1;
    
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.net.ServerSocket;
    import java.net.Socket;
    import java.util.Random;
    
    public class TCPServer {
        public static void main(String[] args) throws IOException {
            ServerSocket server = new ServerSocket(7000);
            Socket socket = server.accept();
            InputStream in = socket.getInputStream();
            File upload = new File("d:\upload");
            if (!upload.exists()) {
                upload.mkdirs();
            }
            String filename = System.currentTimeMillis() + new Random().nextInt(999999) + ".jpeg";
            FileOutputStream fos = new FileOutputStream(upload + File.separator + filename);
            // 这里是处理图片重名的问题
            byte[] bytes = new byte[1024];
            int len = 0;
            while ((len = in.read(bytes)) != -1) {
                fos.write(bytes, 0, len);
            }
            socket.getOutputStream().write("上传成功".getBytes());
            fos.close();
            socket.close();
            server.close();
        }
    }
    View Code

    如果多个客户端一起上传,就需要多线程的技术,每个客户端占一个线程

    客户端不需要修改

    服务器端:

    package demo1;
    
    import java.io.IOException;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    public class TCPServer {
        public static void main(String[] args) throws IOException {
            ServerSocket server = new ServerSocket(7000);
            while (true) {
                Socket socket = server.accept();
                new Thread(new Upload(socket)).start();
            }
        }
    }
    View Code
    package demo1;
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.net.ServerSocket;
    import java.net.Socket;
    import java.util.Random;
    
    public class Upload implements Runnable {
    
        private Socket socket;
    
        public Upload(Socket socket) {
            this.socket = socket;
        }
    
        public void run() {
            try {
                InputStream in = socket.getInputStream();
                File upload = new File("d:\upload");
                if (!upload.exists()) {
                    upload.mkdirs();
                }
                String filename = System.currentTimeMillis() + new Random().nextInt(999999) + ".jpeg";
                FileOutputStream fos = new FileOutputStream(upload + File.separator + filename);
                // 这里是处理图片重名的问题
                byte[] bytes = new byte[1024];
                int len = 0;
                while ((len = in.read(bytes)) != -1) {
                    fos.write(bytes, 0, len);
                }
                socket.getOutputStream().write("上传成功".getBytes());
                fos.close();
                socket.close();
            } catch (IOException ex) {
                System.out.println(ex);
            }
        }
    }
    View Code
  • 相关阅读:
    Vagrant安装virtualbox
    SQLSERVER排查CPU占用高的情况
    删除重复记录,只留一条
    ASCII码对应表chr(9)、chr(10)、chr(13)、chr(32)、chr(34)、chr(39)、……
    手机和PC端的录屏软件
    2017年初面试总结
    Python面向对象
    Python字体颜色
    Python第二模块总结
    Fiddler使用教程(转)
  • 原文地址:https://www.cnblogs.com/xuyiqing/p/8340623.html
Copyright © 2011-2022 走看看