Java基础 01网络编程 160 TCP协议原理分析161

下面的博客目录
1、网络编程基本概念
2、网络编程TCP协议
3、TCP实现ECHO程序
4、服务器与多客户端通信
5、多客户端之间的通信
6、网络编程UDP协议
7、URL
8、MINA框架


1、什么是计算机网络
把分布在不同地理区域的计算机与专门的外部设备用通信线路互连成一个规模大、功能强的网络系统,从而使众多的计算机可以方便地互相传递信息,共享硬件、软件、数据信息等资源。
2、计算机网络的主要功能
资源共享
信息传输与集中处理
均衡负荷与分布处理
综合信息服务(www/综合业务数字网络ISDN)等


3、网络通信协议
要使计算机连成的网络能够互通信息,需要对数据传输速率、传输代码、代码结构、传输控制步骤、出错控制等制定一组标准,这一组共同遵守的通信标准就是网络通信协议,不同的计算机之间必须使用相同的通讯协议才能进行通信。

网络通信接口
为了使两个结点之间能进行对话,必须在它们之间建立通信工具(即接口),使彼此之间能进行信息交换。接口包括两部分:
(1)硬件装置:实现结点之间的信息传送
(2)软件装置:规定双方进行通信的约定协议


4、TCP/IP
TCP/IP:传输控制协议/因特网互联协议,又叫网络通讯协议,这个协议是Internet最基本的协议、Internet国际互联网络的基础,简单地说,就是由网络层的IP协议和传输层的TCP协议组成的
IP地址:网络中每台计算机的一个标识号,本地IP:127.0.0.1 localhost
端口号(PORT):端口号的范围:0~ 65535 之间, 0~1023之间的端口数是用于一些知名的网络服务和应用

在这里插入图片描述


5、程序开发结构
网络编程主要是指完成C/S程序的开发,程序的开发结构有两种:
· C/S(客户端/服务器)
开发两套程序,两套程序需要同时维护,例如:QQ。CS程序一般比较稳定

· B/S(浏览器/服务器)
开发一套程序,客户端使用浏览器进行访问,例如:各个论坛。BS程序一般稳定性较差,而且安全性较差。

但是,C/S的程序开发在实际的Java应用中毕竟很少了,而且整个java基本上都是以B/S为主。

C/S程序主要可以完成以下两种程序的开发:
· TCP:(Transmission Control Protocol)传输控制协议,采用三方握手的方式,保证准确的连接操作。
· UDP:(User Datagram Protocol)数据报协议,发送数据报,例如:手机短信或者是QQ消息。

TCP、UDP的数据帧格式简单图例:

在这里插入图片描述
其中协议类型用于区分TCP、UDP


二、网络编程TCP协议
1、TCP程序概述
**TCP是一个可靠的协议,面向连接的协议。
实现TCP程序,需要编写服务器端和客户端,Java API为我们提供了java.net 包,为实现网络应用程序提供类。

ServerSocket :此类实现服务器套接字。

Socket :此类实现客户端套接字(也可以就叫“套接字”)。**

Socket是网络驱动层提供给应用程序编程的接口和一种机制。

在这里插入图片描述
2、数据发送过程
在这里插入图片描述
3、数据接收过程
在这里插入图片描述


4、实现服务器端与客户端程序
服务器端:

public class ServerSocket  extends Object

此类实现服务器套接字。服务器套接字等待请求通过网络传入。它基于该请求执行某些操作,然后可能向请求者返回结果。

ServerSocket(int port) 

创建绑定到特定端口的服务器套接字。

 void setSoTimeout(int timeout) 

通过指定超时值启用/禁用 SO_TIMEOUT,
以毫秒为单位。

 InetAddress getInetAddress() 

返回此服务器套接字的本地地址。

 Socket accept() 

侦听并接受到此套接字的连接。


4、实现服务器端与客户端程序
客户端:

public class Socket extends Object 

此类实现客户端套接字(也可以就叫“套接字”)。套接字是两台机器间通信的端点。

Socket(String host, int port) 

创建一个流套接字并将其连接到指定主机上的指定端口号。

InputStream getInputStream() 

返回此套接字的输入流。

OutputStream getOutputStream()

返回此套接字的输出流。

 void setSoTimeout(int timeout) 

启用/禁用带有指定超时值的
SO_TIMEOUT,以毫秒为单位。


3、TCP实现ECHO程序
Echo,意为应答,程序的功能是客户端向服务器发送一个字符串,服务器不做任何处理,直接把字符串返回给客户端,Echo程序是最为基本的客户/服务器程序。
就跟helloworld似的

下面的代码 表示的意思就是
我客服端发送一段文字 服务器端收到后重新返回到客户端这段文字

首先启动服务器端 等待客户端连接 这个时候这服务器端其实是堵塞的
然后启动run客户端 客户端去连接服务器端 连接成功后发送文字到服务器端 之后服务器端返回这段文字到客户端
服务器端

package com.vince;

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

/**
 * Created by vince on 2017/6/6.
 */
public class EchoServerDemo {
    public static void main(String[] args) {
        //创建一个服务器端的Socket(1024-65535)
        try {
            ServerSocket server = new ServerSocket(6666);
            System.out.println("服务器已启动,正在等待客户端的连接...");
            //等待客户端的连接,造成阻塞,如果有客户端连接成功,立即返回一个Socket对象
            Socket socket = server.accept();
            System.out.println("客户端连接成功:"+server.getInetAddress().getHostAddress());
            BufferedReader br = new BufferedReader(
                    new InputStreamReader(socket.getInputStream()));
            //通过输入流读取网络数据,如果没有数据,那么会阻塞
            String info = br.readLine();
            System.out.println(info);
            //获取输出流,向客户端返回消息
            PrintStream ps = new PrintStream(
                    new BufferedOutputStream(socket.getOutputStream()));

            ps.println("echo:"+info);
            ps.flush();
            //关闭
            ps.close();
            br.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

客户端

package com.vince;

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

/**
 * Created by vince on 2017/6/6.
 */
public class EchoClientDemo {
    public static void main(String[] args) {
        //创建一个Socket对象,指定要连接的服务器
        try {
            Socket socket = new Socket("localhost",6666);
            //获取socket的输入输出流
            PrintStream ps = new PrintStream(new BufferedOutputStream(socket.getOutputStream()));
            BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));

            ps.println("hello,my name is Bin");
            ps.flush();
            //读取服务器端返回的数据
            String info = br.readLine();
            System.out.println(info);
            ps.close();
            br.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

可以发现 网络连接就是这两个类 连接 就几行代码 很简单
连接成功后 就是我们前面学习的流的操作了


先启动服务器端 再启动客户端
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值