##网络编程的优化:如何利用线程优化服务端和客户端

服务端的代码:

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

  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();
    }
}

 

posted @ 2019-05-30 19:58  阿锐互联网  阅读(263)  评论(0编辑  收藏  举报