Java学习与复习笔记--网络通信概述&TCP通信程序

软件结构:

C/S结构:Client/Server结构,指客户端和服务器端结构,常见程序如QQ,迅雷等

B/S结构:Browswe/Server结构,指浏览器和服务器结构。常见的浏览器如谷歌,火狐等

网络编程:就是在一定的协议下,实现两台计算机的通信的程序

网络通信协议:

通过计算机网络可以使多台计算机实现连接,位于同一网络的计算机在进行连接和通信时需要遵守一定的规则,在计算机网络中,这些连接和通信的规则被称为网络通信协议。

TCP/IP协议:是指能够在多个不同网络间实现信息传输的协议簇。TCP/IP协议不仅仅指的是TCP 和IP两个协议,而是指一个由FTP、SMTP、TCP、UDP、IP等协议构成的协议簇, 只是因为在TCP/IP协议中TCP协议和IP协议最具代表性,所以被称为TCP/IP协议。

TCP/IP传输协议是严格来说是一个四层的体系结构,应用层、传输层、网络层和数据链路层都包含其中。

协议分类:

UDP:用户数据报协议(User Datagram Protocol)。无连接通信协议,UDP协议消耗资源小,通信效率高。

但是不能保证数据的完整性。特点:数据被限制在64kb内,超过这个范围就不能发送了

TCP:传输控制协议,面向连接的通信协议。发送端和接收端应该建立逻辑连接,提供了两台计算机之间可靠误差错的数据传输。

在发送数据的准备阶段,客户端和服务器端之间的三次交互,保证连接的可靠

TCP协议可以保证传输数据的安全,所以应用十分广泛,如下载文件、浏览网页等。

网络编程三要素:

1.协议

2.IP地址:互联网协议地址,网络中的计算机设备的唯一编号

3.端口号:

计算机通过网络可以连接在一起,那么计算机之间就可以进行通信了(发送数据。。。),我们通过ip地址可以找到对方的计算机。

注意:我们必须保证数据能准确无误的发送到对方计算机的软件上。

端口号:是一个逻辑端口,我们无法直接看到,可以使用一些软件查看端口号

当我们使用网络软件一打开,那么操作系统就会为网络软件分配一个随机的端口号

或者网络软件在打开的时候和系统要指定的端口号

端口号是由两个字节组成的,取值范围在0-65535之间

注意:1024之前的端口号我们不能使用,已经被系统分配给已知的网络软件了

           网络软件的端口号不能重复

我们使用IP地址加端口号,就可以保证数据准确无误的发送到对面计算机的指定软件上了

常用的端口号

      1.80端口 网络端口  www.baidu.com:80 正确的网址

      2.数据库  mysql:3306   oracle:1521

      3.Tomcat服务器:8080

TCP通信程序概述:

TCP通信:面向连接的通信,客户端和服务器端必须得经过3次握手,建立逻辑连接,才能通信(安全)。

通信的步骤:

服务器端先启动

服务器端不会主动地请求客户端

必须使用客户端请求服务器端

客户端和服务器端就会建立逻辑连接

而这个连接中包含了一个对象,这个对象就是IO对象

客户端和服务器端就可以使用IO对象进行通信

通信的数据不仅仅是字符,所以IO对象是字节流对象

①:客户端给服务器端发送数据

OutputStream:你好服务器

②:服务器端读取客户端发送的数据

InputStream:你好服务器

③:服务器端给客户端发送数据

OutputStream:收到谢谢

④:客户端读取服务器端发送的数据

InputStream:收到谢谢

客户端和服务器端进行一次数据交互,需要4个IO流对象。

服务器端必须明确两件事情:

1.多个客户端可以同时和服务器进行交互,服务器必须明确和哪个客户端进行的交互

  在服务器端有个方法,叫accept客户端获取到请求的客户端对象

2.多个客户端同时和服务器端进行交互,就需要使用多个IO流对象

服务器没有IO流,服务器可以获取到请求的客户端对象Socket,使用每个客户端Socket中提供的IO流和客户端进行交互。

   服务器使用客户端的字节输入流读取客户端发送的数据。

  服务器使用客户端的字节输出流给客户端回写数据。

简单记:服务器使用客户端的流和客户端进行交互。

    我请你吃饭,但是没钱,和你借10元,请你吃饭

服务器端:Socket s1=server.accept();

TCP通信的客户端代码实现:

/*
* TCP通信的客户端:向服务器发送连接请求,给服务器发送数据,读取服务器回写的数据
*   表示客户端的类:
*     java.net.Socket:该类实现客户端套接字(也称为“套接字”)。 套接字是两台机器之间通讯的端点。
*     套接字:包含了IP地址和端口号的网络单位
*
*     构造方法:Socket(String host, int port) :创建流套接字并将其连接到指定主机上的指定端口号。
*     参数:
*     String host:服务器主机的名称/服务器的IP地址
*     int port:服务器的端口号
*
*     成员方法:OutputStream getOutputStream() :返回此套接字的输出流。
*              InputStream getInputStream() :返回此套接字的输入流。
*              void close():关闭套接字。
*     实现步骤:
*     1.创建客户端对象,构造方法中绑定服务器的IP地址和端口号
*     2.使用Socket对象中的方法getOutputStream()获取网络字节输出流OutputStream对象
*     3.使用网络字节输出流OutputStream对象中的方法write给服务器发送数据
*     4.使用Socket对象中的方法getInputStream()获取网络字节输入流对象InputStream对象
*     5.使用网络字节输入流对象InputStream对象read读取服务器回写的数据。
*     6.释放资源(Socket)
*     注意事项:
*     1.客户端和服务器端进行交互,必须使用Socket中提供的网络流,不能使用自己创建的流对象
*     2.当我们创建客户端对象Socket的时候,就会请求服务器和服务器经过3次握手建立连接通路
*       这是如果服务器没有启动,那么就会抛出异常
*       如果服务器已经启动,那么就可以进行交互
 */
public class TCPClient {
    public static void main(String[] args) throws IOException {
        Socket s=new Socket("127.0.0.1",8888);
        OutputStream os = s.getOutputStream();
        os.write("你好服务器".getBytes());
        InputStream is = s.getInputStream();
        byte[] bytes=new byte[1024];
        int len=is.read(bytes);
        System.out.println(new String(bytes,0,len));
        s.close();
    }
}

TCP通信的服务器端代码实现:

/*
* TCP通信的服务器端:接受客户端的请求,读取客户端发送的数据,给客户端回写数据
* 表示服务器的类:
*    java.net.ServerSocket:此类实现服务器套接字
*   构造方法:
*     ServerSocket(int port) :创建绑定到指定端口的服务器套接字。
*
*   服务器端必须明确一件事情,必须得知道是哪客户端请求的服务器
*   所以可以使用accept方法获取到请求的客户端对象Socket
*   成员方法:
*      Socket accept() :侦听要连接到此套接字并接受它。
*   服务器端的实现步骤:
*     1.创建服务器ServerSocket对象和系统要指定的端口号
*     2.使用ServerSocket对象中的方法accept,获取到请求的客户端对象Socket
*     3.使用Socket对象中的方法getInputStream()获取网络字节输入流对象InputStream对象
*     4.使用网络字节输入流对象InputStream对象中的方法read,读取服务器发送的数据。
*     5.使用Socket对象中的方法getOutputStream()获取网络字节输出流OutputStream对象
*     6.使用网络字节输出流OutputStream对象中的方法write给客户端回写数据
*     7.释放资源(Socket,ServerSocket)*/
public class TCPServer {
    public static void main(String[] args) throws IOException {
        ServerSocket server=new ServerSocket(8888);
        Socket socket = server.accept();
        InputStream is = socket.getInputStream();
        byte[] bytes=new byte[1024];
        int len=is.read(bytes);
        System.out.println(new String(bytes,0,len));
        OutputStream os = socket.getOutputStream();
        os.write("收到,谢谢!".getBytes());
        socket.close();
        server.close();
    }
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值