有同学反应,光写数据结构太枯燥了,能不能搞点有趣的东西。嗯,我决定把网络这一部分提到前边来,做一点有趣的东西。这节课,我们体验一下Java网络编程。
Java语言被越来越多地应用在网络环境下,偏重于服务端的开发,还有分布式系统,软件定义硬件功能的场景等等。这些场景下,都非常依赖于语言的网络开发的能力。我们今天就尝试使用一下Java的网络编程。
Java的网络编程的接口大多数位于 http://java.net 和 java.nio 这两个package里,掌握这两个package是Java程序员必备的基础技能。
服务端
连接网络的过程和打电话的过程可以进行类比。比如,在手机网络中,每一个手机都有一个手机号,我们知道了某个提供服务的号码(比如外卖电话,银行电话等),拨通这个号码,就可以进行通话了。计算机网络也差不多,在计算机网络中,每个计算机上的每个网卡,都会有一个号码相互识别,这个号码在不同的场景下,会有不同的表现,比如,网址:知乎 - 与世界分享你的知识、经验和见解,再比如IP地址,再比如mac地址。后面我们会一点点讲解这些地址分别在什么场景下使用的。现在我们只需要知道一个服务端是要有一个地址的。而在我们的今天的场景下,这个地址(可以类比手机号码)就是IP地址。
不多说了,先上代码,跑起来,大家就明白了。
public class Server {
public static void main(String args[]) throws IOException{
ServerSocket ss = new ServerSocket(8080);
Socket conn = ss.accept();
BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(conn.getOutputStream()));
String s = br.readLine();
while (s != null) {
System.out.println(s);
bw.write(s.toUpperCase() + "\n");
bw.flush();
s = br.readLine();
}
br.close();
bw.close();
conn.close();
}
}
可以看到服务端在8080端口上开启了一个ServerSocket,等待连接。大家可以单步调试一下,看看当调用到accept的时候会发生什么情况。
然后就是创建一个Reader用于从网络上读数据,一个Writer向网络上写数据。
读进来的一行,把它转成大写,再发回到客户端。
客户端
也把代码放上来
public class Client {
public static void main(String args[]) throws IOException {
Socket conn = new Socket("127.0.0.1", 8080);
BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(conn.getOutputStream()));
bw.write("hello\n");
bw.flush();
String s = br.readLine();
System.out.println(s);
bw.write("world\n");
bw.flush();
s = br.readLine();
System.out.println(s);
br.close();
bw.close();
conn.close();
}
}
和服务端对应的,客户端创建一个Socket,这个 Socket 在构造的时候就发起向服务端的连接。连接了以后,也创建一个 Reader,一个 Writer。接着向服务端发送了两个小写字符串。
先运行服务端,再运行客户端,我们可以看到这样的结果:
问题
今天就先稍微体验一下吧。这里涉及到socket,ip 地址, 端口号(程序中是8080)这些到底有什么关系?在Java虚拟机里到底是如何实现的?这些问题,我们会在接下来的课程里慢慢解释。
今天的作业,从控制台上输入一个字符串,然后发送到服务端。