网络编程的目的就是指直接或间接地通过网络协议与其它计算机进行通讯。
网络协议共分七层(ISO/OSI):
7,应用层
6,表示层
5,会话层
4,传输层
3,网络层
2,数据链路层
1,物理层
其中:传输层是整个协议层次结构的核心。
各层之间是严格单向依赖。
上层使用下层提供的服务。
下层向上层提供服务。
协议:为网络中进行数据交换而建立的规则、标准或约定。
网络传输
分为:面向连接和非连接的服务。
主要传输途径:TCP传输(面向连接)和UDP传输(无连接)
传输通过网络地址(IP)实现。
IP地址:因特网上具有全球唯一性。
分:IPV4 IPV6
端口:用来区分一台机器上的某一个程序。在0--65535 之间,其中0--1024的端口号一般被应用程 序占用了。
确定好IP地址和程序端口号,两个程序就可以通讯了。
TCP传输:
TCP 是Transfer Control Protocol的简称,是一种面向连接的可靠传输协议。
采用三次握手,须要进行连接,连接成功后才能进行数据传输。 但效率低。
TCP分客户端和服务端
客户端对应的对象是 Socket
服务端对应的对象是 ServerSocket
客户端建立过程:
1,建立Socket 服务,指定要连接主机的端口
如:Socket s = new Socket("192.168.0.101",10004);
2,获取socket流中的输出流,将数据写到该流中,通过网络发送给服务端(写数据)。
如:OutputStream out = s.getOutputStream();
out.write("服务端,你好?".getBytes());
使用高效方法:
BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
bufw.write(“你好”);
bufw.newLine(); //这个行结束符在这很重要,否接收端无法判断行是否结束,会一直等待。
bufw.flush();
注意:
1),在使用高效传送时,每写一次,记得刷新一下,不然还存在于缓冲池中,直到关闭 才自动刷新。如:在传送文件时。
2),bufw.newLine(); 行结束符,这句的重要性。
3),在数据传送完时,要使用s.shutdownOutput(); 标记,否则服务端无法知道数据是否 传送完。
4),这里可以使用打印流,PrintStream ,会自动刷新等,在这里使用很方便。
心得:因为是往外传数据,所以应该是往外写数据。所以使用
3,获取socket流中的输入流,将服务端反馈的数据获取到(读数据)。
如:InputStream in = s.getInputStream();
byte[] buf = new byte[1024];
int len = in.read(buf); //阻塞式,没有读到数据时会等待。
System.out.println(new String(buf,0,len));
4,关闭客户端资源。
s.close();
服务端建立过程:
1,建立服务端Socket 服务,并监听一个端口
如:ServerSocket ss = new ServerSocket(10004);
2,通过accept方法获取连接过来的客户端对象
如:Socket s = ss.accept();
3,获取客户端发送过来的数据,使用服务端对象的读取流来读取数据(读数据)。
如:InputStream in = s.getInputStream();
byte[] buf = new byte[1024];
int len = in.read(buf); //阻塞式,等待读数据
System.out.println(ip+"..."+new String(buf,0,len));
4,服务端向客户端发送数据(写数据)
如:OutputStream out = s.getOutputStream();
out.write("客户端,你也好。".getBytes());
注意:传送数据,在数据写出去后,都别忘记刷新一下。
5,关闭服务端资源。
s.close();
ss.close();
例:如何让服务端同时可以接收多个客户端发送过来的数据呢?
只须把服务端做成多线程,来一个客户端就开起一个线程,让服务端处于一直接收状态。
网站就是这样做的,同时可以多个不同的人访问该网站(即服务器)。
服务端实现线程:
class ServerThread implements Runnable { }
服务端一直接收:
while (true)
{
Socket s = ss.accept(); //有阻塞作用
new Thread(new ServerThread(s)).start(); //进来一个开启一个线程
}
实例:模拟聊天软件,实现两个人互聊。
UDP传输:
UDP是User Datagram Protocol的简称,是一种无连接的协议。
无须建立连接,有数据就发送,效率高。因无连接,所以是不可靠协议。
发送端的建立:
1,建立udpsocket服务
//发送服务端口号可以自己设定,也可以不用设,使用默认的。自动分配
DatagramSocket ds = new DatagramSocket();
2,提供数据,并将数据封装到数据包中( DatagramPacket )
//把信息发送ip为192.168.0.103 的主机。程序端口号为10001
//如果改为192.168.0.255 (最后一个数改为255,就是广播发送,可以实现群聊)。
DatagramPacket dp = new DatagramPacket(bt,0,bt.length,InetAddress.getByName("192.168.0.103"),10001);
3,通过socket服务的发送功能,将数据包发出去
ds.send(dp);
4,关闭资源。
接收端的建立:
1,建立udp服务(明确接收的端口号)
DatagramSocket ds = new DatagramSocket(10001); //接收来自端口10001的信息
2,定义一个数据包,用来保存接收到的数据包
byte[] by = new byte[1024];
DatagramPacket dp = new DatagramPacket(by,0,by.length);
3,把接收到的数据包,保存到定义好的数据包中。
ds.receive(dp); //阻塞方式
4,通过数据包对象的特有功能,将数据包里的数据取出。
String date = new String(dp.getData(),0,dp.getLength());
5,关闭资源。
注意:在使用中客户端和服务端都出现等待情况,这是因为它们都有其阻塞方法。
心得:在网络中一般使用UDP传输,因为效率高,使用UDP传输,可以实现广播传输。