在服务器端
1 public class ServesDemo { 2 public static void main(String[] args) throws IOException { 3 System.out.println("等待。。"); 4 // 服务器端的ServerSocket 参数是 :port 5 ServerSocket serverSocket = new ServerSocket(6666); 6 // 服务器端等待 客户端的请求 7 Socket socket = serverSocket.accept(); 8 /*1. 将客户端发来的请求当作是一个输入流, 9 * 2. 读取发送给服务器的输入流(之前的方法) 10 * */ 11 InputStream inputStream = socket.getInputStream(); 12 byte[] bytes = new byte[1024]; 13 int readInt = inputStream.read(bytes); 14 String s = new String(bytes,0,readInt); 15 System.out.println("接收到客户端信息"); 16 System.out.println(s); 17 // 把接收完信息的的消息用socket的方式发送(输出)给客户端 18 OutputStream o = socket.getOutputStream(); 19 // 这个地方是需要输出的内容 20 o.write("收到".getBytes()); 21 inputStream.close(); 22 o.close(); 23 } 24 }
客户端:
1 public class ClientDemo { 2 public static void main(String[] args) throws IOException { 3 4 // 创建客户端的端口对象 需要通信的ip + 和服务器所在的端口, 5 Socket s = new Socket("127.0.0.1",6666); 6 // 用socket 的方式向服务器发送数据(out) 7 OutputStream outputStream = s.getOutputStream(); 8 // 用字节流的形式发送hello 9 outputStream.write("hello".getBytes()); 10 /* 0. 下面的整个流程都是为了读取服务器传来的反馈 11 * 1. 首先用getInputStream() 创建接收的输入流 12 * 2. 用之前的方法来读取输入流 13 * 3. read 的方式来读取,最后把读取到的数据转化称String的方式输出 14 * 注意:在这里你不必在意是用什么来接受的,read的方法会接受到服务端的write的消息字节 15 * */ 16 InputStream inputStream = s.getInputStream(); 17 byte[] bytes= new byte[1024]; 18 int lenth; 19 lenth = inputStream.read(bytes); 20 String strins = new String(bytes,0,lenth); 21 System.out.println("收到回信,内容"); 22 System.out.println(strins); 23 outputStream.close(); 24 } 25 }
-------
进阶版就包含了客户端向服务端的文件传递:
服务端:
1 // 服务器,接受图片,保存在磁盘中 2 public static void main(String[] args) throws IOException { 3 4 // 改进:有了while 可以始终等待客户端的上传 5 while (true){ 6 ServerSocket serverSocket = new ServerSocket(6666); 7 System.out.println("load.."); 8 Socket socket = serverSocket.accept(); 9 // 为了提高效率,可以让服务器开启多个线程,1. 是一直在等待客户端上传, 10 // 2. 在新的线程中可以把上传的数据存储在服务器的磁盘中 11 new Thread(new Runnable() { 12 InputStream clientInputStream =null ; 13 FileOutputStream fileOutputStream =null; 14 OutputStream outputStreamToClient=null; 15 @Override 16 // 用多线程 17 public void run() { 18 try{ 19 // 接受客户端传来的信息流,写到服务器的磁盘中去 20 clientInputStream = socket.getInputStream(); 21 String picName = System.currentTimeMillis()+".png"; 22 fileOutputStream = new FileOutputStream("d:\"+picName); 23 // 依次读取信息流 24 byte[] bytes = new byte[1024]; 25 int len; 26 while((len= clientInputStream.read(bytes))!=-1){ 27 fileOutputStream.write(bytes,0,len); 28 if (len<1024){ 29 break; 30 } 31 } 32 33 // 读取完成后,返回给客户端信息 34 outputStreamToClient = socket.getOutputStream(); 35 outputStreamToClient.write(("ok").getBytes()); 36 outputStreamToClient.close(); 37 clientInputStream.close(); 38 39 fileOutputStream.close(); 40 41 } 42 catch (IOException e){ 43 e.getStackTrace(); 44 } 45 } 46 }).start(); 47 serverSocket.close(); 48 } 49 50 51 } 52 }
客户端:
1 public class ClientDemoLoad { 2 public static void main(String[] args) throws InterruptedException { 3 while (true){ 4 System.out.println("upload。。"); 5 new Thread(new Runnable() { 6 Socket socket =null; 7 InputStream inputStream =null; 8 OutputStream outputStream =null; 9 FileInputStream inputStreamClient =null; 10 @Override 11 public void run() { 12 try { 13 socket = new Socket("127.0.0.1",6666); 14 // 从客户端的磁盘中获取需要上传的png 15 FileInputStream inputStreamClient = new FileInputStream("D:\loadClient.png"); 16 outputStream = socket.getOutputStream(); 17 byte[] bytes = new byte[1024]; 18 int len; 19 while ((len =inputStreamClient.read(bytes))!=-1 ){ 20 outputStream.write(bytes,0,len); 21 } 22 // 读取服务器端传来的接受完毕的信息 23 // 创建客户的接口, 24 inputStream = socket.getInputStream(); 25 byte[] bytes1 = new byte[1024]; 26 int lengh; 27 // 为了避免发生阻塞 28 while((lengh = inputStream.read(bytes1))!=-1){ 29 String string = new String(bytes1,0,lengh); 30 System.out.println(string); 31 // 为了避免read可能造成的阻塞 32 if (lengh<1024){ 33 break; 34 } 35 } 36 inputStream.close(); 37 outputStream.close(); 38 inputStreamClient.close(); 39 } catch (IOException e) { 40 e.printStackTrace(); 41 } 42 } 43 }).start(); 44 Thread.sleep(1000); 45 } 46 47 48 // 反馈--这个是客户端输出的,但是没有接受方,所以肯定不会写出来的 49 // OutputStream outputStreamToServes = socket.getOutputStream(); 50 // outputStreamToServes.write("loadin Over".getBytes()); 51 52 } 53 }