基于TCP/UDP的Socket网络通信系列之客户端与服务器的简单对话(三)

TCP协议是面向连接的可靠的有序的以字节流的方式发送数据
基于TCP协议实现网络通信的类主要有两个

  • 客户端的Socket类
  • 服务器端的ServerSocket类

一、Socket通信原理

纯属个人理解:

服务器,指定端口创建ServerSocket对象,执行accept()方法获取socket实例,并监听客户端消息
客户端,指定服务器地址和端口,创建 Socket实例

两段都通过获取的socket实例得到相应的输入输出流然后进行读写实现通信

二、简单的单一通信

这个列子很简单,没什么实际用处,但能说明原理问题

1、服务器端

package com.daqsoft.socket;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * Created by yanbo on 2017/6/15.
 * 基于TCP协议的Socket
 * 服务器端(早于客户端启动)
 * 创建步骤:  看下面
 */
public class Server {
    public static void main(String[] argss){
        try {
            //1、指定端口号创建ServerSocket对象。
            ServerSocket serverSocket = new ServerSocket(8888);//参数指定端口,端口建议指定1023以后的
            //2、ServerSocket对象调用accept()方法获取socket实例,开始监听,等待客户端的连接
            System.out.println("****服务器即将启动等待客户端的连接****");
            Socket socket = serverSocket.accept();//处于阻塞状态,等待客户端的监听
            //3、socket实例获取输入流读取客户端信息,通过输出流向客户端发送消息。
            InputStream is= socket.getInputStream();//字节输入流
            InputStreamReader isr = new InputStreamReader(is);//将字节流装换为字符流
            BufferedReader br = new BufferedReader(isr);//为输入流添加缓冲
            String info = null;
            while ((info = br.readLine()) !=null){//循环读取客户端信息
                System.out.println("我是服务器,客户端说-->"+info);
            }
            socket.shutdownInput();//关闭输入流

            //***********获取输出流向客户端发*******************************
            OutputStream os = socket.getOutputStream();
            PrintWriter pw = new PrintWriter(os);//将输出流包装为打印流
            pw.write("欢迎您!!!!");//我们要发送的信息
            pw.flush();//将缓冲输出
            //4关闭相应资源。
            br.close();
            is.close();
            isr.close();
            socket.close();
            serverSocket.close();
            pw.close();
            os.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

}

2、客户端

package com.daqsoft.socket;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;

/**
 * Created by yanbo on 2017/6/15.
 * 客户端
 * 创建步骤: 见下面
 */

public class Client {
    public static void main(String[] args) {
        try {
            //1、指定服务器地址和端口创建客户端Socket,
            Socket socket = new Socket("localhost", 8888);
            //2、客户端Socket获取输出流,向服务器发送信息,输入流获取服务器相应信息
            OutputStream os = socket.getOutputStream();//字节输出流
            PrintWriter pw = new PrintWriter(os);//将输出流包装为打印流
            pw.write("用户名:admin;密码 123");//我们要发送的信息
            pw.flush();//刷新缓存
            socket.shutdownOutput();//关闭输出流

            //*********获取输入流获取服务器相应信息**************

            InputStream is = socket.getInputStream();
            BufferedReader br = new BufferedReader(new InputStreamReader(is));
            String info = null;
            while ((info = br.readLine()) !=null){//循环读取客户端信息
                System.out.println("我是客户端,服务器说-->"+info);
            }
            //3关闭相关资源。
            pw.close();
            os.close();
            socket.close();
            is.close();
            br.close();

        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}

让后我们先启动服务器在启动客户端日志依次见下图

这里写图片描述

基于TCP/UDP的Socket网络通信系列之客户端与服务器的简单对话(三)_第1张图片

这里写图片描述

你可能感兴趣的:(【网络编程】)