java网络编程服务端,客户端讲解

对于ServerSocket类(服务端):

  1. 当ServerSocket的类的对象创建后,调用accept()方法接收客户端发来的连接请求。

  2. accept()方法采用的是“阻塞”方式监听,直到客户端连接之后程序才可以向下继续执行并返回一个与客户端Socket对象相连的Socket对象。

  3. 服务器端的Socket对象使用getOutputStream()方法获得的输出流,将指向客户端Socket对象使用getInputStream()方法获得的那个输入流。

  4. 同样地,服务器端的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类(客户端):

  1. 在Java中,有专门的Socket类来处理用户的请求和响应。利用Socket 类的方法,就可以实现两台计算机之间的通信。

  2. 客户端创建Socket 对象之后,会向指定的IP地址即端口尝试连接。

  3. 服务端的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();
    		}
    	}
    }
    


     

猜你喜欢

转载自blog.csdn.net/qq_40629792/article/details/85221296