一、网络编程概述
二、网络的目的
直接或间接地通过网络协议与其它计算机进行通讯。
三、要想实现网络传输,需要考虑以下两个问题
①使用TCP协议前,须建立TCP链接,形成传输数据通道。
②传输前,采用“三次握手”方式,是可靠的。
③TCP协议进行通信的两个应用进程:客户端、服务端。
④在连接中可进行大数据量的传输。
⑤传输完毕,需释放已建立的连接,效率低。
2.UDP协议
①将数据、源、目的封装成数据包,不需要建立连接。
②每个数据报的大小限制在64K内。
③因无需连接,故是不可靠的。
④发送数据结束时无需释放资源,速度快。
四、Socket 编程
当连接建立时,服务器会创建一个 Socket 对象。客户端和服务器现在可以通过对 Socket 对象的写入和读取来进行进行通信。
java.net.Socket 类代表一个套接字,并且 java.net.ServerSocket 类为服务器程序提供了一种来监听客户端,并与他们建立连接的机制。
五、基于TCP_IP协议的网络编程
①服务器实例化一个 ServerSocket 对象,表示通过服务器上的端口通信。
②服务器调用 ServerSocket 类 的 accept() 方法,该方法将一直等待,直到客户端连接到服务器上给定的端口。
③服务器正在等待时,一个客户端实例化一个Socket对象,指定服务器名称和端口号来请求连接。
④Socket 类的构造函数试图将客户端连接到指定的服务器和端口号。如果通信被建立,则在客户端创建一个 Socket 对象能够与服务器进行通信。
⑤在服务器端,accept() 方法返回服务器上一个新的 socket 引用,该 socket 连接到客户端的 socket。
⑥连接建立后,通过使用I/O流在进行通信。每一个 socket 都有一个输出流和一个输入流。客户端的输出流连接到服务器端的输入流,而客户端的输入 流连接到服务器端的输出流。
//1.创建一个 Socket 对象,通过构造器指明服务端的IP地址以及接收程序的端口号
Socket socket = new Socket(InetAddress.getByName("127.0.0.1"), 9090);
//2.getOutputStream():发送数据,方法返回 OutputStream 的对象
OutputStream os = socket.getOutputStream();
//3.具体的输出流程
os.write("我是客户端请多关照!".getBytes());
//4.关闭相应的流和 Socket 的对象
os.close();
socket.close(); 服务端代码://1.创建一个 ServerSocket 对象,通过构造器指明自身的端口号
serverSocket = new ServerSocket(9090);
//2.调用其accept()方法,返回一个 Socket 的对象
s = serverSocket.accept();
//3.调用 Socket 对象的getInputStream()方法获取一个从客户端发送过来的输入流
is = s.getInputStream();
//4.对获取的输入流进行的操作
byte[] b = new byte[20];
int len;
while ((len = is.read(b)) != -1) {
String str = new String(b, 0, len);
System.out.println(str);
}
System.out.println("收到来自于" + s.getInetAddress().getHostAddress() + "的连接");
//5.关闭相应的流以及 Socket、ServerSocket 的对象
is.close();
s.close();
serverSocket.close(); 六、基于UDP_IP协议的网络编程
①类 DatagramSocket 和 DatagramPacket 实现了基于UDP协议的网络程序。
②UDP数据报通过数据报套接字 DatagramSocket 发送和接收,系统不保证UDP数据报一定能够安全送到目的地,也不确定什么时候可以抵达。
③DatagramPacket 对象封装了UDP数据报,在数据报中包含了发送端的IP地址和端口号以及接收端的IP地址和端口号。
④UDP协议中每个数据报都给出了完整的地址信息,因此无须建立发送方和接收方的链接。
①DatagramSocket 和 DatagramPacket。
②建立发送端,接收端。
③建立数据包。
④调用 Scoket 的发送、接收方法。
⑤关闭 Scoket。
3.发送端与接收端是两个独立的运行程序。
//1.这里我们创建一个空参的 DatagramSocket 对象,我们将IP地址和端口号放到数据报中
DatagramSocket ds = new DatagramSocket();
//2.准备好要发送的数据
byte[] b = "你好,我是要发送的数据".getBytes();
/**
* 创建一个数据报,每一个数据报不能大于64k,都记录着数据信息、发送端IP、端口号以及要发送到的接收端的IP、端口号
* DatagramPacket(byte buf[], int offset, int length, InetAddress address, int port)
* @param buf 包数据。
* @param offset 包数据偏移量。
* @param length 包数据长度。
* @param address 目的套接字地址。
* @param port 目的端口号。
*/
DatagramPacket packet = new DatagramPacket(b, 0, b.length, InetAddress.getByName("127.0.0.1"), 9090);
//4.调用 Scoket 的发送方法
ds.send(packet);
//5.关闭 Scoket
ds.close(); 接收端代码://1.创建一个 DatagramSocket 对象,此处需要有端口号这个参数,指明使用哪个应用来接收信息
DatagramSocket ds = new DatagramSocket(9090);
//2.创建一个数组
byte[] b = new byte[1024];
//3.创建一个数据报来接收发送端发过来的数据信息
DatagramPacket packet = new DatagramPacket(b, 0, b.length);
//4.调用 Scoket 的接收方法
ds.receive(packet);
//5.通过字符串输出一下,来看一下接收的信息是否正确
String str = new String(packet.getData(), 0, packet.getLength());
System.out.println(str);
//6.关闭 Scoket
ds.close(); 这样就能实现一个简单的UDP的网络通信。七、URL编程
2.URL的基本结构有5部分组成:
①<传输协议>://<主机名>:<端口号>/<文件名>
例如:https://192.168.100.189:8080/helloworld.index.jsp
public String getProtocol() 获取该URL的协议名
public String getHost() 获取该URL的主机名
public String getPort() 获取该URL的端口号
public String getPath() 获取该URL的文件路径
public String getFile() 获取该URL的文件名
public String getRef() 获取该URL在文件中的相对位置
public String getQuery() 获取该URL的查询名
②若希望输出数据,例如向服务端的程序发送一些数据,则必须先与URL建立连接,然后才能对其进行读写,此时需要使用 URLConnection。
③URLConnection:表示到URL所引用的远程对象的连接。当与一个URL建立连接时,首先要在一个URL对象上通过方法openConnection()生成对应的 URLConnection 对象。如果连接过程失败,将产生IOException。
//创建一个URL对象
URL url = new URL("http://127.0.0.1:8080/examples/hello.txt");
//如何将服务端的资源读取进来openStream
InputStream is = url.openStream();
byte[] b = new byte[20];
int len;
while ((len = is.read(b)) != -1) {
//打印在控制台上
String str = new String(b, 0, len);
System.out.println(str);
}
//如果既有数据的输入又有数据的输出则考虑使用URLConnection
//将在服务器 hello.txt 文件中读取出来的信息保存到 abc.txt 文件中
URLConnection urlConn = url.openConnection();
InputStream is1 = urlConn.getInputStream();
FileOutputStream fos = new FileOutputStream(new File("abc.txt"));
byte[] b1 = new byte[20];
int len1;
while ((len1 = is1.read(b1)) != -1) {
fos.write(b1, 0, len1);
}
is.close();
fos.close();
is1.close();
1068



被折叠的 条评论
为什么被折叠?



