socket编程

实例一:

一个客户端和服务器端进行数据交互的简单例子,客户端输入正方形的边长,服务器端接收到后计算面积并返回给客户端,通过这个例子可以初步对Socket编程有个把握。

  • 服务器端
  • public class SocketServer {
        public static void main(String[] args) throws IOException {
    
            // 端口号
            int port = 7000;
            // 在端口上创建一个服务器套接字
            ServerSocket serverSocket = new ServerSocket(port);
            // 监听来自客户端的连接
            Socket socket = serverSocket.accept();
    
            DataInputStream dis = new DataInputStream(
                    new BufferedInputStream(socket.getInputStream()));
    
            DataOutputStream dos = new DataOutputStream(
                    new BufferedOutputStream(socket.getOutputStream()));
    
            do {
                double length = dis.readDouble();
                System.out.println("服务器端收到的边长数据为:" + length);
                double result = length * length;
                dos.writeDouble(result);
                dos.flush();
            } while (dis.readInt() != 0);
    
            socket.close();
            serverSocket.close();
        }
    }

     

  • 客户端
  • public class SocketClient {
        public static void main(String[] args) throws UnknownHostException, IOException {
    
            int port = 7000;
            String host = "localhost";
    
            // 创建一个套接字并将其连接到指定端口号
            Socket socket = new Socket(host, port);
    
            DataInputStream dis = new DataInputStream(
                    new BufferedInputStream(socket.getInputStream()));
    
            DataOutputStream dos = new DataOutputStream(
                    new BufferedOutputStream(socket.getOutputStream()));
    
            Scanner sc = new Scanner(System.in);
    
            boolean flag = false;
    
            while (!flag) {
    
                System.out.println("请输入正方形的边长:");
                double length = sc.nextDouble();
    
                dos.writeDouble(length);
                dos.flush();
    
                double area = dis.readDouble();
    
                System.out.println("服务器返回的计算面积为:" + area);
    
                while (true) {
    
                    System.out.println("继续计算?(Y/N)");
    
                    String str = sc.next();
    
                    if (str.equalsIgnoreCase("N")) {
                        dos.writeInt(0);
                        dos.flush();
                        flag = true;
                        break;
                    } else if (str.equalsIgnoreCase("Y")) {
                        dos.writeInt(1);
                        dos.flush();
                        break;
                    }
                }
            }
            socket.close();
        }
    }

    实例二

  • 可以看到上面的服务器端程序和客户端程序是一对一的关系,为了能让一个服务器端程序能同时为多个客户提供服务,可以使用多线程机制,每个客户端的请求都由一个独立的线程进行处理。下面是改写后的服务器端程序。
  • public class SocketServerM {
        public static void main(String[] args) throws IOException {
    
            int port = 7000;
            int clientNo = 1;
    
            ServerSocket serverSocket = new ServerSocket(port);
    
            // 创建线程池
            ExecutorService exec = Executors.newCachedThreadPool();
    
            try {
    
                while (true) {
                    Socket socket = serverSocket.accept();
                    exec.execute(new SingleServer(socket, clientNo));
                    clientNo++;
                }
    
            } finally {
                serverSocket.close();
            }
    
        }
    }
    
    class SingleServer implements Runnable {
    
        private Socket socket;
        private int clientNo;
    
        public SingleServer(Socket socket, int clientNo) {
            this.socket = socket;
            this.clientNo = clientNo;
        }
    
        @Override
        public void run() {
    
            try {
    
                DataInputStream dis = new DataInputStream(
                        new BufferedInputStream(socket.getInputStream()));
    
                DataOutputStream dos = new DataOutputStream(
                        new BufferedOutputStream(socket.getOutputStream()));
    
                do {
    
                    double length = dis.readDouble();
                    System.out.println("从客户端" + clientNo + "接收到的边长数据为:" + length);
                    double result = length * length;
                    dos.writeDouble(result);
                    dos.flush();
    
                } while (dis.readInt() != 0);
    
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                System.out.println("与客户端" + clientNo + "通信结束");
                try {
                    socket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    上面改进后的服务器端代码可以支持不断地并发响应网络中的客户请求。关键的地方在于多线程机制的运用,同时利用线程池可以改善服务器程序的性能。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值