目的
1、熟练掌握Java语言的网络编程
2、学会代码实现客户端与服务器端、客户端与客户端、两台不同计算机之间的数据传递
3、了解相关基础知识
相关技术、及其使用
1、网络相关知识:
(1)客户端: 用户使用的端口
(2)服务器端:存储和处理数据的地方
(3)URL:统一的资源定位
(4)域名: 类似于:www.baidu.com
(5)IP地址:唯一标识某一台电脑的地址,32位:分成四个部分,每个部分8个字节
(6)端口号:唯一标识某台电脑上的某一进程(程序)
(7)http://www.baidu.com/search?code =android:HTTP和HTTPS协议、域名、search(对应的后台程序)、?(表示运行这个程序需要传递的参数)、code =android code是服务器端规定的字段、&如果有多个参数使用&符号链接
(8)数据传输协议:TCP/IP协议
TCP:面向连接的 安全的
UDP:面向无连接的,不安全的,但是快速的
(9)数据传输:Socket实现 -> 套接字
Socket类:客户端
ServerSocket:服务器端(两者不能单独使用)
(10)读取数据:
读取数据:服务器读取 客户端读取 BufferedReader->inputStreamReader ->socket.getInputStream
终端读取:BufferedReader->inputStreamReader ->System.in
输出:客户端输出 服务器端输出
BufferedWriter -> OutputStreamWriter -> socket.getOutputStream
PrintStream -> socket.getOutputStream
2、具体使用
首先,模拟客户端
(1)创建用于通讯的socket对象,指明IP地址和端口号
/*1、创建用于通讯的socket
指明和谁通讯:IP地址 端口号
*/
Socket socket = new Socket("127.0.0.1",8989);
(2)接收服务器端的数据
//接收服务器端的数据
//InputStream inputStream = socket.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
(3)客户端打印从服务器端获取的数据
String line = null;
while((line = br.readLine()) != null){
System.out.println(line);
}
(4)客户端向服务器端发送数据
PrintStream ps = new PrintStream(socket.getOutputStream());
ps.println("你好");
socket.shutdownOutput();
其次,创建服务器端
(1)创建服务器端的ServerSocket对象
// 1、创建服务器端的ServerSocket
ServerSocket ss = new ServerSocket(8989);
(2)获取连接的客户端的socket
//2、获取连接的客户端的socket
Socket clientSocket = ss.accept();
(3)服务器端向客户端发送数据
//3、向客户端发送数据
//或者 BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(clientSocket.getOutputStream()));
PrintStream ps = new PrintStream(clientSocket.getOutputStream());
ps.println("登陆成功");
//输出完毕
clientSocket.shutdownOutput();
(4)接收客户端发来的数据
BufferedReader br = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
String line = null;
while ((line = br.readLine()) != null){
System.out.println(line);
}
相关延伸:
(1)客户端输入相关数据与服务器端进行交互时:
相关代码大致相同,但是,客户端在打印相应数据时,可能会出现IO异常,那么,出现这种异常就需要手动处理,不能抛出给外部处理:
try {
socket = new Socket("127.0.0.1",8888);
//接受服务器端信息
//从键盘输入数据 发送给服务器端
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String line = null;
//打印相应数据
while ((line = br.readLine()) != null){
System.out.println(line);
}
} catch (IOException e) {
System.out.println("网络出错,请重新登录");
}finally {
//出现错误就关闭连接
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
而服务器端也需要手动处理IO异常。另外,
服务器端是从终端接收用户输入的数据(因为用户输入数据上传到终端)
//从终端接收数据
BufferedReader keyin = new BufferedReader(new InputStreamReader(System.in));
(2)客户端上传文件到服务器端
首先,在上面客户端与服务器端交互的代码基础上实现两者之间的交互。
然后,客户端里面需要先想服务器端写入内存:
1.将文件写入内存:
//1、将文件写入内存
String path = "C:/Users/asus/Desktop/1.jpg";
FileInputStream fis = new FileInputStream(path);
注意:文件的路径要保证正确
2.创建字节流的OutputStream
//2、创建字节流的outputStream
BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream());
byte[] buf = new byte[1024];
int len = -1;
while ((len = fis.read(buf)) != -1){
bos.write(buf, 0,len);
}
socket.shutdownOutput();
注意:这个地方我们是发送的图片,所以用字节流发送和打印
服务器端:
1.设置正确的文件写入的路径
String path = "D:/Andriod/day85/java5/src/main/java/day13/day13media/1.jpg";
FileOutputStream fos = new FileOutputStream(path);
byte [] buf = new byte[1024];
int len = -1;
while ((len = bis.read(buf)) != -1){
fos.write(buf,0,len);
}
(3)多个客户端之间进行互相通讯
对聊:
客户端:
主线程:用于接收终端输入同时将终端的输入发送给终端服务器
子线程:接收终端服务器发过来的数据
服务器端:
主线程:接收终端输入同时将终端输入发送给客户端
子线程:接收客户端发来的数据
实现对聊和上面的主要区别在于:
需要创建客户端和服务器端的子线程处理对应端口接收的数据
群聊:
群聊和对聊实现的主要区别在于:需要创建多个客户端的子线程分别接收从服务器端传来的数据。
感想
学习的Java语言中的网络方面的知识,感觉并不是很难,都是死点子,比如说:接收数据和输出数据时,客户端和服务器端都是相同的操作。同时,特别注意一点就是从客户端上传文件到服务器端时,一定要保证文件路径一定要正确和找的到,同时,在处理时,还需要自己处理IO异常。
网友评论