网络编程(四)TCP的应用(聊天和文件上传)
网络编程(四)TCP的应用(聊天和文件上传)
TCP实现聊天
TCP文件聊天实现
-
先启动服务端,再启动客户端
-
Socket类:
该类实现客户端套接字(也称为“套接字”)。 套接字是两台机器之间通讯的端点
-
实现步骤:
- 客户端:
- 连接服务器
- 发送消息
- 服务器
- 建立服务端口ServerSocket
- 等待用户的链接accept
- 接受用户的消息
- 客户端:
实现代码
客户端
//客户端
public class TcpClientDemo01 {
public static void main(String[] args) {
Socket socket=null;
OutputStream os=null;
try {
//1.要知道服务器的地址
InetAddress inetAddress=InetAddress.getByName("127.0.0.1");
//2.端口号
int port=9999;
//3.创建一个socket连接
socket=new Socket(inetAddress,port);
//4.发送消息I/O流
os=socket.getOutputStream();
//写入
os.write("史小鹏".getBytes());
} catch (Exception e) {
e.printStackTrace();
}finally {
if(os!=null){
try {
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(socket!=null){
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
服务端
//服务端
public class TcpServerDemo01 {
public static void main(String[] args) {
ServerSocket serverSocket=null;
Socket socket=null;
InputStream is=null;
ByteArrayOutputStream baos=null;
try {
//1.我要有一个地址
serverSocket=new ServerSocket(9999);
//无限循环,每次启动客户端都会让服务器接收一次
while (true) {
//2.等待客户端连接过来
socket = serverSocket.accept();//返回客户端连接,此时服务端socket就是客户端socket
//3.读取客户端的消息
is = socket.getInputStream();
//管道流(管道流连着输入输出流)
baos = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len;
while ((len = is.read(buffer)) != -1) {
//每次将获取的文件写入管道流
baos.write(buffer, 0, len);
}
//将管道流的数据进行输出
System.out.println(baos.toString());
}
} catch (IOException e) {
e.printStackTrace();
}finally {
//关闭资源(从后往前关)
if(baos!=null){
try {
baos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(is!=null){
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(socket!=null){
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(serverSocket!=null){
try {
serverSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
TCP实现文件上传
TCP文件上传实现
-
先启动服务端,再启动客户端
-
Socket类:
该类实现客户端套接字(也称为“套接字”)。 套接字是两台机器之间通讯的端点
-
实现了将原文件上传到其它位置
实现代码
客户端
//客户端
public class TcpClientDemo02 {
public static void main(String[] args) throws Exception{
//1.创建一个socket链接
Socket socket = new Socket(InetAddress.getByName("127.0.0.1"), 9000);
//2.创建一个输出流
OutputStream os = socket.getOutputStream();
//3.读取文件(文件流)
FileInputStream fis = new FileInputStream(new File("sxw.jpg"));
//4.写出文件
byte[] buffer=new byte[1024];
int len;
while ((len=fis.read(buffer))!=-1){
os.write(buffer,0,len);
}
//通知服务器我传送完了
socket.shutdownOutput();//禁用此套接字的输出流。
//确定服务器接收完毕,才能够断开连接
InputStream is = socket.getInputStream();
//String byte[]
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buffer2=new byte[1024];
int len2;
while ((len2=is.read(buffer2))!=-1){
baos.write(buffer2,0,len2);
}
System.out.println(baos.toString());
baos.close();
is.close();
fis.close();
os.close();
socket.close();
}
}
服务端
//服务端
public class TcpServerDemo02 {
public static void main(String[] args) throws Exception{
//1.创建服务
ServerSocket serverSocket = new ServerSocket(9000);
//2.监听客户端的连接
Socket socket = serverSocket.accept();//阻塞式监听,会一直等待客户端连接
//3.获取输入流
InputStream is = socket.getInputStream();
//4.文件输出
FileOutputStream fos = new FileOutputStream(new File("receive.jpg"));
byte[] buffer = new byte[1024];
int len;
while ((len=is.read(buffer))!=-1){
fos.write(buffer,0,len);
}
//通知客户端我接收完了
OutputStream os = socket.getOutputStream();
os.write("我接收完了,你可以断开了".getBytes());
//关闭资源
fos.close();
is.close();
socket.close();
serverSocket.close();
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构