网络编程

来源:互联网 发布:heroku 域名 编辑:程序博客网 时间:2024/06/10 00:42
网路编程:
过程
1.找到对方 IP地址
2.找到应用程序 端口号(逻辑端口)
0-1024 被系统程序保留
0-65535 最好不用前面的
web服务 80
tomcat 8080
mysql 3306
3.定义通信规则 协议
127.0.0.1 本地回环IP地址
192.168.X.X 保留段
    
    知识扩展:(IP地址与子网掩码之间以及各自的关系)


网络模型:
OSI参考模型
应用层
表示层
会话层
传输层
网络层
数据链路层
物理层
   从上到下叫数据封包,发送到接收方从下到上,数据拆包


TCP/IP参考模型
应用层(http、ftp)
|--应用层、表示层、会话层、
传输层(tcp、udp)
网际层(ip )
主机至网络层
|--数据链路层、物理层




网络通讯要素:
1.IP地址
网络中设备的标识
本地回环地址:127.0.0.1主机名:localhost


2.端口号
3.传输协议


InetAddress
|--Inet4Address
|--Inet6Address

该类没有构造函数,通过静态方法返回一个类对象



String getHostAddress();
String getHostName();
static InetAddress getByName(String host);
static InetAddress getByAddress(String host,byte[] addr);
static InetAddress getByAddress(byte[] addr);
static InetAddress getLocalHost();


端口号:
用于标识进程的逻辑地址,不同进程的标识


传输协议:
扩展:http(应用层)
通讯的规则
常见协议:TCP、UDP
UDP:(面向无连接)
将数据及源和目的封装在数据包中,不需要建立连接
每个数据包的大小不能超过64k
因为无连接,是不可靠协议
不需要连接,速度快


TCP:(面向连接)
建立连接,形成传输数据的通道
在连接中进行大数据量传输
通过三次握手完成连接,是可靠协议
必须建立连接,效率会稍低
Socket:
Socket就是为网路服务提供的一种机制
通信的俩端都有Socket
网络通信其实就是Socket间的通信
数据在俩个Socket间通过IO传输


udp传输过程(DatagramSocket,DatagramPacket)

1.创建udpsocket,建立端点
DatagramSocket ds=new DatagramSocket();//1.空参数2.int port 3.int port,InetAddress laddr
ds.close();
ds.receive();//阻塞式方法,可以结合while(true)循环,实现持续循环等待
ds.send();


2.定义数据包,用于存储数据
DatagramPacket dp=new DatagramPacket(byte[] buf,int lenth);//还可以加入InetAddress address,int port
dp.getAddress();
dp.getData();
dp.getLength();
dp.getOffset();
dp.setPort();
再次被科普: 192.168.1.0:该地址为网段地址

192.168.1.254:该地址为广播地址


Udp在传输过程中,分别建立发送端和接收端,在发送端,先建立DatagramSocket服务,然后将字符串数据.getBytes(),通过DatagramPacket打包,指定IP地址和端口号,然后通过DatagramSocket服务,将数据包发送出去。在接收端,也是先建立DatagramSocket 服务,定义一个DatagramPacket来接收数据,通过DatagramSocket的接收方法,接收数据,然后通过DatagramPacket的特有方法,读取数据包中的数据信息。

优化之一:1.在receive端,使用while(true)和receive()结合,可以实现一直等待,有数据就接收的功能,但是不要将服务建立语句写到while(true)中,会出现BindException

优化之二:2.将Send和Rece动作用线程封装起来,将发送数据和接收数据的动作封装到实现了Runnable接口发送和接收类的run()方法中,在主方法中建立DatagramSocket服务的SendSocket和ReceSocket,然后创建俩个线程,Send线程和Rece线程。


TCP传输过程
1.建立客户端和服务器端
2.建立连接后,通过Socket中的IO流进行数据的传输
3.关闭socket,同样,客户端与服务器端是俩个独立的应用程序


Tcp传输过程中,先建立Socket客户端,并指定与之对应的服务器的IP地址和端口,为了发送数据,获取socket流中的输出流,即调用socket.getOutpuStream(),然后通过write方法,将数据写入到输出流中。在服务端建立时,先建立ServerSocket服务,并建立同时监听一个端口,通过accept方法接收一个客户端对象,然后使用该客户端对象的读取流来读取数据。

优化之一:1.使用到了Buffered缓冲技术,调用了readLine()方法,该方法会从客户端读到数据发送给服务端,由于发送数据中没有回车符,故出现了客户端和服务端的双重等待。

优化之二:2.在写数据的时候可以将BufferedWriter换成PrintWriter,该流提供了自动刷新和newLine()方法,从而更完美的解决了该问题

优化之三:3.在上传文件的演示中,由于客户端在上传完文件后,要读一次Socket流,接收服务端发来的“上传成功提示”,而服务端则在等待客户端的继续录入,从而出现了俩端都在等的现象。解决办法之一,定义结束标记,在上传文件结束后,在写以个“over”发送给服务端,当服务端读取到“over”时,结束传输。这种方法是不安全的,如果文件中带有了结束标记,就会出现文件上传成功但是不完整的现象。

优化之四:4.在发送文件之前通过System.currentTimeMilis()方法,获取一个时间戳,在文件上传前将时间戳发送到服务器端,然后当文件上传结束后,在发一次时间戳,如果服务端监测到接收内容与原来的时间戳一致的话,就结束上传,将上传成功发送给客户端。这个方法也比较繁杂

优化之五:5.调用客户端Socket服务的shutdownOutput()方法shutsdownInput,完美解决。

优化之六:6.为实现服务器端的循环等待,加入多线程技术,将服务器端的类实现Runnable,并将读取方法写入run()方法中封装起来,



Url类

url.getProtocal();//获取协议

url.getHost();

url.getPort();

url.getPath();

url.getFile();

url.getQuery();//不懂


url.openConnection();//URLConnection conn=url.openConnection();   该语句可以建立连接,并返回一个URLConnection对象,表示到URL

所引用的远程对象的连接。该对象可以直接获取你输入流,conn.getInputStream();该功能实现了应用层的数据传输。



域名解析过程:

1.将访问地址,发到DNS服务器,解析完之后返回一个IP地址

2.然后访问该IP地址,到达网站

0 0