1.概述
TCP(Transmission Control Protocol)是一种面向连接的、可靠的、字节流的传输层通信协议
在Java中,我们可以使用java.net包中的Socket和ServerSocket类来实现TCP通信
线程则是Java中实现并发编程的重要工具
2.TCP
2.1 服务器端需要创建一个ServerSocket来监听客户端的连接请求。当有客户端连接时,服务器会创建一个新的Socket对象与客户端进行通信
2.2 客户端需要创建一个Socket对象来连接服务器。连接建立后,客户端和服务器就可以通过这个Socket对象进行数据的发送和接收
2.3 在TCP通信中,如果需要同时处理多个客户端的连接,就需要使用到线程。Java中可以通过实现Runnable接口或继承Thread类来创建线程。每个线程可以处理一个客户端的连接
2.4 在服务器端,可以为一个新的连接请求创建一个新的线程。这样,即使有多个客户端同时连接,服务器也可以同时处理它们,提高了系统的并发性能
2.5 在Java中,可以使用java.io包中的输入输出流来读取和写入图片数据。例如,可以使用FileInputStream和FileOutputStream来读取和写入图片文件
2.6 在发送方,需要将图片数据读入字节流,并通过Socket的输出流发送给接收方。在接收方,需要通过Socket的输入流读取字节流,然后将其还原成图片数据
服务器端:
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
public static void main(String[] args) throws IOException {
ServerSocket ss = new ServerSocket(8888);
System.out.println("----------服务器开启成功----------");
while (true) {
Socket socket = ss.accept();
new Thread(new MyRunnable(socket)).start();
}
}
}
线程类:
import java.io.*;
import java.net.Socket;
import java.util.UUID;
public class MyRunnable implements Runnable{
Socket socket;
public MyRunnable(Socket socket){
this.socket = socket;
}
@Override
public void run() {
try {
//标准的UUID格式为:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx (8-4-4-4-12)。
String name = UUID.randomUUID().toString().replace("-", "");
BufferedInputStream bis = new BufferedInputStream(socket.getInputStream());
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("D:\\Desktop\\copy\\"+name+".png"));
int len =0;
byte bytes [] = new byte[1024];
while ((len =bis.read(bytes))!=-1){
bos.write(bytes,0,len);
}
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
bw.write("上传成功!!!");
bw.newLine();
bw.flush();
} catch (IOException e) {
e.printStackTrace();
}finally {
if(socket!=null){
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
客户端:
import java.io.*;
import java.net.Socket;
import java.util.Scanner;
public class Client {
public static void main(String[] args) throws IOException {
Scanner sc = new Scanner(System.in);
Socket socket = new Socket("localhost", 8888);
System.out.println("----------客户端开启成功----------");
System.out.println("请输入您想传递的图片的路径:");
String line = sc.nextLine();
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(line));
BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream());
int len=0;
byte bytes[] = new byte[1024];
while ((len = bis.read(bytes)) != -1) {
bos.write(bytes, 0, len);
}
socket.shutdownOutput();
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String s = br.readLine();
System.out.println(s);
socket.close();
}
}