Socket通信 ---模拟用户登录

版权声明:欢迎转载,若有不当之处请在评论中指出,共同交流。 https://blog.csdn.net/qq_33290787/article/details/52206628

相信Socket对大家都不陌生了,网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。我们平时接触的QQ,其聊天功能就是通过Socket实现的。简单点说,Socket就是通信的一种媒介。下面是Socket通信的原理图:

这里写图片描述

  1. 要建立Socket通信,首先要在服务器端建立一个ServerSocket对象对服务器的某个端口进行请求监听。
  2. 然后,客户端根据指定的服务器地址与端口创建连接的Socket对象发送连接请求。服务器接受到连接请求后会生成与之对应的Socket对象与该客户端Socket进行通信。
  3. 客户端的Socket对象与服务器中与之对应的Socket对象通过输入输出流进行信息交换,即通信。
  4. 通信结束后,关闭相关资源。

Server.java:

package SocketPackage;

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

/**
 * 基于TCP协议的Socket通信,模拟用户登录
 * 服务端
 */
public class Server {

    public static void main(String[] args){

        try{
            //服务端建立ServerSocket对象,用于监听指定的服务器端口56569
            ServerSocket serverSocket = new ServerSocket(56569);
            System.out.println(NowTime.now()+" Server "+serverSocket+" now starts to monitor");
            Socket socket = serverSocket.accept();//accept()方法开始监听,开始阻塞,直到有客户请求连接,返回Socket对象与客户端进行通信

            InputStream inputStream = socket.getInputStream();//获取字节输入流,接收客户端请求信息
            InputStreamReader inputStreamReader = new InputStreamReader(inputStream);//将字节流转换为字符流,提高读取的性能
            BufferedReader bufferedReader = new BufferedReader(inputStreamReader);//为字符输入流添加缓冲,以缓冲的方式进行数据读取
            String infoFromClient = null;
            while((infoFromClient=bufferedReader.readLine())!=null){
                System.out.println(NowTime.now()+" Server receives information from client:"+infoFromClient);
            }
            socket.shutdownInput();//关闭输入流

            OutputStream outputStream = socket.getOutputStream();//获取输出流,响应客户端的请求
            PrintWriter printWriter = new PrintWriter(outputStream);//将输出流包装成打印流
            printWriter.write("Welcome you!");
            printWriter.flush();//刷新缓存,向客户端发送信息
            socket.shutdownOutput();//关闭输出流

            //关闭资源
            printWriter.close();
            outputStream.close();
            bufferedReader.close();
            inputStreamReader.close();
            inputStream.close();
            socket.close();
            serverSocket.close();
        }
        catch (IOException e){
            e.printStackTrace();
        }
    }
}

Client.java:

package SocketPackage;

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

/**
 * 基于TCP协议的Socket通信,模拟用户登录
 * 客户端
 */
public class Client {
    public static void main(String[] args) {
        try {
            //客户端建立Socket对象,指定服务器地址与端口
            Socket socket = new Socket("127.0.0.1",56569);
            OutputStream outputStream = socket.getOutputStream();//获取字节输出流
            PrintWriter printWriter = new PrintWriter(outputStream);//将字节输出流包装成打印流
            printWriter.write("username:huangfugui,password:123");
            printWriter.flush();//刷新缓存,向服务器端发送信息
            socket.shutdownOutput();//关闭输出流

            InputStream inputStream = socket.getInputStream();//获取输入流,读取服务器发送的响应信息
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
            String infoFromServer = null;
            while ((infoFromServer = bufferedReader.readLine())!=null){
                System.out.println(NowTime.now()+" Client receives server information: "+infoFromServer);
            }
            socket.shutdownInput();//关闭输入流

            //关闭资源
            bufferedReader.close();
            inputStream.close();
            printWriter.close();
            outputStream.close();
            socket.close();
        }
        catch (UnknownHostException e1){
            e1.printStackTrace();
        }
        catch (IOException e2){
            e2.printStackTrace();
        }
    }
}

NowTime.java(得到当前时间):

package SocketPackage;

import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * Created by Administrator on 2016/8/14.
 */
public class NowTime {

    public static String now(){

        Date now = new Date();
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("HH:mm:ss");
        return simpleDateFormat.format(now);
    }
}

运行结果:

服务端:

这里写图片描述

客户端:

这里写图片描述


猜你喜欢

转载自blog.csdn.net/qq_33290787/article/details/52206628