java网络编程:1,基本的网络编程模型

java网络编程的通信模型 - 客户/服务器模型

java网络编程:1,基本的网络编程模型

 

编写一个socket,使得客户端和服务器启动后可以持续通信(*交谈)直到客户端输入“bye”结束

客户机源码:

package network_chap01;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.SocketAddress;

public class EchoClient2 {

    public static void main(String[] args) {
        Socket clientSocket = null;
        BufferedReader in = null;
        BufferedWriter out = null;
        try {
            //1.创建客户机套接字
            clientSocket = new Socket();
            SocketAddress remoteAddr=new InetSocketAddress("localhost",5000); 
            System.out.println("1.创建客户机套接字成功!");
            //2.连接服务器
            clientSocket.connect(remoteAddr);
            System.out.println("2.客户机连接服务器localhost端口5000成功!");
            System.out.println("客户机使用的地址和端口:"+clientSocket.getLocalSocketAddress());
            //与服务器会话  
            
            in = new BufferedReader(
                    new InputStreamReader(
                    clientSocket.getInputStream()));           
               out = new BufferedWriter(
                     new OutputStreamWriter(            
                     clientSocket.getOutputStream()));
            String recvStr;
            while(true)
            {
            	   System.out.print("请输入发送的信息: ");
                   BufferedReader localReader=new BufferedReader
                		   (new InputStreamReader(System.in));
                   String sendStr=localReader.readLine();
                   System.out.println("3.1向服务器发送字符串成功!"+sendStr);
                   
                   out.write(sendStr);  //向服务器发送字符串
                   out.newLine();
                   out.flush();
                   
                   recvStr=in.readLine();  //从服务器接收字符串 
                   System.out.println("3.2从服务器接收回送字符串成功!"+recvStr);
            
                   
            }
        } catch (IOException ex) {
            System.out.println("异常信息:"+ex.getMessage());
        }
        //关闭套接字和流
        try {
            if (in != null) in.close();
            if (out != null)  out.close();
            if (clientSocket != null)   clientSocket.close(); 
            System.out.println("4.关闭套接字和流成功!");
        } catch (IOException ex) {
             System.out.println("异常信息:"+ex.getMessage());
        } 
    }
}

服务器源码:

package network_chap01;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketAddress;

public class EchoServer2 {

    public static void main(String[] args) {
        //1.启动服务器
        ServerSocket listenSocket = null; 
        Socket clientSocket = null; 
        BufferedReader in = null;
        BufferedWriter out = null;
        try {
            listenSocket = new ServerSocket();
            SocketAddress serverAddr=new InetSocketAddress("localhost",5000);
            listenSocket.bind(serverAddr); 
            System.out.println("1.服务器启动成功!开始在localhost的5000端口侦听连接...");
            //2.处理连接                      
            clientSocket = listenSocket.accept();
            System.out.println("2.客户机连接成功!客户机地址和端口:"+clientSocket.getRemoteSocketAddress());
            //3.与客户机会话           
            in = new BufferedReader(
                    new InputStreamReader(
                    clientSocket.getInputStream()));           
               out = new BufferedWriter(
                     new OutputStreamWriter(            
                     clientSocket.getOutputStream()));
           
            while(true)
            {
            	   
                   String recvStr=in.readLine();  //从客户机接收字符串
                   System.out.println("3.1 服务器收到字符串:"+recvStr);
                   if (recvStr.equals("bye"))
                   {
                	   System.out.println("服务机下线!");
                	   break;
                   }
                   else{
                	   out.write(recvStr);  //向客户机回送字符串           
                       out.newLine();
                       out.flush(); 
                   }
                   
                   //System.out.println("3.2 服务器回送字符串成功:"+recvStr);
                  
            }
        } catch (IOException ex) {
            System.out.println("异常信息:"+ex.getMessage());
        }
        //4.关闭套接字和流
        try {  
            if (in != null)in.close();
            if (out != null)  out.close();
            if (listenSocket != null)   listenSocket.close();
            if (clientSocket != null)   clientSocket.close(); 
            System.out.println("4.关闭套接字和流成功!");
        } catch (IOException ex) {
           System.out.println("异常信息"+ex.getMessage());
        }
    }
}

详细解释

一个简单的客户机服务器模型:

客户机:

package network_chap01;


import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.SocketAddress;

public class EchoClient {

    public static void main(String[] args) {
        Socket clientSocket = null;
        BufferedReader in = null;
        BufferedWriter out = null;
        try {
            //客户端实例化一个 Socket 对象,指定服务器名称和端口号来请求连接
            clientSocket = new Socket();
            SocketAddress remoteAddr=new InetSocketAddress("localhost",5000); 
            System.out.println("1.创建客户机套接字成功!");
            
            //Socket 类的构造函数试图将客户端连接到指定的服务器和端口号。
            //如果通信被建立,则在客户端创建一个 Socket 对象能够与服务器进行通信
            clientSocket.connect(remoteAddr);
            System.out.println("2.客户机连接服务器localhost端口5000成功!");
            System.out.println("客户机使用的地址和端口:"+clientSocket.getLocalSocketAddress());
            
            //与服务器会话 ,建立一个输入流和输出流用于输出和输入服务端传来的字节流         
            in = new BufferedReader(
                 new InputStreamReader(
                 clientSocket.getInputStream()));           
            out = new BufferedWriter(
                  new OutputStreamWriter(            
                  clientSocket.getOutputStream()));
            
            System.out.println("请输入发给客户机的字符串:");
            //用于读取键盘传输的文字
            BufferedReader localReader=new BufferedReader
            		(new InputStreamReader(System.in));
            String sendStr=localReader.readLine();
            //String sendStr="有朋自远方来";
          //向服务器发送字符串(向服务端写入)
            out.write(sendStr);  
            //按换行读取,从当前位置一直读取数据,直到遇到换行符,然后去掉换行符,返回读取到的数据
            out.newLine();
            //把缓冲区的内容强制的写出
            out.flush();
            System.out.println("向服务器发送字符串成功!发送内容为:"+sendStr);
            
            String recvStr=in.readLine();  //从服务器接收字符串
            System.out.println("从服务器接收回送字符串成功!"+recvStr);
            
        } catch (IOException ex) {
            System.out.println("异常信息:"+ex.getMessage());
        }
        //关闭套接字和流
        try {
            if (in != null) in.close();
            if (out != null)  out.close();
            if (clientSocket != null)   clientSocket.close(); 
            System.out.println("关闭套接字和流成功!");
        } catch (IOException ex) {
             System.out.println("异常信息:"+ex.getMessage());
        } 
    }
}

服务器:

package network_chap01;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketAddress;

public class EchoServer {

    public static void main(String[] args) {
        //1.启动服务器
        ServerSocket listenSocket = null; 
        Socket clientSocket = null; 
        BufferedReader in = null;
        BufferedWriter out = null;
        try {
        	//实例化一个 ServerSocket 对象
            listenSocket = new ServerSocket();
            SocketAddress serverAddr=new InetSocketAddress("localhost",5000);
            //通过绑定端口进行通信
            listenSocket.bind(serverAddr); 
            System.out.println("EchoServer:服务器启动成功!开始在localhost的5000端口侦听连接...");
            
            //服务器调用 ServerSocket 类的 accept() 方法,该方法将一直等待,直到客户端连接到服务器上给定的端口                 
            clientSocket = listenSocket.accept();
            System.out.println("EchoServer:客户机连接成功!客户机地址和端口:"+clientSocket.getRemoteSocketAddress());
            
            //与客户机会话           
            in = new BufferedReader(
                 new InputStreamReader(
                 clientSocket.getInputStream()));           
            out = new BufferedWriter(
                  new OutputStreamWriter(            
                  clientSocket.getOutputStream()));
            
            String recvStr=in.readLine();  //从客户机接收字符串
            System.out.println("EchoServer: 服务器收到字符串:"+recvStr);
            out.write(recvStr);  //向客户机回送字符串           
            out.newLine();
            out.flush(); 
            System.out.println("EchoServer:echo:"+recvStr);
        } catch (IOException ex) {
            System.out.println("异常信息:"+ex.getMessage());
        }
        //4.关闭套接字和流
        try {  
            if (in != null)in.close();
            if (out != null)  out.close();
            if (listenSocket != null)   listenSocket.close();
            if (clientSocket != null)   clientSocket.close(); 
            System.out.println("EchoServer:关闭套接字和流成功!");
        } catch (IOException ex) {
           System.out.println("异常信息"+ex.getMessage());
        }
    }
}