TCP/IP协议Socket通信案例演示

在服务器端创建ServerScoket对象,并绑定端口号,用来让客户单进行访问,客户端创建Socket对象,绑定主机名(由于演示案例是在同一台电脑上进行,所以主机名用了"localhost")和端口号,服务器端监听客户单,通过输入流读取客户端发送的请求,输出流相应客户端请求。客户端通过输出流向服务器端发送请求,输出流读取服务器端相应信息。为了便于在控制条展示信息,输出流都用了打印流进行包装。

服务器端代码

/**
 * 服务端
 */
public class Server {
    public static void main(String[] args) {
        //创建服务器端ServerSocket
        try {
            ServerSocket serverSocket = new ServerSocket(8888);
            Socket socket = null;
            System.out.println("###服务器即将启动###");
            int count = 0;
            while (true) {
                //监听客户端请求
                socket = serverSocket.accept();

                //启动线程接收客户端请求
                ServerThread serverThread = new ServerThread(socket);
                serverThread.start();
                count++;
                System.out.println("客户端数量:" + count);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

服务器实际情况是永远不关闭,并且可以相应多个客户端的请求,这里用死循环和多线程进行模拟。

public class ServerThread extends Thread {

    Socket socket = null;

    public ServerThread(Socket socket) {
        this.socket = socket;
    }

    @Override
    public void run() {
        InputStream is = null;
        InputStreamReader isr = null;
        BufferedReader br = null;
        OutputStream os = null;
        PrintWriter pw = null;
        try {
            //获取输入流读取客户端发送的请求
            is = socket.getInputStream();

            //转换为字符流并包装为高效输入流
            isr = new InputStreamReader(is);
            br = new BufferedReader(isr);

            String info = null;
            while ((info = br.readLine()) != null) {
                System.out.println("我是服务器,客户端说:" + info);
            }
            socket.shutdownInput();

            //获得输出流,相应客户端请求
            os = socket.getOutputStream();
            //为了在控制台显示信息,这里转换为打印流
            pw = new PrintWriter(os);
            pw.write("服务器端接收到客户端请求");
            pw.flush();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (os != null) {
                    os.close();
                }
                if (br != null) {
                    br.close();
                }
                if (isr != null) {
                    isr.close();
                }
                if (is != null) {
                    is.close();
                }
                if (pw != null) {
                    pw.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

客户端代码

/**
 * 客户端
 */
public class Client {
    public static void main(String[] args) {
        try {
            //创建客户端Socket,指定主机名和端口号
            Socket socket = new Socket("localhost", 8888);
            //获得输出流
            OutputStream os = socket.getOutputStream();
            //转换为打印输出流
            PrintWriter pw = new PrintWriter(os);

            pw.write("用户名:admin,  密码:789");
            pw.flush();
            socket.shutdownOutput();

            //获得输入流接收服务器端相应内容
            InputStream is = socket.getInputStream();
            InputStreamReader ist = new InputStreamReader(is);
            BufferedReader br = new BufferedReader(ist);

            String data = null;
            while ((data = br.readLine()) != null) {
                System.out.println("服务器说:" + data);
            }

            //关闭流和资源
            is.close();
            ist.close();
            br.close();
            br.close();
            pw.close();
            os.close();
            socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

结果展示:

每请求一次,客户端信息更改一次,用来模拟多用户操作

注意:必须先启动服务器端,再启动客户端

启动服务器端信息展示

启动客户端:

这时客户端会向服务器端发送请求,服务器端做出相应的相应

在看服务器端控制台

服务器端接收到了客户端的请求信息

更改客户端请求信息,模拟多客户端请求

猜你喜欢

转载自blog.csdn.net/weixin_39999535/article/details/82191539