1. Java中的网络通信程序包
Java提供网络通信功能的包是java.net
包,提供的网络功能有三大类:
- URL是三大功能中最高级的一种,通过URL Java程序可以直接送出或读入网络上的数据;
- Socket是传统网络程序最常用的方式,可以想象为两个不同的程序通过网络的通信信道;
- Datagram是更低级的网络传输方式,它把数据的目的记录在数据包中,然后直接放在网络上;
本文主要讲述前两种包的使用。
2. URL爬虫
创建URL类对象要使用java.net包中提供的java.net.URL
类的构造方法:
然后调用该对象的openConnection()方法就会返回一个对应URL地址的URLConnection对象,
在建立URLConnection类对象的同时就已经在本级和URL节点之上建立了一条HTTP通道,之后:
- 可以使用
getInputStream()
方法获得URL节点的信息; - 可以使用
getOutputStream()
方法向URL节点处传送信息;
示例代码:
import java.io.IOException;
import java.net.*;
import java.io.*;
public class URLtest {
public static void main(String[] args) {
String picture_url = "http://mculover666.cn/image/20190814/NQqt1eRxrl1K.png";
try {
// 创建URL对象
URL pUrl = new URL(picture_url);
//创建URL
URLConnection pcUrl = pUrl.openConnection();
//创建数据流
InputStream in = pcUrl.getInputStream();
FileOutputStream fout = new FileOutputStream("E://logo.png");
//拉取/写入数据
int temp;
while((temp = in.read()) != -1) {
fout.write(temp);
}
//关闭流
in.close();
fout.close();
}
catch (Exception e) {
System.out.println("发生异常啦!");
}
finally {
System.out.println("Finish!");
}
}
}
爬取到图片:
3. Socket程序(TCP)
以下Socket程序都是指基于TCP通信的Socket。
Socket通信分为服务器端和客户端,在Java中,基于TCP协议实现网络通信的类有两个:在
客户端的Socket类和在服务器端的ServerSocket类。
两者通信建立过程如下:
- ① 服务器端生成一个
ServerSocket
类的实例对象,随时监听客户端的连接请求; - ② 客户端生成一个
Socket
类的实例对象,并发出连接请求; - ③ 服务器端通过
accept()
方法接收到客户端的请求后,开辟一个接口与之进行连接,并生成所需的I/O数据流; - ④ 通信都是通过一对
InputStream()
和OutputStream()
进行的; - ⑤ 通信结束后,两端分别
close()
对应的Socket接口;
服务端示例代码如下:
import java.net.*;
import java.io.*;
public class ServerSocketDemo {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = null;
PrintWriter out = null;
BufferedReader in = null;
try {
System.out.println("listening on port: 8000...");
serverSocket = new ServerSocket(8000);
} catch (IOException e) {
System.err.println("Could not listen on port: 8000.");
System.exit(1);
}
Socket clientSocket = null;
try {
clientSocket = serverSocket.accept();
out = new PrintWriter(clientSocket.getOutputStream(), true);
in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
} catch (IOException e) {
System.err.println("Accept failed.");
System.exit(1);
}
String fromUser;
int strlen;
while (true) {
fromUser= in.readLine();
strlen=fromUser.length();
out.println("received string's length is: "+ strlen);
System.out.println("Server: received string's length is: "+ strlen);
if(fromUser.equalsIgnoreCase("Bye"))
break;
}
out.close();
in.close();
clientSocket.close();
serverSocket.close();
}
}
客户端示例代码如下:
import java.io.*;
import java.net.*;
public class ClientSocketDemo {
public static void main(String[] args) throws IOException {
Socket echoSocket = null;
PrintWriter out = null;
BufferedReader in = null;
try {
echoSocket = new Socket("127.0.0.1", 8000);
out = new PrintWriter(echoSocket.getOutputStream(), true);
in = new BufferedReader(new InputStreamReader(
echoSocket.getInputStream()));
} catch (UnknownHostException e) {
System.err.println("Don't know about host: taranis.");
System.exit(1);
} catch (IOException e) {
System.err.println("Couldn't get I/O for "
+ "the connection to: taranis.");
System.exit(1);
}
BufferedReader stdIn = new BufferedReader(
new InputStreamReader(System.in));
String userInput;
while (true){
userInput = stdIn.readLine();
out.println(userInput);
System.out.println("echo: " + in.readLine());
if(userInput.equalsIgnoreCase("Bye"))
break;
}
out.close();
in.close();
stdIn.close();
echoSocket.close();
}
}
首先运行服务端:
然后运行客户端并发送数据:
可以看到收到了服务器回应,再来看看服务端的输出:
4. Socket文件传输示例程序
server端代码:
import java.net.*;
import java.io.*;
public class FileServerSocketDemo {
public static void main(String[] args) {
try {
ServerSocket SS = new ServerSocket(8000);
System.out.println("listening on port 8000...");
//阻塞等待客户端连接
Socket socket = SS.accept();
System.out.println("client connected!");
//创建数据流
DataInputStream dis = new DataInputStream(socket.getInputStream());
FileOutputStream fo = new FileOutputStream("E://test.txt");
int temp;
while ((temp = dis.readInt()) != -1) {
fo.write(temp);
}
//关闭流
dis.close();
fo.close();
socket.close();
SS.close();
} catch (IOException e) {
System.out.println("发生异常啦!");
} finally {
System.out.println("Finish!");
}
}
}
客户端代码:
import java.io.*;
import java.net.*;
public class FileClientSocketDemo {
public static void main(String[] args) {
try{
//创建socket并连接服务器
Socket socket=new Socket("127.0.0.1",8000);
//创建数据流
DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
FileInputStream fi = new FileInputStream("E://sendtest.txt");
//传输文件
int temp;
while((temp=fi.read()) !=-1)
dos.writeInt(temp);
//关闭流和socket
dos.close();
fi.close();
socket.close();
}
catch(IOException e){
System.out.println("发生异常啦!");
}
finally{
System.out.println ("Finish!");
}
}
}
运行结果如下:
接收更多精彩文章及资源推送,欢迎订阅我的微信公众号:『mculover666』。