【BigData】Java基础_socket编程

socket主要用于进行计算机之间进行通信,分为服务端与客户端。服务端启动后,处于监听端口等待状态,当客户端向服务端指定端口发送数据后,服务端收到数据后才会关闭连接。

以下是一个socket编程有浅到深逐渐递增难度的案例

一、最简单的scoket案例(单次发送与接收)

1.逐个接受字符

服务端:ServerDemo.java

package cn.test.logan.day13.one;

import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class ServerDemo {
    public static void main(String[] args) throws IOException {
        // 启动一个socket服务端(本质是向操作系统注册一个端口)
        ServerSocket ss = new ServerSocket(2050);
        System.out.println("端口为2050的服务端已经启动.....");
        // 监听端口消息
        Socket sc = ss.accept(); //等待并接受客户端请求,建立socket连接,此处是一个阻塞方法
        
        // 从连接中接受数据,首先需要获得一个输入流工具
        InputStream in = sc.getInputStream();
        
        // 从输入流中获取数据
        
        // 逐个字符打印
        int line = 0;
        while((line = in.read())!=-1) {
            System.out.println((char)line);
        }
            
        // 关闭流
        in.close();
        // 关闭socket
        sc.close();
        
    }
}

客户端:ClientDemo.java

package cn.test.logan.day13.one;

import java.io.OutputStream;
import java.net.Socket;

public class ClientDemo {
    public static void main(String[] args) throws  Exception {
        // 向服务端发出建立连接的请求
        Socket sc = new Socket("localhost",2050);
        //从连接拿到一个发数据的工具
        OutputStream out = sc.getOutputStream();
        // 利用out流发送数据
        out.write("hello".getBytes());
        // 关闭流
        out.close();
        // 关闭连接
        sc.close();
    }

}

 

 先运行服务端,当服务端处于监听状态后再运行客户端,输出结果如下:

 

 2.一次性接收多个字节数据

 

 只需要将1中的逐个字符打印这段代码修改为上图,则能实现一次性接收多个字节数据。运行后结果如下:

 二、实现多次交互

 

 服务端代码:ServiceDemo.java

package cn.test.logan.day13.three;

import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class ServiceDemo {
    public static void main(String[] args) throws Exception {
        // 启动一个socket服务端(本质是向操作系统注册一个端口)
        ServerSocket ss = new ServerSocket(9999);
        // 建立连接
        Socket sc = ss.accept();
        
        // 获取输入(输出)流工具,用于实现交互
        InputStream in = sc.getInputStream();
        OutputStream out = sc.getOutputStream();
        
        // 新建一个数组用于存储接收到信息
        byte[] b = new byte[1024];
        int num = 0;
        
        // 接收第1个问题
        num = in.read(b);
        System.out.println("第1次的问题是:"+new String(b,0,num));
        
        // 发送第1个答案
        out.write("我是logan".getBytes());
        
        // 接收第2个问题
        num = in.read(b);
        System.out.println("第2次的问题是:"+new String(b,0,num));
        // 发送第2个答案
        out.write("我22岁".getBytes());
        in.close();
       out.close();
        sc.close();
} }

 

 客户端代码:ClientDem.java

package cn.test.logan.day13.three;

import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;

public class ClientDemo {
    public static void main(String[] args) throws Exception {
        // 向服务端发出建立连接的请求
        Socket sc = new Socket("localhost",9999);
        //从连接拿到一个发数据的工具
        OutputStream out = sc.getOutputStream();
        
        // 发送第1个问题
        out.write("你是谁?".getBytes());
        
        // 接收第1个问题的答案
        InputStream in = sc.getInputStream();
        byte[] b = new byte[1024];
        int num = in.read(b);
        System.out.println("接收到第1个答案是:" + new String(b,0,num) );
        
        // 发送第2个问题
        out.write("你几岁了?".getBytes());
        // 接收第2个问题的答案
        num = in.read(b);
        System.out.println("接收到第2个答案是:" + new String(b,0,num) );
    in.close();
       out.close();
        sc.close(); } }

 

执行后输出结果:

客户端打印结果如下:

 

服务端打印结果如下:

 

 但是上述代码存在一个问题,两次交互完毕后,无论是客户端还是服务端程序都停止了,如果有其他客户端需要连接服务端,那就无法连接,为了避免这个问题,可以在服务端进行特殊控制

服务端改造后代码如下:

package cn.test.logan.day13.three;

import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class ServiceDemo {
    public static void main(String[] args) throws Exception {
        // 启动一个socket服务端(本质是向操作系统注册一个端口)
        ServerSocket ss = new ServerSocket(9999);
        
        int i = 1;
        while(true) {
            // 建立连接
            Socket sc = ss.accept();
            System.out.println("*******第"+i+"个客户端连接***********");
            // 获取输入(输出)流工具,用于实现交互
            InputStream in = sc.getInputStream();
            OutputStream out = sc.getOutputStream();
            
            // 新建一个数组用于存储接收到信息
            byte[] b = new byte[1024];
            int num = 0;
            
            // 接收第1个问题
            num = in.read(b);
            System.out.println("第1次的问题是:"+new String(b,0,num));
            
            // 发送第1个答案
            out.write("我是logan".getBytes());
            
            // 接收第2个问题
            num = in.read(b);
            System.out.println("第2次的问题是:"+new String(b,0,num));
            // 发送第2个答案
            out.write("我22岁".getBytes());
            in.close();
            out.close();
            sc.close();
            
            i++; // 为了记录客户端连接数
        }
        
    }
}

 

执行结果如下:(发起三次客户端后得到的结果)

 

posted @ 2020-01-04 16:46  OLIVER_QIN  阅读(222)  评论(0编辑  收藏  举报