
首先是个最基础的客户端/服务端通信
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class TCPServer {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(8888);
Socket accept = serverSocket.accept();
InputStream inputStream = accept.getInputStream();
byte[] b=new byte[1024];
int len=inputStream.read(b);
System.out.println(new String(b,0,len));
OutputStream out=accept.getOutputStream();
out.write("你好客户端".getBytes());
accept.close();
serverSocket.close();
}
}
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
public class TCPClient {
public static void main(String[] args) throws IOException {
Socket socket=new Socket("127.0.0.1",8888);
OutputStream os=socket.getOutputStream();
os.write("你好服务器".getBytes());
InputStream in=socket.getInputStream();
byte[] b=new byte[1024];
int read = in.read(b);
System.out.println(new String(b,0,read));
socket.close();
}
}
先启动服务端
我自己的理解是:这里的InputStream是打开别人的信展示到我的视野里,OutPutStream是写入我的大脑里。如果我想给别人通信,我用OutputStream写信,他用InputStream读。
网络文件通信
import java.io.*;
import java.net.Socket;
public class Client {
public static void main(String[] args) throws IOException {
FileInputStream fileInputStream = new FileInputStream("C:\Users\123\Desktop\个人文件夹\壁纸\柴犬r.jpg");
Socket socket = new Socket("127.0.0.1", 8888);
OutputStream os = socket.getOutputStream();
int len;
byte[] b = new byte[1024];
//读取本地文件
while ((len = fileInputStream.read(b)) != -1) {
os.write(b, 0, len);
}
socket.shutdownOutput(); //截断输出流
//上传文件
InputStream in = socket.getInputStream();
while ((len = in.read(b)) != -1) {
System.out.println(new String(b, 0, len));
}
fileInputStream.close();
socket.close();
}
}
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Random;
public class Server {
public static void main(String[] args) throws IOException {
ServerSocket sc = new ServerSocket(8888);
Socket socket = sc.accept();
InputStream in = socket.getInputStream();
File file = new File("d:\upload");
if (!file.exists()) {
file.mkdirs();
}
//生成文件名
String fileName = "\swpu" + System.currentTimeMillis() + new Random().nextInt(9999) + ".jpg";
FileOutputStream out = new FileOutputStream(file + fileName);
int len;
byte[] b = new byte[1024];
while ((len = in.read(b)) != -1) {
out.write(b, 0, len);
}
socket.getOutputStream().write("上传成功".getBytes());
in.close();
out.close();
socket.close();
}
}
不过这种只能实现一次连接,上传后服务器关闭,如果要保持服务器开启就在外面加个while
为了模拟多个服务器,开启多线程
public static void main(String[] args) throws IOException {
ServerSocket sc = new ServerSocket(8888);
//保持服务器开启
while (true) {
Socket socket = sc.accept();
new Thread(() -> {
try {
InputStream in = socket.getInputStream();
File file = new File("d:\upload");
if (!file.exists()) {
file.mkdirs();
}
String fileName = "\swpu" + System.currentTimeMillis() + new Random().nextInt(9999) + ".jpg";
FileOutputStream out = new FileOutputStream(file + fileName);
int len;
byte[] b = new byte[1024];
while ((len = in.read(b)) != -1) {
out.write(b, 0, len);
}
socket.getOutputStream().write("上传成功".getBytes());
in.close();
out.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}).start();
}
}
接着深入的话就可以开始netty了