Socket客户端和ServerSocket服务器端数据交互

目录

  • 一、单次数据交互
    • 1.客户端+服务器端(字节流版)
    • 2.客户端+服务器端(字节流+字节缓冲流版)
  • 二、多次数据交互
  • 三、多次+多线程数据交互

一、单次数据交互

1.客户端+服务器端(字节流版)
/**
 * 客户端(字节流版)
 */
public class TCPClient {
    public static void main(String[] args) {
        TCPClient.clientStart();
    }

    private static void clientStart(){
        Socket socket = null;
        OutputStream os = null;
        InputStream is = null;
        try {
            //1.创建客户端对象Socket
            socket = new Socket("127.0.0.1",8888);
            //2.使用Socket对象中的方法getOutputStream获取网络字节输出流OutputStream对象
            os = socket.getOutputStream();
            //3.使用网络字节输出流OutputStream对象的write(),给服务器发送数据
            os.write("服务器,你好!".getBytes());
            os.flush();

            //4.使用Socket对象中的getInputStream()获取网络字节输入流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));
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            try {
                //6.释放资源
                is.close();
                os.close();
            }catch (IOException e){
                e.printStackTrace();
            }
        }
    }
}
/**
 * 服务器端(字节流版)
 */
public class TCPServer {
    public static void main(String[] args){
        TCPServer.serverStart();
    }

    private static void serverStart(){
        Socket socket = null;
        ServerSocket serverSocket = null;
        try {
            //1.创建服务器ServerSocket对象,向系统要指定的端口号
            serverSocket = new ServerSocket(8888);
            //2.使用ServerSocket对象中的accept(),获取到请求的客户端Socket对象
            socket = serverSocket.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());
            os.flush();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            try {
                //7.释放资源(Socket,ServerSocket)
                socket.close();
                serverSocket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
2.客户端+服务器端(字节流+字节缓冲流版)
/**
 * 客户端(字节流+字节缓冲流版)
 */
public class TCPClient {
    public static void main(String[] args) {
        TCPClient.clientStart1();
    }

    /**
     * 含缓冲流
     */
    private static void clientStart1() {
        Socket socket = null;
        try {
            socket = new Socket("127.0.0.1",8888);
            //向服务器发送信息
            DataOutputStream pos = new DataOutputStream(socket.getOutputStream());
            pos.writeUTF("你好服务器");
            pos.flush();
            //接受服务器返回的信息
            DataInputStream dis = new DataInputStream(new BufferedInputStream(socket.getInputStream()));
            System.out.println("服务器返回的信息===>" + dis.readUTF());
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            try{
                //释放资源
                socket.close();
            }catch (IOException e){
                e.printStackTrace();
            }
        }
    }
}
/**
 * 服务器端(字节流+字节缓冲流版)
 */
public class TCPServer {
    public static void main(String[] args){
        TCPServer.serverStart1();
    }

    /**
     * 含缓冲流
     */
    private static void serverStart1(){
        ServerSocket serverSocket = null;
        Socket socket = null;
        try {
            serverSocket = new ServerSocket(8888);
            socket = serverSocket.accept();
            //接收客户端的信息
            DataInputStream dis = new DataInputStream(new BufferedInputStream(socket.getInputStream()));
            System.out.println("客户端信息===>" + dis.readUTF());
            //发送消息给客户端
            DataOutputStream pos = new DataOutputStream(socket.getOutputStream());
            pos.writeUTF("收到谢谢!!");
            pos.flush();
        }catch (IOException e){
            e.printStackTrace();
        }finally {
            try {
                //7.释放资源(Socket,ServerSocket)
                socket.close();
                serverSocket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }
}

二、多次数据交互

import java.io.*;
import java.net.Socket;

/**
 * 客户端
 */
public class TCPClient {
    public static void main(String[] args) {
        uploadLocalFile();
    }

    private static void uploadLocalFile() {
        //1.获取文件
        File localFile = new File("E:\\test.txt");
        if (!localFile.exists()) {
            System.out.println("需要读取的文件不存在");
            return;
        }
        Socket socket = null;
        InputStream isFile = null;
        OutputStream opsSocket = null;

        InputStream isSocket = null;
        try {
            //2.获取本地的文件流
            isFile = new FileInputStream(localFile);
            socket = new Socket("127.0.0.1", 8888);
            //3.获取socket的OutputStream对象
            opsSocket = socket.getOutputStream();
            int len;
            byte[] bytes = new byte[1024];
            //4.循环读取本地文件流——>输出到socket的OutputStream对象流中——>传到服务器
            while ((len = isFile.read(bytes)) != -1) {
                opsSocket.write(bytes, 0, len);
            }
            opsSocket.flush();

            //解决文件上传时,文件阻塞问题
            socket.shutdownOutput();

            //5.获取服务器返回信息的流
            isSocket = socket.getInputStream();
            bytes = new byte[1024];
            //6.输出服务器返回的信息
            while ((len = isSocket.read(bytes)) != -1) {
                System.out.println("===>>>服务器返回信息:" + new String(bytes, 0, len));
            }
            System.out.println("===>>>客户端结束");
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                opsSocket.close();
                isFile.close();
                isSocket.close();
                socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Random;

/**
 * 服务器端(持续启动)
 */
public class TCPServer {
    public static void main(String[] args){
        saveFile(true);
    }

    private static void saveFile(boolean init){
        String fileName;
        ServerSocket serverSocket = null;
        try {
            serverSocket = new ServerSocket(8888);
        } catch (IOException e) {
            e.printStackTrace();
        }
        //服务器持续启动
        while (true){
            if(init){
                System.out.println("====>>>服务器启动");
                init=false;
                continue;
            }
            fileName = "testSave_"+System.currentTimeMillis()+new Random().nextInt(9999)+".txt";
            //1.获取保存文件的路径
            File saveFile = new File("E:\\"+fileName);

            Socket socket = null;
            InputStream isSocket = null;
            OutputStream osFile = null;
            OutputStream osSocket = null;
            try{
                //2.获取客户端信息
                socket = serverSocket.accept();
                //3.获取socket的Inputstream对象——>获取从客户端传过来的文件流
                isSocket = socket.getInputStream();
                osFile = new FileOutputStream(saveFile);
                int len;
                byte[] bytes = new byte[1024];
                //4.输出客户端文件到本地
                while ((len=isSocket.read(bytes))!=-1){
                    osFile.write(bytes,0,len);
                }
                osFile.flush();

                //5.向客户端返回信息
                osSocket = socket.getOutputStream();
                osSocket.write("上传文件成功".getBytes());
                osSocket.flush();
                System.out.println("===>>>保存客户端传送的文件 结束");
            }catch (IOException e){
                e.printStackTrace();
            }finally {
                try {
                    osSocket.close();
                    osFile.close();
                    isSocket.close();
                    socket.close();
                    //serverSocket.close();//不需要关闭serverSocket
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

三、多次+多线程数据交互

import java.io.*;
import java.net.Socket;

/**
 * 客户端
 */
public class TCPClient {
    public static void main(String[] args) {
        uploadLocalFile();
    }

    private static void uploadLocalFile() {
        //1.获取文件
        File localFile = new File("E:\\test.txt");
        if (!localFile.exists()) {
            System.out.println("需要读取的文件不存在");
            return;
        }
        Socket socket = null;
        InputStream isFile = null;
        OutputStream opsSocket = null;

        InputStream isSocket = null;
        try {
            //2.获取本地的文件流
            isFile = new FileInputStream(localFile);
            socket = new Socket("127.0.0.1", 8888);
            //3.获取socket的OutputStream对象
            opsSocket = socket.getOutputStream();
            int len;
            byte[] bytes = new byte[1024];
            //4.循环读取本地文件流——>输出到socket的OutputStream对象流中——>传到服务器
            while ((len = isFile.read(bytes)) != -1) {
                opsSocket.write(bytes, 0, len);
            }
            opsSocket.flush();

            //解决文件上传时,文件阻塞问题
            socket.shutdownOutput();

            //5.获取服务器返回信息的流
            isSocket = socket.getInputStream();
            bytes = new byte[1024];
            //6.输出服务器返回的信息
            while ((len = isSocket.read(bytes)) != -1) {
                System.out.println("===>>>服务器返回信息:" + new String(bytes, 0, len));
            }
            System.out.println("===>>>客户端结束");
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                opsSocket.close();
                isFile.close();
                isSocket.close();
                socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Random;

/**
 * 服务器端(持续启动+多线程)
 */
public class TCPServerMultiThread {
    public static void main(String[] args){
        saveFile(true);
    }

    private static void saveFile(boolean init){
        ServerSocket serverSocket = null;
        try {
            serverSocket = new ServerSocket(8888);
        } catch (IOException e) {
            e.printStackTrace();
        }
        //服务器持续启动
        while (true){
            if(init){
                System.out.println("====>>>服务器启动");
                init=false;
                continue;
            }
            try{
                //2.获取客户端信息
                Socket socket = serverSocket.accept();

                //开启多线程
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        String fileName = "testSave_"+System.currentTimeMillis()+new Random().nextInt(9999)+".txt";
                        //1.获取保存文件的路径
                        File saveFile = new File("E:\\"+fileName);
                        InputStream isSocket = null;
                        OutputStream osFile = null;
                        OutputStream osSocket = null;
                        try{
                            //3.获取socket的Inputstream对象——>获取从客户端传过来的文件流
                            isSocket = socket.getInputStream();
                            osFile = new FileOutputStream(saveFile);
                            int len;
                            byte[] bytes = new byte[1024];
                            //4.输出客户端文件到本地
                            while ((len=isSocket.read(bytes))!=-1){
                                osFile.write(bytes,0,len);
                            }
                            osFile.flush();

                            //5.向客户端返回信息
                            osSocket = socket.getOutputStream();
                            osSocket.write("上传文件成功".getBytes());
                            osSocket.flush();
                            System.out.println("===>>>保存客户端传送的文件 结束");
                        }catch (IOException e){
                            e.printStackTrace();
                        }finally {
                            try{
                                osSocket.close();
                                osFile.close();
                                isSocket.close();
                                socket.close();
                            }catch (IOException e){
                                e.printStackTrace();
                            }
                        }
                    }
                }).start();
            }catch (IOException e){
                e.printStackTrace();
            }
            //不需要关闭serverSocket
            //serverSocket.close();
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值