------- android培训、java培训、期待与您交流! ----------
网络编程
网络编程的目的:实现计算机之间的通信。
网络编程中的主要的问题:
要想让处于网络中的主机互相通信,只是知道通信双方地址还是不够的,还必须遵循一定的规则。有两套参考模型:
- OSI参考模型:模型过于理想化,未能在因特网上进行广泛推广。
- TCP/IP参考模型(或TCP/IP协议):事实上的国际标准。
- OSI七层模型:物理层、数据链路层,网络层,传输层,会话层,表示层,应用层。
- TCP/IP五层协议: 物理层、数据链路层,网络层,传输层,应用层。
运输层协议中的两个重要协议:
- 传输控制协议TCP(Transmission Control Protocol):是面向连接的运输层协议。即应用进程(或程序)在使用TCP协议之前,必须先建立TCP连接,在传输完毕后,释放已经建立的连接。利用TCP协议进行通信的两个应用进程,一个是服务器进程。另一个是客户进程。
- 用户数据报协议UDP(UserDatagram Protocol):用户数据报协议UDP是面向无连接的运输层协议。应用进程(或程序)在使用UDP协议之前,不必先建立连接。所以结束时也没有连接需要释放。因此,减少了开销和发送数据之前的时延。
- 域名:www.baidu.com
- IP 地址:115.239.211.110
端口号:端口号是一个16 位的整数 0~65535。其中,0~1023被预先定义的服务通信占用(如telnet占用端口23,http占用端口80等)。除非我们需要访问这些特定服务,否则,就应该使用 1024~65535 这些端口中的某一个进行通信,以免发生端口冲突。
- 连接到远程主机
- 绑定到端口
- 接收从远程机器来的连接请求
- 监听到达的数据
- 发送数据
- 接收数据
- 关闭连接
客户端Socket的工作步骤:
- 创建 Socket。
- 打开连接到 Socket 的输入/出流。使用 getInputStream()方法获得输入流,使用getOutputStream()方法获得输出流。
- 按照一定的协议对 Socket 进行读/写操作。
- 关闭 Socket。断开客户端到服务器的连接,释放线路
- 调用ServerSocket(int port) 创建一个服务器端套接字,并绑定到指定端口上
- 调用accept(),监听连接请求,如果客户端请求连接,则接受连接,返回通信套接字。
- 调用Socket类的 getOutputStream 和getInputStream 获取输出流和输入流,开始网络数据的发送和接收。
- 最后关闭通信套接字。
类DatagramSocket 和 DatagramPacket 实现了基于 UDP 协议网络程序。DatagramPacket 对象封装了UDP数据报,在数据报中包含了客户端的IP地址和端口号以及服务器的IP地址和端口号。
UDP数据报通过数据报套接字 DatagramSocket 发送和接收,系统不保证UDP数据报一定能够安全送到目的地,也不能确定什么时候可以抵达。
URL编程:又叫做统一资源定位符,它表示 Internet 上某一资源的地址,通过 URL 我们可以访问 Internet 上的各种网络资源,比如最常见的 www,ftp 站点。浏览器通过解析给定的 URL 可以在网络上查找相应的文件或其他资源。
URL的基本结构由5部分组成:
<传输协议>://<主机名>:<端口号>/<文件名>
例如: http://192.168.1.100:8080/helloworld/index.jsp
InetAdress类:对象含有一个Internet 主机地址的域名和IP地址。
public class TestInntAddress{
public static void main(String args[]) throws UnknownHostException {
//获取黑马官网的域名和ip地址
InetAddress inetAddress=InetAddress.getByName("www.itheima.com");
System.out.println(inetAddress);//www.itheima.com/115.29.149.42
//获取本地域名和ip地址
InetAddress address=InetAddress.getLocalHost();
System.out.println(address);//USER-89757/192.168.1.101
}
}
利用socket和severSocket实现服务端向服务端发送文件代码.
package com.testDemo;
import java.io.*;
import java.net.*;
import org.junit.Test;
public class SeverCientTest {
@Test
public void startServer() throws IOException{
Server server=new Server();
server.sendFile();
}
@Test
public void startClient() throws IOException{
Client client=new Client();
client.receiveFile();
}
}
//服务端
class Server {
public void sendFile() throws IOException {
// 创建serversocket对象,端口号8889
ServerSocket serverSocket = new ServerSocket(8889);
// 接受客户端请求,并得到socket 对象
Socket socket = serverSocket.accept();
// 传输文档
// 1.读取硬盘上文档
InputStream in = new FileInputStream("三国演义.txt");
InputStreamReader reader = new InputStreamReader(in);
BufferedReader bufferedReader = new BufferedReader(reader);
// 2.传到客户端
OutputStream out = socket.getOutputStream();
PrintWriter printWriter = new PrintWriter(out);
String str = null;
int i = 0;
while ((str = bufferedReader.readLine()) != null) {
if (i != 0) {
printWriter.write("\n");
}
printWriter.write(str);
i++;
}
// 关闭资源
in.close();
reader.close();
bufferedReader.close();
printWriter.close();
out.close();
socket.close();
serverSocket.close();
}
}
//客户端
class Client {
public void receiveFile() throws IOException {
// 连接服务端主机
InetAddress address = InetAddress.getByName("127.0.0.1");
// 创建socket对象
Socket socket = new Socket(address, 8889);
// 接受服务端的信息
InputStream in = socket.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
OutputStream out = new FileOutputStream("来自服务端的文件.txt");
BufferedWriter bufferedWriter = new BufferedWriter(
new OutputStreamWriter(out));
//从输入流读取数据并写入硬盘
String str;
int i = 0;
while ((str = reader.readLine()) != null) {
if (i != 0)
bufferedWriter.write("\n");
bufferedWriter.write(str);
i++;
}
// 关闭流资源
bufferedWriter.close();
out.close();
in.close();
reader.close();
socket.close();
}
}
------- android培训、java培训、期待与您交流! ----------