网络编程
1. 网络基础
2. TCP/IP协议
3. IP地址
4. Socket通信 TCP/UDP
一般网络编程就是像QQ,MSN等这样的软件编程,就是叫网络编程
什么是网络通信协议
计算机网络中实现通信必须有一些约定即通信协议,对速率,传输代码,
代码结构,传输控制步骤,出错控制等指定标准
网络通信接口
为了使两个节点之间能进行对话,必须在它们之间建立通信工具(即接
口),使批次之间能进行信息交换,接口包括两个部分:
通信协议分层的思想
由于节点之间联系很复杂,在指定协议时,把复杂成分分解成一些简单的
成分,再将它们符合起来,最常用的复合方式是层次方式,即同层间可以通
信,上一层可以调用下一层 ,而与再下一层不发生关系,各层互补影响,
利于系统的开发和扩展
通信协议的分层规定
把用户应用程序作为最高层,把物理通信线路作为最底层,将其间的协议
处理分为若干层,规
定每层处理的任务,也规定每层的接口标准
OSI参考模型
应用层
|
表示层
|
会话层
|
传输层
|
网络层
|
数据链路层
|
物理层
TCP/IP参考模型
应用层
|
传输层
|
网络层
|
物理+数据链路层
国际标准是七层
一般开发是四层
IP协议
IP(Internet Protocol)协议是网际层的主要协议,支持网间互连的数据
报通信,它提供的主要功能有:
无链接数据报传送
数据报路由选择和差错控制
IP地址,是全球唯一的
IP分为四段,每一段数值为0-255
因为每个段的值是4个字节,每个字节最大数是255
也就是一个int型,占四个字节
一般我们一个范围用了一个公网IP,然后这范围都是内网IP,所以我们真实
的IP在公网IP
现在我们用的都是ipv4, 每个段占用4个字节,最大值为255
像 int型
目前已经出来了ipv6,每个段占用8个字节,
最大值已经够用了
像 long型
A类网
范围(1-126)
B类网
范围(128-191)
C类网
范围(192-223)
TCP协议和UDP协议
TCP(transaction control protocol)
是专门设计用于在不可靠的因特网上提供可靠的、端到端的字节通信的
协议,通过一种面向连接的协议。TCP连接是字节流而非报文流
UDP(user data protocol)
UDP向应用程序提供了一种发送封装的原始IP数据报的方法、并且发送时
无需建立连接,是一种不可靠的连接
总结:
TCP连接,是可靠的连接,发送的数据对方肯定会收到,是面向连接的
协议,速度慢
UDP是不可靠的连接,发送的数据对方无论是否在线照发不误,非面向
连接的协议,速度快
可能会发生丢包问题
一般网络编程,就叫Socket编程
两个java应用程序可通过一个双向的网络通信连接实现数据交换,这个双向
链接的一端称为一个socket
socket通常用来实现client-server连接
java.net包中定义的两个类socket和ServerSocket,分别用来实现client和
server端
建立连接时所需的寻址信息为远程计算机的IP地址和端口号(port number
)
一台机器上最多可以拥有65536个端口号
端口号只能被一个资源占用
1024以下一般系统分配使用,如果我们也需要用端口,一般用1024以上的端
口
TCP和UDP各自都可以拥有65536个端口
如果TCP分配了一个8888端口,
那么UDP也可以分配一个8888端口
www.google.com/intl/zh_CN/
//服务端
import java.net.*;
public class TCPServer
{
public static void main(String[] args) throws Exception
{
ServerSocket socket = new ServerSocket(6666);
//接受客户端
//accept是阻塞式的,如果没有接受到连接,那么它就一直等待
//不过一般使用接收的时候,都是while循环接收
while(true){
Socket so = socket.accept();
//打印试一下
System.out.println("一个客户端连接上了");
//服务器端接收发送的数据
DataInputStream dis = new DataInputStream
(so.getInputStream());
//readUTF()也是阻塞式的,如果没有数据,就会死等下去
System.out.println(dis.readUTF());
dis.close();
}
}
}
//客户端
import java.net.*;
public clss TCPClient
{
public static void main(String[] args) throws Exception
{
//申请连接
Socket socket = new Socket("127.0.0.1",6666);
//现在开始传输我们要说的话
OutputStream os = socket.getOutputStream();
DataOutputStream dos = new DataOutputStream(os);
dos.writeUTF("hellow server!");
dos.flush();
dos.close();
os.close();
}
}
Server发送数据到客户端就是 OutputStream
Server接收客户端的数据就是 InputStream
Client端发送数据到服务器端就是 OutputStream
Client端接收服务器端数据就是 InputStream
UDP编程
就是把数据打成一个小包,发送出去
//服务端
public static void main(String args[]) throws Exception
{
byte buf[] = new byte[1024];
DatagramSocket ds = new DatagramSocket(5678);
DatagramPacket dp = new DatagramPacket(buf,buf.length);
while(true)
{
ds.receive(dp);
System.out.println(new String(buf,0,dp.getLength()));
}
}
//客户端
public static void main(String[] args) throws Exception
{
byte[] buf = (new String("Hello")).getBytes();
DatagramPacket so = new DatagramPacket
(
buf,buf.length,new InetSocketAddress("127.0.0.1",5678)
);
DatagramSocket ds = new DatagramSocket(9999);
ds.send(dp);
ds.close();
}
把长整形转换成字节,然后打包发送到服务器,在从服务器解析
//先打包成字节
long n = 10000l;
ByteArrayOutputStream baos = new ByteArrayOutputStream();
DataOutputStream dos = new DataOutputStream(baos);
dos.writeLong(n)
byte[] buf = baos.toByteArray();
把包解析成Long
ByteArrayInputStream bis = new ByteArrayInputStream();
DataInputStream ds = new DagaInputStream(bis);
System.out.println(ds.readLong());
总结:
1.网络协议分层思想
2.IP的是唯一的每一个协议可以有相同的端口
3.TCP的使用
4.UDP的编写