1.什么是网络编程?
在java中网络编程就是利用网络编程所需要的类按照一定的协议完成两个软件之间的通信;
2.网络模型有哪些?
OSI参考模型和TCP/IP参考模型
3.网络通信要素有哪些?
(http://127.0.0.1:8089)
传输协议 IP地址 端口号
传输协议:常见的有TCP,UDP
IP地址:用于定位网络上的一台机器;一般IP地址不便于记忆,所以使用主机名表示,如127.0.0.1就可以使用localhost表示
常见的IP地址有:本地回环地址127.0.0.1
端口号:用于标识进程的逻辑地址,不同进程的标识
有效端口范围 是0~65535,0~1024是系统保留的端口,不能被其它应用程序使用
4.什么是UDP和TCP,以及它们各自的优缺点?
UDP:UDP 是User Datagram Protocol的简称, 中文名是用户数据报协议,是OSI(Open System Interconnection,开放式系统互联) 参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务
优点:(1)传输速度快
(2)占用系统资源少
(3)实现简单
缺点:(1)面向无连接,传输的数据准确性不高;
其它要求:(1)每个数据包的限制为64K
使用场合:对数据的准确性要求不高但传输速度要求高的场合如qq,步话机,视屏聊天语音聊天室
TCP:Transmission Control Protocol 传输控制协议TCP是一种面向连接(连接导向)的、可靠的、基于字节流的传输层(Transport layer)通信协议,在简化的计算机网络OSI模型中,它完成第四层传输层所指定的功能,UDP是同一层内另一个重要的传输协议。
优点:(1)面向连接,数据传输可靠
(2)可以进行大数据传输
缺点:(1)占用系统资源
(2)实现起来比较复杂
使用场合:对于数据的准确性要求比较高的场合,如电话
5.InetAddress:描述IP信息的类;
(1)获得对象(不可直接创建对象;下面的这些方法都是静态方法):
通过主机名获取所有对象:getAllByName(String host)
通过主机名获取一个对象:getByName(String host)
通过IP地址获取一个对象:getByAddress(byte[] addr)
通过IP地址和主机名获取对象:getByAddress(String host, byte[] addr)
返回本地主机:getLocalHost()
(2)从InetAddress的对象获取信息:
获取主机名:getHostName()
获取主机IP地址(字符串形式):getHostAddress(),
获取主机IP地址(字节数组):getAddress()
6.对于Socket的理解:
(1)专业名词:套接字
(2)作用:描述IP地址和端口
(3)通俗的理解:一个犹如邮局的信息服务平台,可以发送信息(发送邮包)和接收信息(接收邮包)
7.UDP传输编程:
(1)DatagramPacket(类似于邮包):封装了要发送的数据、目的地的IP地址、端口;
(2)DatagramSocket(类似于邮局):用于接收和发送数据包;此对象封装了封装了udp传输协议的socket对象;
(3)UDP发送端:(注意下面的注释并不专业,只是为了便于理解)
//1.建立邮局 DatagramSocket ds = new DatagramSocket(8888);//指定发送端口,这个可以不指定,系统会随机分配。 // 2.明确要发送的具体数据。 String text = "udp发送端"; byte[] buf = text.getBytes(); // 3.往邮包里装东西 DatagramPacket dp = new DatagramPacket(buf,buf.length,InetAddress.getByName("10.1.31.127"),20000); // 4.邮局把邮包发往目的地 ds.send(dp); // 5.关闭资源。 ds.close();
(4)UDP接收端:
// 1.建立邮局 DatagramSocket ds = new DatagramSocket(20000);//必须指定,并且和上面的数据包里指定的端口号一样! // 2.定义一个邮包,用于把邮递员送来的东西装在里面(这里可能和现实世界有些差别) byte[] buf = new byte[1024]; DatagramPacket dp = new DatagramPacket(buf,buf.length); // 3.接收邮包 ds.receive(dp);//该方法是阻塞式方法。 // 4.获得数据包里的信息 String ip = dp.getAddress().getHostAddress(); int port = dp.getPort(); String text =new String(dp.getData(),0,dp.getLength()); System.out.println(ip+":"+port+"--"+text); // 5.关闭资源。 ds.close(); } }
8.TCP 传输:
1.客户端:Socket
关键步骤:
//(1)创建Socket,指定发送目的地的IP和端口信息 Socket s = new Socket("127.0.0.1",10005); // (2)得到客户端的输出流发送数据: OutputStream out = s.getOutputStream(); out.write(“客户端”.getBytes()); //客户端如果要发送文本数据可以使用PrintWriter来自动刷新和换行: PrintWriter pw = new PrintWriter(s.getOutputStream(),true);//注意这里指定为true才会自动刷新 pw.println(“客户端”);//注意此处必须带使用println才换行 //(3)发送结束标记:(如果没有这句,那么在客户端的Socket没有关闭之前,服务器端的接收数据的方法in.read(buf))一直阻塞) s.shutdownOutput();//结束标记-1 //(4)得到客户端的输入流接收服务器端发送过来的数据 InputStream is = s.getInputStream(); //(5)关闭资源: s.close();
2.服务器端:ServerSocket
关键步骤:
// (1)创建ServerSocket,指定接收数据的端口: ServerSocket ss = new ServerSocket(10005); // (2)接收客户端请求,即获取客户端的Socket对象来和客户端交流: Socket s = ss.accept(); //(3)从Socket里获取客户端的主机的信息: String ip = s.getInetAddress().getHostAddress(); //(4)从Socket里获取输入流和输出流; InputStream in = s.getInputStream(); OutputStream os = s.getOutputStream(); //(5)关闭资源:(先要关闭Socket) s.close(); ss.close();