网络编程基础
由于是第一次写博客可能问题比较多,请大家见谅:
- 网络及其相关的概念
- ip地址的组成
- tcp/ip的三次握手四次挥手
- Socket编程
网络及其相关概念
简单的来说网络就是连接在一起共享数据和资源的一组计算机。根据网络规模分为局域网、城域网、广域网。因为网络上的信息传递由不同的层级负责不同的任务,为了统一通信的方便,形成了osid的七层网络模型和tcp/ip的五层模型。
模型对比
tcp/ip五层模型 | osi七层模型 |
---|---|
应用层 | 应用层 |
应用层 | 表示层 |
应用层 | 会话层 |
传输层 | 传输层 |
网络层 | 网络层 |
数据链路层 | 数据链路层 |
物理层 | 物理层 |
TCP协议和UDP协议
-
TCP/IP协议族
- TCP协议是传输控制协议,是一种面向连接的、可靠的、基于字节流的传输层通信协议。TCP要求通信双方必须建立连接之后才可以开始通信,通信双方可以同时进行数据传输,它是全双工的,从而保证了数据的正确传送。
- UDP协议是用户数据报协议,是一个无连接协议,在传输数据之前,客户端和服务器并不建立与维护链接。UDP协议的主要作用是把网络通信的数据压缩为数据报的形式。
ip地址的组成
在网络中会使用一种具有层次结构的逻辑地址来标识一台主机,这个地址称为ip地址。
-
ip地址的组成:
-
ip地址有32位,由4个8位二进制组成,每8位之间用圆点隔开,由于二进制不便于记忆,因此通常把二进制数转换成十进制数表示。
-
ip地址的分类:
-
ip地址包含了网络地址和主机地址两个部分。其中网络地址决定了可以分配的最大网络数,主机地址决定了一个网络中可以存在的计算机的最大数量。根据网络地址和主机地址的不同,ip地址由分为A、B、C、D、E五类。
- A类ip地址:第一组数字表示网络地址,其余 表示主机地址。A类地址的有效网络范围为1~126.
- B类ip地址:第二组数字表示网络地址,其余表示主机地址。B类地址的有效网络范围为128~191.
- C类ip地址:第三组数字表示网络地址,其余表示主机地址。C类地址的有效网络范围为192~223.
- D类ip地址:用于组播通信,不能在互联网上作为节点地址使用。它的第一个8位的范围为224~239.
- E类ip地址:用于科学研究地址,也不能在互联网上作为节点使用.它的第一个8位的范围为240~254.
-
除此之外,还有一些特殊的ip地址,例如:
0.0.0.0表示本机。
127.0.0.1表示本机回环地址。
255.255.255.255表示当前子网,一般用于向当前子网广播信息。
tcp/ip的三次握手四次挥手
由于网上这方面介绍的比较多,这里就不多讲了,想了解的可以点这里。
Socket编程
在计算机网络编程中,两个进程或者说两个计算机可以通过一个网络通信连接实现数据的交换,这种通信链路的端点就称为Socket(套接字)。Socket是网络驱动层提供给应用程序的接口或者说一种机制。java.net包提供若干支持基于套接字的客户端/服务器通信的类。
1.基于TCP协议的Socket编程
java.net包的两个类Socket和ServerSocket,分别用来实现双向安全连接的客户端和服务器端它们是基于TCP协议进行工作的。
Socket类常用方法:
方法 | 说明 |
---|---|
Socket Socket(hostName,port) | 构造方法以主机名和端口号作为参数来创建一个Socket对象。 |
Socket Socket(address,port) | 构造方法以地址和端口号作为参数来创建一个Socket对象。 |
InetAddress getInetAddress() | 返回与Socket对象关联的InetAddress |
int getPort() | 返回此Socket对象所连接的远程端口 |
int getLocalPort() | 返回Socket对象所连接的本地端口 |
InputStream getInputStream() | 返回与此套接字关联的InputStream |
OutputStream getOutputStream() | 返回与此套接字关联的OutputStream |
void close() | 关闭该Socket |
ServerSocket常用方法:
方法 | 说明 |
---|---|
ServerSocket ServerSocket(port) | 构造方法接收端口号作为参数创建ServerSocket对象 |
ServerSocket ServerSocket(port,maxqu) | 构造方法接收端口号和最大队列长度作为参数 |
Socket accept() | 等待客户端触法通信 |
代码实现用户登录
客户端关键代码,例如:
//建立客户端Socket链接,指定服务器的位置为本机以及端口8800
Socket socket=new Socket("localhost",8800);
//打开输入输出流
OutputStream os=socket.getOutputStream();
InputStream is=socket.getInputSteream();
//发送客户端登录信息,即向输出流写入信息
String info="用户名:Tom;用户密码:123456";
os.write(info.getBytes());
socket.shutdownOutput();
//接收服务端的响应,即从输入流读取数据
String reply=null;
BufferReader br=new BufferReader(new InputStreamReader(is));
while(!((reply=br.readLine())==null)){
System.out.println("我是客户端,服务器的响应为:"+reply);
}
//关闭资源
......
服务器端关键代码:
//建立一个服务器Socket(ServerSocket),指定端口8800并开始监听
ServerSocket serverSocket=new ServerSocket(8800);
//使用accept()方法等待客户端触发通信
Socket socket=serverSocket.accept();
//打开输入输出流
InputStream is=socket.getInputStream();
OutputStream os=socket.getOutputStream();
//获取客户端信息,即从输入流读取信息
BufferReader br=new BufferReader(new InputStreamReader(is));
String info=null;
while(!((info=br.readLine())==null)){
System.out.println("我是服务器,客户端登录信息为:"+info);
}
//给客户端一个响应,即向输出流写入信息
String reply="欢迎你,登录成功!";
os.write(reply.getBytes());
//关闭资源
......
2.基于UDP协议的Socket编程
基于TCP的网络通信是安全的、双向的,建立双向连接后才开始数据通信。而UDP只需要指明对方地址,然后将数据送出去,并不会事先链接。这样的网络通信是不安全的,所以应用场合如聊天系统、咨询系统等。java中有两个可使用数据报实现通信的类,即DatagramPacket和DatagramSocket。DatagramPacket类起到数据容器的作用,DatagramSocket用于发送或接收DatagramPacket。
代码实现用户咨询
发送方关键代码:
InetAddress ia=null;
String mess="你好,我想咨询一个问题。";
//获取本地主机地址
ia=InetAddress.getByName("localhost");
//创建DatagramPacket对象,封装数据
DatagramPacket dp=new DatagramPacket(mess.getBytes(),mess.getBytes().length,ia,8800);
//创建DatagramSocket对象,向服务器发送数据
DatagramSocket ds=new DatagramSocket();
ds.send(dp);
//
ds.close();
接收方关键代码:
//创建DatagramPacket对象,用来准备接收数据包
byte[] buf=new byte[1024];
DatagramPacket dp=new DatagramPacket(buf,1024);
//创建DatagramSocket对象,接收数据
DatagramSocket ds=new DatagramSocket(8800);
ds.receive(dp);
//显示接收到的信息
String mess=new String(dp.getData(),0,dp.getLength());
System.out.println(dp.getAddress().getHostAddress()+"说:"+mess);