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、关闭网络连接;
【示例】
-
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(); } }