zoukankan      html  css  js  c++  java
  • ##网络编程的优化:如何利用线程优化服务端和客户端

    服务端的代码:

    一般在程序的运行过程中,我们的服务器是从来不会停止运行,因为也不可能每个客户运行的时候,他打开接收下,那么怎么做呢?

      1,首先我们要让socket对象在调用accept监听方法的时候给他一个死循环

      2,监听的时候,我们创建线程,这样就要考虑线程安全的问题

      3,socket对象的作用域

      4,我们在平时网上下载东西的时候,会看到一大串数字,那么这个是由什么造成的,为什么每次下载的都不一样呢?

        随机数

      5,最后服务端接到客户端的请求之后,我们还要给客户端一个回复

    public class TCPServer {
        public static void main(String[] args) throws IOException {
            //新建一个服务器接收的地址
            File file = new File("d:\upload");
            //判断是否这个文件是否存在,如果不存在,那么新建一个
            if(file.exists()!=true){
                file.mkdir();
            }
            //新建一个服务端的对象。并确定端口号
            ServerSocket server = new ServerSocket(9999);
            //创建一个死循环,让服务器不会停止
            while(true){
                //让服务器处于不断监听的状态
                Socket socket = server.accept();
                //创建线程并重写run方法
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        //把socket对象放在成员变量的位置,提升作用域
                        InputStream is = null;
                        try {
                            //解决线程安全
                            is = socket.getInputStream();
                            //重新定义一个照片名字,并生成随机数和当前毫秒值
                            String fileName="kgc"+System.currentTimeMillis()+new Random().nextInt(999999)+".jpg";
                            //网络输出流的名字
                            FileOutputStream fos = new FileOutputStream(file.toString()+"\"+fileName);
                            //定义个数组
                            byte[]bytes=new byte[1024];
                            int len=0;
                            while((len=is.read(bytes))!=-1){
                                fos.write(bytes,0,len);
                            }
                            //服务端的对象收到客户端的请求之后,会给他一个回复,这里用getoutStream
                            OutputStream os = socket.getOutputStream();
                            os.write("收到了!".getBytes());//写的内容转换成字节数组
                            fos.close();
                            socket.close();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                }).start();
    
            }
    
        }
    }

    这个是客户端的代码:

      注意:

      1,首先我们要创建一个要上传的文件的路径

      2,新建socket对象,并给出IP地址和端口号

      3,进行读,写

        注意:在客户端读文件的大小的时候,一定要注意如果字节读完之后,就是null值,程序会陷入一个死循环

        这里需要用到一个方法  shutdownOutput();

      4,把服务端发过来的信息,读取出来,并转换成字符串

    public class TCPLIent {
        public static void main(String[] args) throws IOException {
            FileInputStream fis = new FileInputStream("d:\ruirui.jpg");
            Socket socket = new Socket("127.0.0.1",9999);
            OutputStream os = socket.getOutputStream();
            byte [] bytes=new byte[1024];
            int len=0;
            while((len=fis.read(bytes))!=-1){
                os.write(bytes,0,len);
            }
            socket.shutdownOutput();
            InputStream is = socket.getInputStream();
            int le=0;
            while((le=is.read(bytes))!=-1){
                System.out.println(new String(bytes,0,le));
            }
            fis.close();
            socket.close();
        }
    }
  • 相关阅读:
    hdu6162 Ch’s gift
    hdu 6166 Senior Pan
    bzoj2818 Gcd
    hdu6127 Hard challenge
    splay伸展树模板
    2016-2017 National Taiwan University World Final Team Selection Contest J
    2016-2017 National Taiwan University World Final Team Selection Contest C
    使用powershell管理域用户
    EGL Driver message (Critical) eglInitialize: No available renderers.
    Python实现telnet命令测试防火墙
  • 原文地址:https://www.cnblogs.com/liurui-bk517/p/10951725.html
Copyright © 2011-2022 走看看