网络编程基础知识
01、两种软件架构(核心由javaweb阶段介绍)
A、BS架构
a.含义
B:Browser浏览器
S:Server服务器
b.举例
淘宝网站、京东商城、百度搜索、CSDN论坛、网页小游戏
c.特点
直接使用浏览器,访问网站,就可以进去
B、CS架构
a.含义
C:Client客户端
S:Server服务器
b.举例
QQ软件、迅雷软件、酷狗音乐、LOL游戏
c.特点
需要下载客户端,安装客户端,才能使用
02、网络编程三要素
A、IP地址 (ipv4和ipv6)
a.查看IP地址的指令 ipconfig
b.本地默认IP地址 127.0.0.1
B、端口号
a. 端口号 范围是 0~65535
b. 其中 0~1024 属于系统端口,不要使用
C、通信协议
a.TCP协议
传输数据大
安全性高
速度慢
b.UDP协议
传输数据小 64KB
安全性低
速度快
TCP通信流程
01、客户端(发送数据)操作步骤
A.创建Socket的对象
B.获取IO流对象(输出)
C.写数据
D.释放资源
02、服务端(接收数据)操作步骤
A.创建ServerScoket对象
B.连接客户端Socket对象
C.获取IO流对象(输入)
D.读数据
E.释放资源
03、服务端(回复数据)操作步骤
A.获取IO流对象(输出)
B.写数据
C.释放资源
D.关闭客户端socket
04、客户端(接收数据)操作步骤
A.获取IO流对象(输入)
B.读数据
C.释放资源
D.关闭客户端socket
05、注意事项
A.采用 BufferedReader 和 BufferedWriter 进行读写操作.
BufferedWriter 每次写完一个数据,需要换行和刷新.才能被 BufferedReader 读取得到
原因是: BufferedReader 采用 readLine()读取数据的结束条件是 "遇到换行符结束"
B.客户端的 Socket 和 服务端获取客户端Socket要匹配上
客户端的 Socket ----- 匹配到 ---> 服务端的 serverSocket.accept();
C.常见问题
a.IP地址如果写错
处于一种等待的状态. 最终出现 连接超时的情况 Connection timed out: connect
b.端口号如果写错
直接拒绝访问. 出现 java.net.ConnectException: Connection refused: connect
c.服务器重复运行两次及以上
端口号已经被占用了,不能重复使用 java.net.BindException: Address already in use: NET_Bind
案例
简单交互
package code.tcp;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
public class client {
public static void main(String[] args)throws IOException {
Socket clientSocket=new Socket("192.168.34.57", 777);
OutputStream os = clientSocket.getOutputStream();
os.write("你好,服务器".getBytes());
os.flush();
InputStream is = clientSocket.getInputStream();
int len;
byte[] a=new byte[1024];
len=is.read(a);
System.out.println(new String(a,0,len));
clientSocket.close();
}
}
package code.tcp;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class server {
public static void main(String[] args)throws IOException {
ServerSocket serverSocket = new ServerSocket(969);
Socket client = serverSocket.accept();
InputStream is = client.getInputStream();
byte[] a=new byte[1024];
int len;
len=is.read(a);
System.out.println(new String(a,0,len));
OutputStream os = client.getOutputStream();
os.write("收到谢谢".getBytes());
os.flush();
client.close();
}
}
文件上传
package code.shangchuan.youhua;
import java.io.*;
import java.net.Socket;
public class clientsocket {
public static void main(String[] args)throws IOException {
FileInputStream fis=new FileInputStream("f:\\音乐\\残酷月光.mp3");
Socket client=new Socket("192.168.34.92",985);
OutputStream os = client.getOutputStream();
int len;
byte[] b=new byte[1024];
while ((len=fis.read(b))!=-1){
os.write(b,0,len);
}
client.shutdownOutput();
BufferedReader br=new BufferedReader(new InputStreamReader(client.getInputStream()));
String line;
while((line=br.readLine())!=null){
System.out.println(line);
}
fis.close();
client.close();
}
}
package code.shangchuan.youhua;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
public static void main(String[] args)throws IOException {
ServerSocket ser=new ServerSocket(985);
while (true) {
Socket client = ser.accept();
new Thread(()->{
try {
upLoadFilm(client);
} catch (IOException e) {
e.printStackTrace();
}
}).start();
}
}
private static void upLoadFilm(Socket client) throws IOException {
String path="f:\\"+System.currentTimeMillis()+".mp3";
FileOutputStream fos=new FileOutputStream(path);
InputStream is = client.getInputStream();
int len;
byte[] b=new byte[1024];
while((len=is.read(b))!=-1){
fos.write(b,0,len);
}
BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(client.getOutputStream()));
bw.write("上传完毕,请查收");
bw.newLine();
bw.flush();
fos.close();
client.close();
}
}