• 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
  • 相关阅读:
    Ruby的Integer数据类型
    InfoPath设计优化
    深入浅出SharePoint——TimeJob编程
    深入浅出SharePoint——操作Item权限类
    深入浅出Powershell——添加用户或群组到群组中
    深入浅出PowerShell——更新List Item中的PeopleandGroup 域值
    使用TimeJob
    深入浅出InfoPath——动态获取InfoPath中的命名空间
    ContentType大展拳脚——定义List
    PowerShell深入浅出——增加账号到管理员群组
  • 原文地址:https://www.cnblogs.com/xuyiqing/p/8340623.html
Copyright © 2020-2023  润新知