Socket实现简单的客户端服务端通信
用Socket实现简单客户端和服务端通信。
正文:
服务端的编写:
1 public class ServerDemo { 2 3 public static void main(String[] args) { 4 5 try { 6 //创建ServerSocket,并指定端口 7 ServerSocket serverSocket=new ServerSocket(8888); 8 System.out.println("服务器即将启动,并等待连接"); 9 //调用accept()方法,监听并接受到服务端的连接。当连接时,返回获得的Socket实例 10 Socket socket=serverSocket.accept(); 11 12 13 14 //通过获得的Socket得到字节输入流InputStream,用来读取客户端发送的信息 15 InputStream inputStream=socket.getInputStream(); 16 //将字节流转换为字符流 17 InputStreamReader inputStreamReader=new InputStreamReader(inputStream); 18 //添加缓存 19 BufferedReader bufferedReader=new BufferedReader(inputStreamReader); 20 String info=null; 21 //读取信息 22 while((info=bufferedReader.readLine())!=null){ 23 System.out.println(info); 24 } 25 //调用shutdownInput关闭输入流 26 socket.shutdownInput(); 27 28 System.out.println("服务端已接收到请求,开始响应信息"); 29 30 //获取输出流 31 OutputStream outputStream=socket.getOutputStream(); 32 //转换为打印流 33 PrintWriter printWriter=new PrintWriter(outputStream); 34 printWriter.write("客户端你好,欢迎使用"); 35 printWriter.flush(); 36 //关闭输出流 37 socket.shutdownOutput(); 38 39 //关闭资源 40 printWriter.close(); 41 bufferedReader.close(); 42 inputStreamReader.close(); 43 44 //关闭输入输出流 45 outputStream.close(); 46 inputStream.close(); 47 48 //关闭Socket 49 socket.close(); 50 /*//关闭ServerSocket 51 serverSocket.close();*/ 52 53 } catch (IOException e) { 54 // TODO Auto-generated catch block 55 e.printStackTrace(); 56 } 57 58 } 59 60 }
客户端的编写:
1 public class ClientDemo { 2 3 public static void main(String[] args) { 4 5 try{ 6 //创建Socket,并指定服务器地址和端口号 7 Socket socket=new Socket("127.0.0.1",8888); 8 9 //通过Socket获取输出流 10 OutputStream outputStream=socket.getOutputStream(); 11 //将输出流转换为为打印流 12 PrintWriter printWriter=new PrintWriter(outputStream); 13 //向服务端发送信息 14 printWriter.write("你好,服务端"); 15 printWriter.write("如果接受到请求,请回应"); 16 printWriter.flush(); 17 18 //关闭输出流 19 socket.shutdownOutput(); 20 21 System.out.println("已获取服务器响应,回复如下:"); 22 23 //获取输入流 24 InputStream inputStream=socket.getInputStream(); 25 //转换为字符流 26 InputStreamReader inputStreamReader=new InputStreamReader(inputStream); 27 //添加缓存 28 BufferedReader bufferedReader=new BufferedReader(inputStreamReader); 29 String info=null; 30 while((info=bufferedReader.readLine())!=null){ 31 System.out.println(info); 32 } 33 //关闭输入流 34 socket.shutdownInput(); 35 36 //关闭资源 37 bufferedReader.close(); 38 inputStreamReader.close(); 39 printWriter.close(); 40 41 //关闭输入输出流 42 inputStream.close(); 43 outputStream.close(); 44 45 //关闭Socket 46 socket.close(); 47 }catch(Exception e){ 48 e.printStackTrace(); 49 } 50 } 51 52 }
至此,服务端和客户端的通信已简单实现。
注意点:
- 在进行连接时,不可以提前关闭输入输出流,包括字节流转换的各种流,一定要在连接结束时统一关闭。如果在连接的中途关闭了流,会造成Socket的关闭,连接中断。
- shutdownInput()和shutdownOutput()是一种单向关闭流,即关闭客户端并不会影响服务端。
- 在调用shutdownInput()和shutdownOutput()时,虽然其关闭了对应的输入或输出流,并且不会关闭网络连接。但是当在同一个连接中不能再获得对应的输入输出流,