基于Java实现客户端与服务器的多线程交互

首先实现客户端

1.新建一个客户端对象socket,绑定服务器
2.使用socket对象的getOutputStream方法来获取网络字节输出流OutputStream对象
3.使用OutputStream对象的Write方法来给服务器发送数据
4.使用socket对象的getInputStream方法来获取网络字节输入流InputStream对象
5.使用网络字节输入流InputStream的方法read,来读取服务器发送来的数据
6.释放资源
 public static void main(String[] args) throws IOException {
        //1.新建一个客户端对象socket,绑定服务器
        Socket socket = new Socket("127.0.0.1", 8888);
        //2.使用socket对象的getOutputStream方法来获取网络字节输出流OutputStream对象
        OutputStream os = socket.getOutputStream();
        //3.使用OutputStream对象的Write方法来给服务器发送数据
        os.write("你好,服务器!".getBytes());
        //4.使用socket对象的getInputStream方法来获取网络字节输入流InputStream对象
        InputStream is = socket.getInputStream();
        //5.使用网络字节输入流InputStream的方法read,来读取服务器发送来的数据
        byte[]bytes = new byte[1024];
        int len = is.read(bytes);
        System.out.println(new String(bytes,0,len));
        //6.释放资源
        os.close();
    }

实现服务器:

1.创建服务器Server对象,且绑定客户端指定的的端口号
2.使用ServerSocket对象的的accept方法来获取到客户端的对象Socket
3.使用Socket对象的方法getInputStream来获取网络字节输入流InputStream对象
4.使用网络字节输入流InputStream对象的方法read,读取客户端发送来的数据
5.使用Socket对象的方法getOutputStream来获取网络字节输入流OutputStream对象
6.使用网络字节输出流OutputStream对象的方法write,给客户端发送数据
7.释放资源(socket,server)
public static void main(String[] args) throws IOException {
        //1.创建服务器Server对象,且绑定客户端指定的的端口号
        ServerSocket server = new ServerSocket(8888);
        //2.使用ServerSocket对象的的accept方法来获取到客户端的对象Socket
        Socket socket = server.accept();
        //3.使用Socket对象的方法getInputStream来获取网络字节输入流InputStream对象
        InputStream is = socket.getInputStream();
        //4.使用网络字节输入流InputStream对象的方法read,读取客户端发送来的数据
        byte[]bytes = new byte[1024];
        int len = is.read(bytes);
        System.out.println(new String(bytes,0,len));
        //5.使用Socket对象的方法getOutputStream来获取网络字节输入流OutputStream对象
        OutputStream os = socket.getOutputStream();
        //6.使用网络字节输出流OutputStream对象的方法write,给客户端发送数据
        os.write("你好,客户端,我是服务器.".getBytes());
        //7.释放资源(socket,server)
        socket.close();
        server.close();
    }

对服务器端进行优化:
1.通过使用while循环来使服务器进程不会在提供完成某一次服务后自动关闭.
2.使用多线程来使服务器端具备并发服务能力.

代码实现如下:

public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = new ServerSocket(8888);

        //使用循环来使程序一直运行下去
        while (true){
            Socket socket = serverSocket.accept();

            //增加效率,使用多线程
            new Thread(new Runnable() {
                @Override
                public void run() {
                    try{
                        InputStream is = socket.getInputStream();
                        File file = new File("C:\\Users\\asus\\Desktop\\upload");
                        if (!file.exists()){
                            file.mkdirs();
                        }

                        //生成文件名字
                        FileOutputStream fos = new FileOutputStream("C:\\Users\\asus\\Desktop\\upload\\"+System.currentTimeMillis()+".jpg");

                        //接收客户端发送到内容
                        int len = 0;
                        byte[] bytes = new byte[1024];
                        while ((len = is.read(bytes)) != -1){
                            fos.write(bytes,0,len);
                        }

                        //告诉客户端上传完成
                        OutputStream os = socket.getOutputStream();
                        os.write("文件上传成功!".getBytes());

                        //释放资源
                        fos.close();
                        socket.close();

                    }catch (Exception e){
                        System.out.println(e);
                    }

                }
            }).start();

        }

    }

注意:
1.如果想要实现交互,需把客户端创建socket对象时的端口号与服务器的端口号保持一致.
2.需要先开启客户端程序,然后开启服务器端程序,顺序不可颠倒.

你可能感兴趣的:(Java学习)