简介
这是一个基于Gradle的使用TCP/IP协议通信的socket项目。实现服务端读取图片发送给客户端,客户端保存图片到本地。
完整项目代码见 https://github.com/AsajuHuishi/transferImageBySocket
如何使用idea建立Gradle项目
在新建Project时选择Gradle即可,具体可见https://blog.csdn.net/qq_39288090/article/details/97664859
环境
- JDK 1.8
- IntelliJ Idea 2020
目录结构
├─.gradle
│ ├─6.7
│ │ ├─executionHistory
│ │ ├─fileChanges
│ │ ├─fileHashes
│ │ ├─javaCompile
│ │ └─vcsMetadata-1
│ ├─buildOutputCleanup
│ ├─checksums
│ ├─configuration-cache
│ └─vcs-1
├─.idea
│ └─modules
├─build
│ ├─classes
│ │ └─java
│ │ └─main
│ ├─generated
│ │ └─sources
│ │ ├─annotationProcessor
│ │ │ └─java
│ │ │ └─main
│ │ └─headers
│ │ └─java
│ │ └─main
│ └─tmp
│ └─compileJava
├─gradle
│ └─wrapper
└─src
├─main
│ ├─java // our server and client code
│ └─resources
└─test
├─java
└─resources
结果
服务端
客户端
注意事项
先运行服务器端,再运行客户端
服务端代码
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.charset.StandardCharsets;
public class Server {
/**
* 先运行服务器端
* @throws IOException
*/
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(8888);
System.out.println("服务器准备就绪");
// 等待客户端连接
Socket socket = serverSocket.accept();
System.out.println("客户端连接成功");
// 获取输入输出流
OutputStream outputStream = socket.getOutputStream();
InputStream inputStream = socket.getInputStream();
// 通信
// 读数据
byte[] bytes = new byte[30];
int tempLength;
while((tempLength = inputStream.read(bytes))!=-1){
System.out.println(new String(bytes,0,tempLength));
}
// 发送数据
outputStream.write("欢迎登录".getBytes(StandardCharsets.UTF_8));
outputStream.flush();
outputStream.write("图片传输将要开始".getBytes(StandardCharsets.UTF_8));
outputStream.flush();
// 服务器读取图片发送到客户端
File file = new File("src//1.png");
if(file.exists()){
System.out.println("图片存在,可以传输");
// 输入缓冲流
BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream(file));
// 输出缓冲流
BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(outputStream);
int length;
while((length = bufferedInputStream.read(bytes))!=-1){
bufferedOutputStream.write(bytes,0,length);
bufferedOutputStream.flush();
}
}else{
System.out.println("图片不存在");
}
// 关闭
socket.close();
}
}
客户端代码
import org.junit.Test;
import java.io.*;
import java.net.InetAddress;
import java.net.Socket;
import java.nio.charset.StandardCharsets;
public class Client {
public static void main(String[] args) throws IOException {
Socket socket = new Socket("127.0.0.1", 8888);
InetAddress address = socket.getInetAddress();
System.out.println("客户端启动" + address);
// 获取输入输出流
OutputStream outputStream = socket.getOutputStream();
InputStream inputStream = socket.getInputStream();
// 客户端写数据
outputStream.write("hello".getBytes(StandardCharsets.UTF_8));
outputStream.flush();
socket.shutdownOutput();// 不加上这个会一直堵塞
// 读取服务器端发送的数据
byte[] bytes = new byte[30];
int tempLength;
while((tempLength = inputStream.read(bytes))!=-1){
String s = new String(bytes, 0, tempLength);
System.out.println(s);
if(s.equals("图片传输将要开始")){
break;
}
}
// 接受服务器的图片,保存到本地
int length;
File file = new File("src//client.png");
BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(new FileOutputStream(file));
while ((length = inputStream.read(bytes))!=-1){
bufferedOutputStream.write(bytes,0,length);
}
System.out.println("图片接收完成");
socket.close();
}
}