java网络编程之基于TCP的socket编程,实现客户端和服务器相互通信

套接字
首先说网络通信,网络通信使用IP地址标识internet上的计算机,使用端口号标识服务器上的进程(程序)。也就是说,如果服务器上的一个程序不占用一个端口号,用户程序就无法找到它,就无法和该程序交互通信。端口号选取大于1023。
当两个程序需要通信时,它们可以通过使用Socket类建立套接字并连接在一起(端口号与IP地址的组合得出一个网络套接字)

套接字
它允许程序把网络连接看成一个流(stream),可以向这个流写字节,也可以从这个流读取字节。
Socket是网络上运行的两个程序间双向通信的一端,它既可以接受请求,也可以发送请求,利用它可以较为方便的编写程序在网络上传递数据。在JAVA中,有专门的Socket类处理用户的请求和响应。利用Socket的方法,就可以实现两台计算机之间的通信。
Socket是网络驱动层提供给应用程序的接口和一种机制。Socket能执行7种基本操作:
1.连接到远程机器
2.绑定到端口
3.接收从远程机器来的绑定端口上的连接
4.监听到达的数据
5.发送数据
6.接收数据
7.关闭连接
套接字有两种:一种套接字在服务器端创建,叫做服务端套接字(ServerSocket);还有一种在客户端被创建,叫做客户端套接字(Socket)。

客户端套接字 
客户端程序使用socket类建立负责连接到服务器的套接字对象。 
Socket的构造方法是Socket(String host, int port),参数host是服务器的IP地址,port是一个端口号。

try{    Socket clientSocket = new Socket("http://192.168.0.78",2010);
}
catch(IOException e){}

当套接字对象clientSocket建立后,可以使用方法getInputStream()获得一个输入流,这个输入流的源和服务器端的一个输出流刚好对应,因此客户端用输入流可以读取服务器写入到输出流中的数据。

ServerSocket对象与服务器端套接字
为了能使客户端成功的连接到服务器,服务器必须建立一个ServerSocket对象(像生活中邮局窗口的业务员),通过accept函数监听客户端的连接请求,如收到连接请求,则接受客户端的连接,并生成连接套接字用于通信使用。
ServerSocket的构造方法是ServerSocket(int port),port是一个端口号。port必须和客户呼叫的端口号相同。

try{    ServerSocket serverForClient = new ServerSocket(2010);
}
catch(IOException e){}

若实现客户端和服务器相互通信,一定涉及到IO流

缓冲流
BufferedReader类创建的对象称为缓冲输入。
BufferedReader流能够读取文本行,方法是readLine()。

下面用代码讲解

代码实现了客户端和服务器对发数据,并且客户端输入bye,客户端停止;客户端输入ok,服务器停止

//服务器程序
package Demo1;

import java.io.*;
import java.net.*;
import java.applet.Applet;

public class Server {
    public static void main(String args[]) {
        try{
            ServerSocket server=null;
            try{
                server=new ServerSocket(4700);
                //创建一个ServerSocket 在端口4700 监听客户请求
            }catch(Exception e) {
                System.out.println("can not listen to:"+e);
                //出错,打印出错信息
            }
            Socket socket=null;
            try{
                socket=server.accept();
                //使用accept()阻塞等待客户请求,有客户
                //请求到来则产生一个Socket 对象,并继续执行
            }catch(Exception e) {
                System.out.println("Error."+e);
                //出错,打印出错信息
            }
            String line;
            String li;
            BufferedReader is=new BufferedReader(new InputStreamReader(socket.getInputStream()));
            //由Socket 对象得到输入流,并构造相应的BufferedReader 对象
            PrintWriter os=new PrintWriter(socket.getOutputStream());
            //由Socket 对象得到输出流,并构造PrintWriter 对象
            BufferedReader sin=new BufferedReader(new InputStreamReader(System.in));
            //由系统标准输入设备构造BufferedReader 对象
            System.out.println("Client:"+is.readLine());
            //在标准输出上打印从客户端读入的字符串
            line=sin.readLine();
            //从标准输入读入一字符串
            while(!line.equals("bye")){
            //如果该字符串为 "bye",则停止循环
                os.println(line);
                //向客户端输出该字符串
                os.flush();
                //刷新输出流,使Client 马上收到该字符串
                System.out.println("Server:"+line);
                //在系统标准输出上打印读入的字符串
                li = is.readLine();
                if(!li.equals("ok"))
                    System.out.println("Client:"+li);
                else
                    break;
                //从Client 读入一字符串,并打印到标准输出上
                line = sin.readLine();
                //从系统标准输入读入一字符串
            } //继续循环

            os.close(); //关闭Socket 输出流
            is.close(); //关闭Socket 输入流

            socket.close(); //关闭Socket
            server.close(); //关闭ServerSocket
        }catch(Exception e){
            System.out.println("Error:"+e);
            //出错,打印出错信息
        }
    }
}
//客户端程序
package Demo1;
import java.io.*;
import java.net.*;

public class Client {
    public static void main(String args[]) {
        try{
            Socket socket=new Socket("127.0.0.1",4700);
            //向本机的4700 端口发出客户请求
            BufferedReader sin=new BufferedReader(new InputStreamReader(System.in));
            //由系统标准输入设备构造BufferedReader 对象
            PrintWriter os=new PrintWriter(socket.getOutputStream());
            //由Socket 对象得到输出流,并构造PrintWriter 对象
            BufferedReader is=new BufferedReader(new InputStreamReader(socket.getInputStream()));
            //由Socket 对象得到输入流,并构造相应的BufferedReader 对象
            String readline;
            readline=sin.readLine(); //从系统标准输入读入一字符串
            while(!readline.equals("bye")){
            //若从标准输入读入的字符串为 "bye"则停止循环
                os.println(readline);
                //将从系统标准输入读入的字符串输出到Server
                os.flush();
                //刷新输出流,使Server 马上收到该字符串
                System.out.println("Client:"+readline);
                //在系统标准输出上打印读入的字符串
                System.out.println("Server:"+is.readLine());
                //从Server 读入一字符串,并打印到标准输出上
                readline=sin.readLine(); //从系统标准输入读入一字符串
            } //继续循环

            os.close(); //关闭Socket 输出流
            is.close(); //关闭Socket 输入流

            socket.close(); //关闭Socket
        }catch(Exception e) {
            System.out.println("Error"+e); //出错,则打印出错信息
        }
    }
}

猜你喜欢

转载自blog.csdn.net/LJH_laura_li/article/details/82430038