对于ServerSocket类(服务端):
-
当ServerSocket的类的对象创建后,调用accept()方法接收客户端发来的连接请求。
-
accept()方法采用的是“阻塞”方式监听,直到客户端连接之后程序才可以向下继续执行并返回一个与客户端Socket对象相连的Socket对象。
-
服务器端的Socket对象使用getOutputStream()方法获得的输出流,将指向客户端Socket对象使用getInputStream()方法获得的那个输入流。
-
同样地,服务器端的Socket对象使用的getInputStream()方法获得的输入流,将指向客户端Socket对象使用getOutputStream()方法获得的那个输出流。
import java.io.DataInputStream; import java.io.DataOutputStream; import java.net.ServerSocket; import java.net.Socket; import java.util.Scanner; public class ServerDemo { public ServerDemo(){ } public static void main(String[] args) { ServerSocket server =null; //声明ServerSocket对象 Socket socket =null; //声明Socket对象 DataInputStream din=null; //声明DataInputStream对象 DataOutputStream dout=null; //声明DataOutputStream对象 try { server =new ServerSocket (8000); //实例化ServerSocket对象 System.out.println("等待客户端连接......"); socket = server.accept(); //实例化Socket对象,阻塞等待连接 System.out.println("客户端连接上......\n客户端来自:"+ socket.getInetAddress().getHostAddress()); //获取客户端IP din = new DataInputStream(socket.getInputStream()); //实例化DataInputStream对象 dout =new DataOutputStream(socket.getOutputStream());//实例化DataOutputStream对象 String strMessage =null; Scanner scan =new Scanner(System.in); boolean flag=true; //标记位 while (flag) //无限制接收客户端连接 { strMessage = din.readUTF(); //读取客户端发送信息 if (!strMessage.equals("bye")) //若信息为bye则退出,否则继续 { System.out.println("客户端消息:\n"+strMessage ); //输出客户端内容 System.out.println("回复客户端:"); strMessage =scan.next(); //输入消息 dout.writeUTF(strMessage); //向客户端发送 dout.flush(); }else{ din.close(); //关闭输入流 dout.close(); //关闭输出流 flag=false; //退出死循环 } } server.close(); //关闭服务器 System.out.println("服务器退出...."); }catch (Exception e){ e.printStackTrace(); } } }
对于Socket类(客户端):
-
在Java中,有专门的Socket类来处理用户的请求和响应。利用Socket 类的方法,就可以实现两台计算机之间的通信。
-
客户端创建Socket 对象之后,会向指定的IP地址即端口尝试连接。
-
服务端的Socket接到连接请求后创建新的Socket与客户端的Socket进行连接。若服务端Socket与客户端Socket连接成功之后,就可以获取Socket中的输入输出流。
import java.io.DataInputStream; import java.io.DataOutputStream; import java.net.Socket; import java.util.Scanner; public class ClientDemo { public ClientDemo(){ } public static void main(String[] args) { Socket socket =null; //声明Socket对象 DataInputStream din=null; //声明DataInputStream对象 DataOutputStream dout=null; //声明DataOutputStream对象 try { System.out.println("尝试连接服务器......"); socket = new Socket("127.0.0.1",8000); //实例化Socket对象 System.out.println("连接服务器成功......"); din = new DataInputStream(socket.getInputStream()); //实例化DataInputStream对象 dout =new DataOutputStream(socket.getOutputStream()); //实例化DataOutputStream对象 String strMessage =null; Scanner scan =new Scanner(System.in); boolean flag=true; //标记位 while (flag) { System.out.println("发送消息:"); strMassage =scan.next(); dout.writeUTF(strMessage); //向服务器发送消息 dout.flush(); strMessage = din.readUTF(); //读取服务器消息 if (!strMessage.equals("bye")) //若信息为bye则退出,否则继续 { System.out.println("接收消息:\n"+strMessage); //输出消息 }else{ din.close(); //关闭输入流 dout.close(); //关闭输出流 flag=false; //退出死循环 } } socket.close(); //关闭服务器 System.out.println("服务器退出...."); }catch (Exception e){ e.printStackTrace(); } } }