• JAVA基础-网络编程


    网络模型的基本概念

    一个简单的网络模型可分为以下5层:

    客户机服务器模型(client/server)

    可以简单画图如下:

    TCP/IP的概念

    TCP/IP:Transmission Control Protocol/Internet Protocol的简写。TCP 是传输控制协议的缩写,它保 障了两个应用程序之间的可靠通信。通常用于互联网协议,被称 TCP / IP。

    TCP三次握手(Three-way handshake) :所谓的“三次握手”即对每次发送的数据量是怎样跟踪进行协商使数据段的发送和接收同步,根据所接收到的数据量而确定的数据确认数及数据发送、接收完毕后何时撤消联系,并建立连接。

    1. 第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SENT状态,等待服务器确认; SYN:同步序列编号(Synchronize Sequence Numbers)。

    2. 第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1), 同时自己也发送一个SYN包(seq=k),即SYN+ACK包, 此时服务器进入SYN_RECV状态;

    3. 第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1), 此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功) 状态,完成三次握手。

    4. 完成三次握手,客户端与服务器开始传送数据

    TCP编程

    两个电脑之间的网络IO可以用上面的图表示:其中Socket是连接网卡和内存之间的桥梁。

    下面我们来写一个聊天室的基本案例:

    首先我们先写一个客户端和服务端的程序:

    package Chat;
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    public class ChatServer {
    
    /**
     * 服务器端
     * @param args
     */
    	public static void main(String[] args) {
    		//在端口8888上创建服务器连接
    		try {
    			ServerSocket serverSocket = new ServerSocket(8888);
    			System.out.println("服务器创建成功!");
    			//监听等待连接,一旦连接上,就会返回一个socket,是一个阻塞
    			Socket socket = serverSocket.accept();
    			//获得远程服务端的信息(IP+端口)
    			System.out.println(  socket.getRemoteSocketAddress()+"进入了聊天室!" );
    			//字节流-》字符流-》缓冲流
    			BufferedReader bReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
    			System.out.println( socket.getRemoteSocketAddress()+":"+bReader.readLine() );
    			
    			
    			
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    	}
    }
    
    
    package Chat;
    
    import java.io.IOException;
    import java.io.PrintWriter;
    import java.net.Socket;
    import java.net.UnknownHostException;
    
    import javax.sound.sampled.Port;
    
    public class ChatClinet {
    /**
     * 客户端
     */
    	public static void main(String[] args) {
    		//连接服务器,端口为服务器的启动端口,地址为服务器的IP地址
    		try {
    			//产生了随机的端口
    			Socket socket = new Socket( "127.0.0.1" ,8888);
    			//发送消息给服务器  输出流
    			//字节流转字符流
    			PrintWriter pWriter = new PrintWriter(socket.getOutputStream() );
    			pWriter.println("hello");
    			pWriter.flush();
    			
    		} catch (UnknownHostException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    	}
    	
    }
    
    
    输出:
    服务器创建成功!
    /127.0.0.1:58212进入了聊天室!
    /127.0.0.1:58212:hello
    
    
  • 相关阅读:
    【spring cloud】spring cloud zuul 路由网关
    【IDEA】【maven】idea使用maven插件 打包提示找不到符号找不到类,但是却没有错误
    【java】关于Map的排序性的一次使用,有序的Map
    【idea】idea重新打包依赖了父级项目的子级项目,父级项目代码改变,但是子级项目打包依旧是老的代码 问题解决
    【mysql】在mysql中更新字段的部分值,更新某个字符串字段的部分内容
    CentOS RabbitMQ 高可用(Mirrored)
    CentOS MongoDB 高可用实战
    CentOS 安装 gitlab
    SpringBoot打jar包问题
    java中由类名和方法名字符串实现其调用【反射机制】
  • 原文地址:https://www.cnblogs.com/JeasonIsCoding/p/13232569.html
Copyright © 2020-2023  润新知