网络编程基础

1 . 网络基础简介

计算机网络协议

网络协议的目的是为了在计算机物理连接之后进行交互的

目前,成熟的协议有2大类

OSI/ISO - 学术研究,教学用 - 学术上的标准
分为 : 物理层,数据链路层,网络层,传输层,会话层,表示层,应用层
	TCP/IP - 实际使用 - 实际上的标准
分为 : 网络接口层,网际层,传输层,应用层

它们都是一整套协议族,并不是单个或者几个协议组成的
它们之间是一个有机的整体

计算机网络

	分层思想 - 分工负责,各司其职,更清晰地处理相关问题

2.TCP/IP协议**

TCP/IP协议的分层

应用层,传输层,网络层,网络接口层。

应用层。实际上本层的内容并不是“应用”软件的“应用” 应用软件要想正常工作,是要基于应用层的协议的
HTTP/HTTPS(http://www.baiu.com)浏览互联网WWW服务(Web服务)
FTP(ftp://ftp.server.com)用于共享文件,现在很少使用,可能某些机构、大学内部会有这些服务器 SMTP发邮件的

传输层 传输层的作用是向应用层提供服务的 应用层那些协议要想正常工作,是要基于传输层协议的
TCP。面向连接,保证数据传输过程中的完整,有序,丢包重传。 性能其实有些低的,但这是数据准确传输必须付出的代价
UDP。无连接,它只管闷头发数据,不保证数据的准确性(完整,有序,无重传机制) 因为不用保证数据准确传输,所以它快
QQ的有些功能就会使用UDP(当然它也使用TCP) 我们聊天的时候,有些文字就打了个红叹号,没发送出去,这就是使用UDP的功能

3.Socket编程

Java对网络编程的支持,选择了传输层的2个协议,以TCP/UDP为基础,构建了自己的网络类继承体系。
Java的网络编程与异常、IO流、多线程部分的知识联系紧密。
网络编程的基础在于Socket编程,而Socket编程在初学阶段重点掌握TCP Socket即可。

TCP Socket编程分为服务端编程(ServerSocket类)与客户端编程(Socket类)。

我们可以使用telnet命令连接到服务器。 如telnet 127.0.0.1 8888 也可以使用Java Socket类编程实现

ServerSocket类

实现一个简单的服务器

//创建一个工作在端口8888的服务器对象
ServerSocket ss = new ServerSocket(8888);
//开启监听,调用下面的方法会使程序阻塞,一直到有客户端来连接本服务器的8888端口(可以通过telnet命令或者Socket客户端编程实现)
Socket socket = ss.accept();
//一旦有客户端连接,则返回对应的客户端对象socket
//然后我们可以通过socket获取客户端的输入流与输出流,如果我们处理的是文本数据(绝大部分情况都是处理文本数据)再使用字节字符转换流进行包装转换。注意字符集。
//向客户端发送信息使用:
OutputStreamWriter osw = new OutputStreamWriter(socket.getOutputStream(), "utf-8");
BufferedWriter bw = new BufferedWriter(osw);//PrintWriter与BufferedWriter二选一
PrintWriter out = new PrintWriter(osw);//PrintWriter与BufferedWriter二选一
//但是PrintWriter可以解决不同系统间换行符的兼容性问题,而且语法上更接近System.out.println(),所以建议使用这个类。
//接收客户端信息使用:
InputStreamReader isr = new InputStreamReader(socket.getInputStream(), "utf-8");
BufferedReader br = new BufferedReader(isr);

注意,操作完成后,一定要关闭资源(各种IO流、各种网络连接等)
Socket类

实现一个简单的客户端

//创建一个连接指定IP/域名及端口号的服务端连接对象
Socket socket = new Socket("127.0.0.1", 8888);
之后的操作可类比ServerSocket中对socket的使用。
只不过,服务端socket.getOutputStream()的内容就是客户端的socket.getInputStream();
服务端socket.getInputStream()的内容就是客户端的socket.getOutputStream()

网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket,又称”套接字”。
应用程序通常通过”套接字”向网络发出请求或者应答网络请求。本质是编程接口(API),对TCP/IP的封装,
TCP/IP也要提供可供程序员做网络开发所用的接口,即为Socket编程接口。 

2. TCP Socket模型

TCP编程的服务器端一般步骤是:

  1、创建一个socket,用函数socket(); 
  2、设置socket属性,用函数setsockopt(); * 可选 
  3、绑定IP地址、端口等信息到socket上,用函数bind(); 
  4、开启监听,用函数listen(); 
  5、接收客户端上来的连接,用函数accept(); 
  6、收发数据,用函数send()recv(),或者read()write(); 
  7、关闭网络连接; 
  8、关闭监听;

TCP编程的客户端一般步骤是:

  1、创建一个socket,用函数socket(); 
  2、设置socket属性,用函数setsockopt();* 可选 
  3、绑定IP地址、端口等信息到socket上,用函数bind();* 可选 
  4、设置要连接的对方的IP地址和端口等属性; 
  5、连接服务器,用函数connect(); 
  6、收发数据,用函数send()recv(),或者read()write(); 
  7、关闭网络连接;

【示例】

  1. socket服务端

    public class TestTCPServer01 {
       public static void main(String[] args) throws Exception {
          // 1、创建一个服务器端Socket,即ServerSocket,指定绑定的端口,并监听此端口
          ServerSocket ss = new ServerSocket(8888);
          while (true) {
             // 2、调用accept()方法开始监听,等待客户端的连接
             Socket socket = ss.accept();
             System.out.println("client" + " connect!");
             // 3、获取输入流,并读取客户端信息
             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("Hello,i'm server,client say:" + info);
             }
             br.close();
          }
       }
    }
    
    

    2、socket客户端

    public class TestTCPClient01 {
       public static void main(String[] args) throws Exception {
          // 1、创建客户端Socket,指定服务器地址和端口
          Socket s = new Socket("127.0.0.1", 8888);
          // 2、获取输出流,向服务器端发送信息
          OutputStream os = s.getOutputStream();
          // 将输出流包装成打印流
          PrintWriter pw = new PrintWriter(os);
          pw.write("hello,i'm 天亮!");
          pw.flush();
          pw.close();
       }
    }
    
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值