Java學習筆記53(網路編程:TCP協議案例),學習筆記tcp
簡易的案例
用戶端:
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(); }}View Code
伺服器端:
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(); }}View Code
先啟動伺服器端,再啟動用戶端,伺服器端列印: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(); }}View Code
伺服器端:
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(); }}View Code
如果多個用戶端一起上傳,就需要多線程的技術,每個用戶端佔一個線程
用戶端不需要修改
伺服器端:
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(); } }}View Code
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); } }}View Code