关于java网络编程这块,是每个入门的开发者在初学java的时候都会接触的一个知识点,在此之前的要求就是必须得弄明白java繁多的各种IO流,所以在java网络编程这一块设计到大量的流操作,原因很简单,因为网络编程所做的工作基本就是数据的交互,在数据的交互中就产生了大量的IO流的读写。
在此之前有必要过一下底层网络的一些基础知识,关于计算网络体系结构与常规协议一图概括:
目前对于常见的web开发者来说,主要的网络编程作用在TCP/IP概念层模型的应用层,对于一些硬件或嵌入式,或Linux开发者来说,主要的网络编程作用在传输层。
在网络编程的世界,就是通过相关的技术和协议来规定数据在各层规定的模型传输,来到达数据的交互。如果需要精确的交互,还需要数据的传输具有目的性,而URL就是让数据具有目的性的保证。
URL(Uniform Resource Locator):www的统一资源定位符。主要由4部分组成:协议 、存放资源的主机域名、资源文件名和端口号。如果未指定该端口号,则使用协议默认的端口。例如http 协议的默认端口为 80。它的主要作用就是在www上,让每一信息资源都有统一且唯一的地址。
(注:URI(统一资源标准符) = URL + URN(统一资源命名))
在java.net包中提供了URL类,该类封装了大量复杂的涉及从远程站点获取信息的细节。
SOCKET: 我们开发的网络应用程序位于应用层。对于java开发者来说,在应用层使用socket套件字进行网络模块功能的开发是最常见的。因为socket是传输层供给应用层的编程接口。Socket就是应用层与传输层之间的桥梁。使用Socket编程可以开发客户机和服务器应用程序,可以在网络上进行通信。个人觉得重点还是提供了接口,使得我们不用关注底层的实现。(此接口在java.net.Socket包中)
//客户端小demo
public class ClientSocket {
public static void main(String args[]) {
String host = "127.0.0.1"; //消息传输的目的地IP
int port = 8919; 消息传输的目的地端口
try {
Socket client = new Socket(host, port);
Writer writer = new OutputStreamWriter(client.getOutputStream());
writer.write("Hello From Client");
writer.flush();
writer.close();
client.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
//服务端小dome
public class ServerClient {
public static void main(String[] args) {
int port = 8919;//服务端监听的端口,如果有数据过来就读取
try {
ServerSocket server = new ServerSocket(port);
Socket socket = server.accept(); //阻塞等待客户端发来消息
Reader reader = new InputStreamReader(socket.getInputStream());
char chars[] = new char[1024];
int len;
StringBuilder builder = new StringBuilder();
while ((len=reader.read(chars)) != -1) {
builder.append(new String(chars, 0, len));
}
System.out.println("Receive from client message=: " + builder);
reader.close();
socket.close();
server.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}