Android_开发_Day18_网络
Android_开发Day18网络
目的:
学会建立网络连接,使用网络传输数据。
技术:
<1> 网络:
所谓的网络就是在两台不同的计算机之间传递数据。我们常说的客户端和服务器就是两台计算机之间传递数据的例子,客户端可以是一个桌面应用程序,也可以是一个手机端的app等等,而服务器就是储存数据的地方,通常的服务器都是有数据库的,这个数据库就是用来储存客户端所需要的资源的。了解了这些之后我们就要了解两台计算机之间是怎么进行连接的,我们通常所说的网络链接就是url(统一资源定位),例如:https://www.baidu.com,这里的http或者说是https就是协议,主要是tcp/ip协议,而TCP协议主要是TCP协议,当然也有UDP协议,两者的区别是TCP安全,因为它是依附于连接的数据传输,而UDP是无连接的传输,就像古代的飞鸽传书一样,只要知道地址就可以给你传过来,不管你是否被劫持之类的,虽然快速但不安全。IP协议就是IP地址,世界上的每台计算机都有一个独一无二的地址,叫IP地址,该地址由四个八位二进制组成,总共32位,这就是IPv4,ipv6就不讲了,例如:114.114.114.114,因此我们可以通过IP地址去访问任何一台连接网络的计算机,在浏览器中输入该地址就行了,但是有没有觉得很麻烦,因为这个数字不好输入,也不好记住,因此人们就跟他取了一个容易记住的名称,就比如说这里的www.baidu.com,名字是取了但是光看还是不知道他的IP地址啊,这是就需要一个翻译官DNS来为你翻译这个名字并找到对应的地址,DNS也是一台服务器,因此在访问网页之前必须先访问DNS,然后DNS再把网址对应的IP地址返回给计算机,然后计算机就知道该访问哪个地址。
<2> java中的网络连接:
在Java中网络的连接需要用到Socket类和ServerSocket类,分别对应客户端和服务器,这两个类里面要用到的方法ServerSocket里的accept()方法,如果有客户端接入那么就返回一个该客户端的Socket,接下来就是Socket的getOutputStream()和getInputStream()分别是得到客户端的输入流和输出流。在创建客户端的Socket时要告诉它要连接的主机地址以及要操作的应用的端口,同理在创建ServerSocket的时候要设置你这个服务器的端口是多少。
技术如何使用:
我们可以模拟QQ上的聊天程序,因此我们需要分别写客户端和服务器端的代码,同时由于QQ聊天的时候允许同一个人同时间发送多条消息,因此需要用到以前的多线程的知识,代码如下:
public class MServer {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(8848);
Socket socket = serverSocket.accept();
new MServerThread(socket).start();
Scanner scanner = new Scanner(System.in);
while (true) {
String line = scanner.nextLine();
PrintStream printStream = new PrintStream(socket.getOutputStream());
printStream.println(line);
}
}
static class MServerThread extends Thread{
private Socket socket;
public MServerThread(Socket socket){
this.socket = socket;
}
@Override
public void run() {
while (true) {
try {
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
System.out.println(bufferedReader.readLine());
} catch (IOException e) {
System.out.println("网络出错,稍后请重试");
System.exit(-1);
}
}
}
}
}
这是服务器端的代码,服务器的主线程是发送信息,子线程是接收信息。
class MClient{
public static void main(String[] args) throws IOException {
Socket socket = new Socket("10.129.17.80",8848);
new MClientThread(socket).start();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
while (true) {
String line = bufferedReader.readLine();
PrintStream printStream = new PrintStream(socket.getOutputStream());
printStream.println(line);
}
}
static class MClientThread extends Thread{
private Socket socket;
public MClientThread(Socket socket){
this.socket = socket;
}
@Override
public void run() {
while (true) {
try {
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
System.out.println(bufferedReader.readLine());
} catch (IOException e) {
System.out.println("网络出错,稍后请重试");
System.exit(-1);
}
}
}
}
}
这是客户端的代码,同服务器端一样,主线程发,子线程收。
在写上面的代码时我遇到了两个问题,一是,发送信息的时候我用了BufferWriter来发送信息,发现是不行的,至于为什么不行还有待探究,接下来就是在用try和catch的时候用了try(代码)想出错时自动回收资源发现也是有错误的,至于哪里出错了,还是没弄明白。
实际使用效果:
服务器端的效果
客户端的效果
总结:
网络这部分比较主要的就是要如何正确的连接上两台计算机,同时也要注意数据的传输需要用那些输入输出流,可能这节最让人头疼的估计就是我到底是该输入呢还是该输出呢,学文件的i/o的时候还不觉得,一到这里就乱了。