网络编程、TCP通信流程、文件上传案例
一、网络编程
1、两种软件架构
A、BS架构
a.含义
B:Browser浏览器
S:Server服务器
b.举例
淘宝网站、京东商城、博学谷、百度搜索、CSDN论坛、网页小游戏
c.特点
直接使用浏览器,访问网站,就可以进去
B、CS架构
a.含义
C:Client客户端
S:Server服务器
b.举例
QQ软件、迅雷软件、酷狗音乐、LOL游戏
c.特点
需要下载客户端,安装客户端,才能使用
2、网络编程三要素
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通信流程
1、客户端(发送数据)操作步骤
A. Socket clickSocket = new Socket(\"IP地址\",端口号); //创建Socket的对象
B. OutputStream os = clickSocket.getOutputStream(); //获取IO流对象(输出)
C. os.write(\"需要写入的数据\"); //写数据,可以进行流的增强
D. os.close(); //释放资源
2、服务端(接收数据)操作步骤
A. ServerSocket serverSocket = new ServerSocket(端口号); //创建ServerScoket对象
B. Socket clientSocket = serverSocket.accept(); //连接客户端Socket对象
C. InputStream is = clickSocket.getInputStream(); //获取IO流对象(输入)
D. int ch = is.read(); //读数据,可以进行流的增强
E. is.close(); //释放资源
3、服务端(回复数据)操作步骤
A. OutputStream os = clientSocket.getOutputStream(); //获取IO流对象(输出)
B. os.write(\"需要写回的数据\"); //写数据,可以进行增强流
C. os.close(); //释放资源
D. clickSocket.close(); //关闭客户端socket
4、客户端(接收数据)操作步骤
A. InputStream is = clickSocket.getInputStream(); //获取IO流对象(输入)
B. int ch = is.read(); //读数据 可以进行流的增强
C. is.close(); //释放资源
D. clickSocket.close(); //关闭客户端socket
5、注意事项
A.采用 BufferedReader 和 BufferedWriter 进行读写操作.
BufferedWriter 每次写完一个数据,需要换行和刷新.才能被 BufferedReader
读取得到
原因是: BufferedReader 采用 readLine()读取数据的结束条件是 \"遇到换行符结束\"
B.客户端的 Socket 和 服务端获取客户端Socket要匹配上
客户端的 Socket ----- 匹配到 ---> 服务端的 serverSocket.accept();
三、文件上传案例
1、图片文件上传服务器、基础版本的代码流程
客户端硬盘文件 -> 文件读取 -> 客户端写出 -> 服务端读取 -> 服务端写出 -> 服务端硬盘文件
2、相关代码的优化处理
A、服务端文件以毫秒值命名的处理问题
long time = System.currentTimeMillis();
B、客户端通知服务器数据书写完毕
clickSocket.shutdownOutput();
3.1、客户端代码
public static void main(String[] args) throws IOException {
//-----[1]读取来自于文件当中的流,写入到网络-------
FileInputStream fis = new FileInputStream(\"day10-code\\\\mdir\\\\03.jpg\");
Socket clientSocket = new Socket(\"192.168.34.36\",6666);
OutputStream os = clientSocket.getOutputStream();
//写数据
byte[] bytes = new byte[1024];
int len;
while ((len = fis.read(bytes))!=-1){
os.write(bytes,0,len);
}
//----[2]需要加上核心代码,书写一个结束标记 Output--------
clientSocket.shutdownOutput();
//---[3]接收来自于服务器端的数据(自恢复一句话)------
BufferedReader br = new BufferedReader(
new InputStreamReader(clientSocket.getInputStream()));
String s = br.readLine();
System.out.println(s);
//---[4]释放资源------
fis.close();
clientSocket.close();
}
3.2、服务端代码
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(1233);
//---[1]准备两个流(服务器的输入,文件的输出)------
//死循环优化
while (true) {
Socket clientSocket = serverSocket.accept();
//没上传一次开启一个此线程,
new Thread(()->{
try {
upLuadFile(clientSocket);
} catch (IOException e) {
e.printStackTrace();
}
}).start();
}
}
private static void upLuadFile(Socket clientSocket) throws IOException {
InputStream is = clientSocket.getInputStream();
//增加一个毫秒值和随机数,确保不会有同名存在
String x =System.currentTimeMillis()+new Random().nextInt(9999)+ \".jpg\";
FileOutputStream fos = new FileOutputStream(\"day11-code\\\\mdir\\\\\"+x);
//读写数据
byte[] bytes = new byte[1024];
int len;
while ((len = is.read(bytes)) != -1) {
fos.write(bytes, 0, len);
}
//---[2]返回数据给客户端--------
OutputStream os = clientSocket.getOutputStream();
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os));
bw.write(\"图片上传成功\");
bw.newLine();//换行
bw.flush();//刷新
//---[3]释放资源(本地流需要释放,客户端需要释放)------
fos.close();
clientSocket.close();
}
继续阅读与本文标签相同的文章
上一篇 :
隐马尔科夫模型 python 实现简单拼音输入法
下一篇 :
HDFS shell 命令
-
elasticsearc使用指南之ES管道聚合(Pipeline Aggregation)
2026-05-19栏目: 教程
-
别再吐槽地铁拥堵,线网规划现在由你大展身手
2026-05-19栏目: 教程
-
Elasticsearch Index Setting一览表
2026-05-19栏目: 教程
-
Java后端面经总结:拿下蚂蚁金服美团头条 offer 秘诀
2026-05-19栏目: 教程
-
Elasticsearch Index Aliases详解
2026-05-19栏目: 教程
