- 网络
- 网络编程:在两台不同的计算机之间数据传递
- 1.QQ聊天
- 2.打开app 刷新页面 就有数据
- 3.打开浏览器 网页
- 客户端 :手机app 浏览器 桌面QQ
- 服务器端:存储/处理数据
- URL:统一的资源定位
- http://www.baidu.com/search?code=android
- http/https:传输协议 Tcp/IP
- www.baidu.com 域名:表示一台网络中的电脑
- ipv4/ipv6ip地址:唯一标识一台网络中的计算机
- 32位:四个部分 每个是8个字节
- id 172.20.10.15<->www.baidu.com
- DNS服务器:域名解析 将www.baidu.com类型的域名解析为对应的ip地址
- search 对应的后台程序文件 语言php Java isp
- ? 表示运行这个程序 需要传递的参数
- code=android code是服务器端规定的字段
- 如果有多个参数使用&符号链接
- IP地址:唯一标识某一台电脑
- 端口号标识这台电脑上的运行程序
- 数据传输: tcp/ip协议
- tcp;面向连接的 安全的 打电话
- UDP:面向无连接的 ,不安全 但是
- 网络中的数据传输:Socker 实现->套接字
- Socker类:客户端
- ServerSocker:服务器端
- 读取数据:服务器读取 客户端读取
- BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
- 读取终端
- BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
- 客户端输出 服务器端输出
- BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(clientSocket.getOutputStream()));
- PrintStream ps = new PrintStream(clientSocket.getOutputStream());
客户端和服务器端的数据传输
模拟客户端
class Client
{
public static void main(String[]args) throws IOException {
//1.创建用于通信的socket
// 指明和谁通信:ip地址 端口号
Socket socket = new Socket("192.168.43.164",8989);
// 接收服务器端的数据
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
//读取服务器端发来的数据
String line = null;
while ((line = br.readLine()) != null){
System.out.println(line);
}
// 客户端向服务器端发送数据
PrintStream ps = new PrintStream(socket.getOutputStream());
ps.println("hollow");
socket.shutdownOutput();
}
}
模拟服务器端
class Server{
public static void main(String[]args) throws IOException {
//1.创建服务器端的serverocket
ServerSocket ss = new ServerSocket(8989);
//2.获取连接的客户端的socket
Socket clientSocket = ss.accept();
//3.向客户端发送数据
//BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(clientSocket.getOutputStream()));
PrintStream ps = new PrintStream(clientSocket.getOutputStream());
ps.println("登录成功");
//4.接收客户端发来的数据
BufferedReader br = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
String line = null;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
}
}
手动输入内容
- socket扮演的是客户端
- Serversocker扮演的是服务器端
- 客户端 1.文本 2.图片 3.视频 音频
模拟客户端
class myClient{
public static void main(String[]args){
//连接服务器短的socket
Socket socket=null;
try{
socket=new Socket("192.168.43.164",8989);
//接受服务器端数据
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){
System.out.println("出错 请重新输入");
}
}
}
}
模拟服务器端
class MyServer{
public static void main(String[]args){
//创建 ServerSocket
try( ServerSocket ss=new ServerSocket(8989);){
//监听客户端的连接
Socket socket=ss.accept();
//发送数据
//从终端接收数据Buffer 一次接受多个字节
BufferedReader keyin=new BufferedReader(new InputStreamReader(System.in) );
//获取向客户端输出数据的输出流
PrintStream ps=new PrintStream(socket.getOutputStream());
String Line=null;
while ((Line =keyin.readLine())!=null)
{
//发送给客户端
ps.println(Line);
}
}catch (IOException e)
{
e.printStackTrace();
}
}
}
图片的输出
模拟客户端
- 使用字节流接受传递
class MyClasss{
public static void main(String[]args) throws IOException {
//连接发服务器 获得socke
Socket socket=new Socket("192.168.43.164",8989);
//创建服务器端对应的输入流 用于接受服务器发来的数据
BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream()));
System.out.println(br.readLine());
//1.向服务器端发送图片
String path="C:/Users/ASUS/Desktop/2.jpg";
//将文件写入内存
FileInputStream fis=new FileInputStream(path);
//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();
}
}
模拟服务器端
class Serve {
public static void main(String[] args) throws IOException {
ServerSocket ss = new ServerSocket(8989);
//监听客户端
//当有客户端连接这个服务器 就可以得到对应的socket
//当没有客户端来连接 服务器一直在这里等待
Socket socket = ss.accept();
//创建客户端对应的输出流对象 用于像这个客户端发送数据
PrintStream ps = new PrintStream(socket.getOutputStream());
ps.println("连接已成功");
//接受客户端传递过来的图片
BufferedInputStream bis = new BufferedInputStream(socket.getInputStream());
//文件对应的输出流
String path = "C:/Users/ASUS/AndroidStudioProjects/day4/java/src/main/java/swu/zxxday12/java/2.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);
}
}
}
对聊
- 客户端和服务器端都可以随意的发送内容
- 从终端输入
- 对聊
- 客户端:
- 主线程:接受终端输入 将终端的输入发送给服务器端
- 子线程:接受服务器端发过来的数据
- 服务器端:
- 主线程:接受终端输入 将终端输入发送给客户端
- 子线程:接受客户端发过来的数据
客户端
class Client {
public static void main(String[] args) throws IOException {
Socket socket = new Socket("192.168.43.164", 8989);
//用一个子线程处理服务器端数据
new Thread(new ClientThread(socket)).start();
//终端输入流对象
BufferedReader keyin = new BufferedReader(new InputStreamReader(System.in));
//服务器端的输入流对象 输入到服务器
PrintStream ps = new PrintStream(socket.getOutputStream());
//读取终端的输入 将数据输出给服务器
String line = null;
while ((line = keyin.readLine()) != null) {
ps.println(line);
}
}
}
服务器端
class ClientThread implements Runnable
{
private Socket socket;
public ClientThread(Socket socket)
{
this.socket=socket;
}
@Override
public void run()
{
BufferedReader br=null;
try{
//获取服务器端的输入流对象
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("网咯出错 请重新登陆");
System.exit(-1);
}finally
{
try{
if (br != null)
br.close();
if (socket!=null){
socket.close();
}
}catch (IOException ex)
{
ex.printStackTrace();
}
}
}
}
感悟:今天学习的网络,是有点难度的,特别是在一边敲代码一边听课的情况下,听的很模糊,也很痛苦,一旦跟不上,就只能过了,或者看旁边同学的。学的很累,但是收获也很多。网络的对聊,群聊,对于我们来说,是非常重要的技能,对于我们有很大的帮助。