简易的案例
客户端:
package demo; 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", 7000); OutputStream out = socket.getOutputStream(); out.write("hello".getBytes()); InputStream in = socket.getInputStream(); byte[] data = new byte[1024]; int len = in.read(data); System.out.println(new String(data, 0, len)); socket.close(); } }
服务器端:
package demo; 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 server = new ServerSocket(7000); Socket socket = server.accept(); InputStream in = socket.getInputStream(); byte[] data = new byte[1024]; int len = in.read(data); System.out.println(new String(data, 0, len)); OutputStream out = socket.getOutputStream(); out.write("收到".getBytes()); socket.close(); server.close(); } }
先启动服务器端,再启动客户端,服务器端打印:hello,然后客户端打印:收到
注意区分这里的流对象
接下来在这个案例基础上做一个图片上传案例
图片上传的本质就是文件复制
客户端:
package demo1; import java.io.FileInputStream; 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", 7000); OutputStream out = socket.getOutputStream(); FileInputStream fis = new FileInputStream("d:\\666.jpeg"); int len = 0; byte[] bytes = new byte[1024]; while ((len = fis.read(bytes)) != -1) { out.write(bytes, 0, len); } socket.shutdownOutput(); // 服务器端读不到-1,不会终止,调用这个方法可以终止 InputStream in = socket.getInputStream(); len = in.read(bytes); System.out.println(new String(bytes, 0, len)); fis.close(); socket.close(); } }
服务器端:
package demo1; 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 TCPServer { public static void main(String[] args) throws IOException { ServerSocket server = new ServerSocket(7000); Socket socket = server.accept(); InputStream in = socket.getInputStream(); File upload = new File("d:\\upload"); if (!upload.exists()) { upload.mkdirs(); } String filename = System.currentTimeMillis() + new Random().nextInt(999999) + ".jpeg"; FileOutputStream fos = new FileOutputStream(upload + File.separator + filename); // 这里是处理图片重名的问题 byte[] bytes = new byte[1024]; int len = 0; while ((len = in.read(bytes)) != -1) { fos.write(bytes, 0, len); } socket.getOutputStream().write("上传成功".getBytes()); fos.close(); socket.close(); server.close(); } }
如果多个客户端一起上传,就需要多线程的技术,每个客户端占一个线程
客户端不需要修改
服务器端:
package demo1; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; public class TCPServer { public static void main(String[] args) throws IOException { ServerSocket server = new ServerSocket(7000); while (true) { Socket socket = server.accept(); new Thread(new Upload(socket)).start(); } } }
package demo1; 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 Upload implements Runnable { private Socket socket; public Upload(Socket socket) { this.socket = socket; } public void run() { try { InputStream in = socket.getInputStream(); File upload = new File("d:\\upload"); if (!upload.exists()) { upload.mkdirs(); } String filename = System.currentTimeMillis() + new Random().nextInt(999999) + ".jpeg"; FileOutputStream fos = new FileOutputStream(upload + File.separator + filename); // 这里是处理图片重名的问题 byte[] bytes = new byte[1024]; int len = 0; while ((len = in.read(bytes)) != -1) { fos.write(bytes, 0, len); } socket.getOutputStream().write("上传成功".getBytes()); fos.close(); socket.close(); } catch (IOException ex) { System.out.println(ex); } } }