网络协议与TCP/IP
IP地址和Port(端口)
端口号范围:0-65535之间,0-1023之间端口数用于知名网络服务和应用
UDP与TCP
TCP:传输控制协议,面向连接的通信协议,等待应答
UDP:用户数据报 ,是无连接的通信协议,不等待应答
Socket
Socket是网络驱动层提供给应用程序程序的接口和一种机制。
Socket在应用程序中创建,通过一种绑定机制与驱动程序建立关系,告诉自己所对应的IP和Port..
Socket数据发送过程
1.产生Socket.
2.调用bind将Socket的信息通知给驱动程序。
3.应用程序将要发送给的数据传送给Socket.
4.驱动程序从Socket取出数据并通过网卡发送出去。
JAVA中的网络编程类
1.位于java.net包中
2.DatagramSocket类用于UDP通信
3.ServerSocket类用于TCP通信的服务器端
4.Socket类用于TCP通信的服务器和客户端。
UDP网络程序
DatagamSocket类和DatagramPacket类
构造函数
public DatagamSocket()主动给对方发送数据,不接受对方发送的数据,自动分配端口
public DatagamSocket(int port)有可能先接受数据,自己指定端口号,
public DatagamSocket(int port,InetAddress laddr)在多个IP地址上运行,明确指定发送接收的IP地址
close()不使用关闭,释放对象。
send(DatagramPacket p)发送UDP数据包
receive()接受UDP数据包
如果把DatagamSocket比作创建的港口码头,那么DatagamPacket就是发送和接收数据的集装箱。
构造函数:
Public DatagamPacket(byte[] buf,int length)仅指定了数据包的缓冲区和缓冲区大小
接受UDP数据时,程序事先无法知道哪个地址和端口Socket发的
Public DatagamPacket(byte[] buf,int length,InetAddress address,int port) 指定了数据包的缓冲区和缓冲区大小,还指定了接受数据包的目标地址和端口。
发送数据时,必须事先标明接受地址信息。并传送给缓冲区
getInetAddress和getPort方法
对方的IP地址和端口号也是包装到DatagamPacket中,从getInetAddress和getPort方法得到。
getData和getLength方法
先定义个相对大的字节数组作为缓冲区,发送数据包不能超过字节数组长度,若小于字节数组,只有部分为真正接收数据。
getData返回字节数组缓冲区去,getLength返回实际接受长度。
InetAddress类
用于表示计算机IP地址的一个类,而在日常用192.168.0.1、www.it315.org字符串
getByName静态方法:根据以上字符串返回InetAddress实例对象
getHostAddress方法返回InetAddress192.168.0.1格式
最简单的UDP程序
字符串与字节数组之间的双向转换
UDP接收程序必须先启动运行,才能接收UDP发送程序发送的数据。
用start命令来打开新命令行窗口的好处
解决发送中文字符串的问题
用UDP程序编写网络聊天程序
分三步骤:
1. 编写图形用户界面
2. 编写网络消息发送功能
3. 编写网络消息接收功能
TCP网络程序的工作原理
TCP客户端程序与TCP服务器端程序的交互过程:
1. 服务器程序创建一个ServerSocket,然后调用accept方法等待客户来连接。
2. 客户端程序创建一个Socket并请求与服务器建立连接。
3.服务器接受客户的链接请求,并创建一个新的Socket与该客户建立专线连接。
4.建立了链接的两个Socekt在一个单独的线程(由服务器程序创建)上对话。
ServerSocket类
构造函数:
Public ServerSocket()
Public ServerSocket(int port)
Public ServerSocket(int port,int backlog)
Public ServerSocket(int port,int backlog,InetAddress bindAddr)
Close()
Accept
Socket类
构造函数:
Public Socket()
Public Socket(String host,int port)
Public Socket(InetAddress address,int port)
Public Socket(String host,int port,InetAddress localAddr,int localPort)
getInputStream和getOutputStream方法
简单的TCP服务器程序
TCP服务器程序必须先启动运行,TCP客户程序才能连接上TCP服务器
使用windows提供的telnet程序测试TCP服务器程序。
使用BufferedReader包装类,从网络输入流中一次读取一行文本。
如何打开telnet程序的本地回显功能。
TCP服务器程序模型的编写要点:
TCP服务器程序要想接受多个客户端连接,需要循环调用ServerSocket.accept方法。
服务器程序与每个客户端连接的会话过程不能相互影响,需要在独立的线程中运行。
如何检测和解决端口冲突问题
使用netstat -na命令查看当前正在被使用的TCP端口号
通过一个配置参数来指定TCP服务程序所使用的端口号。
将用户所指定的端口号保存到一个文件中,当服务器程序下次启动运行时,直接从文件中读取哪个端口号。
在TCP网络连接上传递对象
ObjectInputStream和ObjectOutputStream可以从底层输入流中读取对象类型的数据和将对象类型的数据写入到底底层输出流。
使用ObjectInputStream和ObjectOutputStream来包装底层网络字节流,TCP服务器和TCP客户端之间就可以传递对象类型的数据。
访问Internet网络资源
Java.net包中还有URL,URLDecoder,URLEncoder.URLConnection,HttpURLConnection等类
URL统一资源定位符
URL的基本组成:协议,主机名,端口号,资源名
http默认端口80
URL编码规则:
HTTP协议
HTTP协议的会话过程
HTTP请求消息
HTTP响应消息
URL类
构造方法(都可引发MalformedURLException)
Public URL(String spec)
Public URL(String protocol,String host,int port,String file)协议名 主机名 端口号 资源本身名
Public URL(URL context,String spec)
getProtocol,getHost,getPort,getFile
openConnection方法返回URLConnection对象
工厂设计模式
URL类的setURLStreamHandlerFactory(URLStreamHandlerFactory)静态方法
StreamHandlerFactory类的createURLStreamHandler(String protocol)
URLConnection和HttpURLConnection类