韫钰笔记--java-网络编程知识

本文介绍了BS(Browser/Server)和CS(Client/Server)两种网络架构模式的区别,包括开发维护成本、客户端负载、安全性和应用范围。同时,深入探讨了TCP的三次握手和四次挥手过程,详细解析了网络连接的建立与关闭。此外,还展示了Socket编程中ServerSocket和Socket的使用,以及相关的方法如accept、getHostAddress和getHostName等。
摘要由CSDN通过智能技术生成

网络编程知识

BS:Browser/Server 浏览器/服务器模式

CS: Client/Server(客户机/服务器)结构。

区别

  1. 开发维护成本 cs开发维护成本高于bs。因为采用cs结构时,对于不同的客户端要开发不同的程序,而且软件安装调试和升级都需要在所有客户机上进行。 bs只需要将服务器上的软件版本升级,然后从新登录就可以了。

  2. 客户端负载 cs客户端负载大。cs客户端不仅负责和用户的交互,收集用户信息,而且还需要通过网络向服务器发出请求。 bs把事务处理逻辑部分交给了服务器,客户端只是负责显示。

  3. 安全性 cs安全性高。cs适用于专人使用的系统,可以通过严格的管理派发软件。 bs使用人数多,不固定,安全性低。

  4. 作用范围 Client/Server是建立在局域网的基础上的。Browser/Server是建立在广域网的基础上的。

三次握手

第一次握手:Client将SYN置1,随机产生一个初始序列号seq发送给Server,进入SYN_SENT状态; 第二次握手:Server收到Client的SYN=1之后,知道客户端请求建立连接,将自己的SYN置1,ACK置1,产生一个acknowledge number=sequence number+1,并随机产生一个自己的初始序列号,发送给客户端;进入SYN_RCVD状态; 第三次握手:客户端检查acknowledge number是否为序列号+1,ACK是否为1,检查正确之后将自己的ACK置为1,产生一个acknowledge number=服务器发的序列号+1,发送给服务器;进入ESTABLISHED状态;服务器检查ACK为1和acknowledge number为序列号+1之后,也进入ESTABLISHED状态;完成三次握手,连接建立。

四次挥手

第一次挥手:Client将FIN置为1,发送一个序列号seq给Server;进入FIN_WAIT_1状态; 第二次挥手:Server收到FIN之后,发送一个ACK=1,acknowledge number=收到的序列号+1;进入CLOSE_WAIT状态。此时客户端已经没有要发送的数据了,但仍可以接受服务器发来的数据。 第三次挥手:Server将FIN置1,发送一个序列号给Client;进入LAST_ACK状态; 第四次挥手:Client收到服务器的FIN后,进入TIME_WAIT状态;接着将ACK置1,发送一个acknowledge number=序列号+1给服务器;服务器收到后,确认acknowledge number后,变为CLOSED状态,不再向客户端发送数据。客户端等待2*MSL(报文段最长寿命)时间后,也进入CLOSED状态。完成四次挥手。

 详细参考:视频讲解

讲解TCP三次握手四次挥手问题

网络分层图:

Socket:网络之间的通信

ServerSocket:服务器 Socket:客户端

accept:监听接收请求,创建连接

getHostAddress():返回文本显示IP地址

getHostName():获取IP地址的主机名

代码实例:

//User类
public class User implements Serializable {
    private String name;
    private String password;
    有参、无参、get、set。。。。
}
​
//提取出来的LoginThread
public class LoginThread extends Thread{
    Socket sk = null;
​
    public LoginThread(Socket sk) {
        this.sk = sk;
    }
​
    public void run(){
        try {
        //通过输入流获取请求(返序列化)
        InputStream is = sk.getInputStream();
        ObjectInputStream ois = null;
            ois = new ObjectInputStream(is);
​
        User user = (User)ois.readObject();
        System.out.println("客户端说:"+user.getName()+"-"+user.getPassword());
​
        //获取客户端IP
        InetAddress id = sk.getInetAddress();
        String ip = id.getHostAddress();
        System.out.println("用户Ip为:"+ip);
​
         //用输入流给与响应
        OutputStream os = sk.getOutputStream();
        String si = "登录成功!";
        os.write(si.getBytes());
​
        os.close();
        ois.close();
        is.close();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
​
//服务器 LoginServer
public class LoginServer {
    public static void main(String[] args) {
        try {
            //创建Socket对象
            ServerSocket ss = new ServerSocket(1314);
            //通过accpet方法来监听服务,创建连接
            while (true){
                Socket sk = ss.accept();
                LoginThread lt = new LoginThread(sk);
                lt.start();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
    //输出
    客户端说:admin-1234
    Ip为127.0.0.1
    客户端说:zhangsan-1234
    Ip为127.0.0.1
    
//客户端
public class LoginClent {
    public static void main(String[] args) {
        try {
            //创建客户端Socket对象
            Socket sk = new Socket("localhost",1314);
            //创建输出流对象
            OutputStream os = sk.getOutputStream();
            //通过对象发送信息给服务端
            ObjectOutputStream oos = new ObjectOutputStream(os);
            User user = new User("admin", "1234");
            oos.writeObject(user);
​
            //关闭之前的输出流
            sk.shutdownOutput();//半关闭状态
            //通过输入流接收响应
            InputStream is = sk.getInputStream();
            BufferedReader bf = new BufferedReader(new InputStreamReader(is, "utf-8"));
            String str;
            while ((str = bf.readLine())!=null){
                System.out.println("服务器响应说:"+str);
            }
​
            bf.close();
            is.close();
            oos.close();
            os.close();
            sk.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
    //输出
    服务器响应说:登录成功!

未完待续。。

个人笔记--也摘抄了来自个网站的资源和自己总结

                                              感谢默默的陪伴

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值