java最初是作为网络编程语言出现的,对网络编程提供了高度的支持。在网络编程中,使用最多的就是Socket。
QQ,MSN都是使用了Socket相关的技术
网络7层协议:物理层(网线,网卡,传输二进制数据),数据链路层(传输帧),网络层(路由器),传输层(TCP,UDP),会话层(无协议),表示层(无协议),应用层(HTTP协议,FTP文件传输协议,SMTP简单邮件传送协议,Telnet远程登录协议)
TCP/IP五层模型:物理层,数据链路层,网络层,传输层(TCP/IP协议),应用层
每台主机都有一个ip地址,每个应用都有一个端口号,主机之间的通信,必须要知道对方的ip地址和端口号,这就是套接字。
针对网络通信的不同层次,java提供的网络功能有四大类:
1.InetAddress类:用于标识网络上的硬件资源,标识互联网协议(IP)地址。
InetAddress address=InetAddress.getLocalHost();得到address对象之后,即可调用相关方法获取主机的主机名和ip地址:
address.getHostName();
address.getHostAddress();
java如何打印一个数组呢?
String[] as={"asdjf","jsdkflj","123"};
System.out.println(Arrays.toString(as));
2.URL(统一资源定位符):标识Internet上某一资源的地址
URL由两部分组成:协议名称+资源名称,中间用冒号隔开。
在java.net包中,提供了URL类来标识URL。
URL url=new URL("http://www.baidu.com");
通过URL对象的openStream()方法可以得到指定资源的输入流。通过输入流可以读取,访问网络上的数据。
//通过URL的openStream方法获取URL对象所表示的资源的字节输入流
InputStream stream=url.openStream();
//将字节输入流转换成字符输入流
InputStreamReader isr=new InputStreamReader(stream);
//为字符输入流添加缓冲,提供读取的效率
BufferedReader br=new BufferedReader(isr);
String data=br.readLine();//读取数据
while(data!=null){//循环读取数据
System.out.println(data);
data=br.readLine();
}
br.close();
isr.close();
stream.close();
为什么添加缓冲能够提高读写的效率?
运用FileInputStream读一段数据是一个字节一个字节的读取,如果有10个字节大小的文件,就要调用10次系统调用,每次将读取的数据赋值给变量,然后程序使用变量。缓冲区可以看作是一个放在内存中的数组,但是从硬盘中读取数据仍然要使用系统调用,系统调用的读取仍然是每次一个,只是每调用一次之后,将所得到的数据放入缓冲区中的,然后程序一次性使用10个数据。
TCP协议是面向连接,可靠地,有序的,以字节流的方式发送数据。在通信之前,需要建立连接,保证数据传输的可靠性。
基于TCP协议实现网络通信的类:
客户端的Socket类
服务器端的ServerSocket类
客户端与服务器端的通信就是两个socket对象之间的对话。
//创建一个服务器端Socket,即ServerSocket,指定绑定的端口,并监听此端口
ServerSocket serverSocket=new ServerSocket(8888);
//调用accept()方法开始监听,等待客户端的连接
Socket socket=serverSocket.accept();
//获取输入流,并读取客户端的信息
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("我是服务器,客户端 说:"+info);
}
socket.shutdownInput();
br.close();
isr.close();
is.close();
socket.close();
serverSocket.close();
----------------------------------------------------------------------------------------
//创建客户端Socket,指定服务器地址和端口
Socket socket=new Socket("localhost",8888);
//获取输出流,用于向服务器端发送信息
OutputStream os=socket.getOutputStream();//字节输出流
PrintWriter pw=new PrintWriter(os);//将输出流包装成打印流
pw.write("我是客户端,我这儿有很多数据,需要发送给你,也就是我要和你通讯");
pw.flush();
socket.shutdownOutput();
pw.close();
os.close();
socket.close();
-----------------------------------------------------------------------------------------
TCP协议中的三次握手:建立TCP需要三次握手才能建立,而断开连接则需要四次挥手。
ACK : TCP协议规定,只有ACK=1时有效,也规定连接建立后所有发送的报文的ACK必须为1
SYN(SYNchronization) : 在连接建立时用来同步序号。当SYN=1而ACK=0时,表明这是一个连接请求报文。对方若同意建立连接,则应在响应报文中使SYN=1和ACK=1. 因此, SYN置1就表示这是一个连接请求或连接接受报文。
推荐博文:http://blog.csdn.net/oney139/article/details/8103223
-----------------------------------------------------------------------------------------
UDP:无连接的,不可靠的协议
DatagramSocket 数据报Socket,用于客户端和服务器端的socket通话
DatagramPackage 数据包,里面封装了要传输的数据,ip地址,端口号
byte[] data=new byte[];