JAVA 一个简单的服务器和客户机程序

这个例子将以最简单的方式运用套接字对服务器和客户机进行操作。服务器的全部工作就是等候建立一个来连接,然后用那个连接产生的Socket创建一个InputSteam以及一个OutputStream。在此之后,它从InputSteam读入的所有东西都会反馈给OutputStream,直接到接收到行中止为,最后关闭连接。

客户机连接服务器,然后创建一个OutputStream。文本通过OutputStream发送。客户机也会创建一个InputStream,用它收听服务器说些什么。

服务器和客户机都使用同样的端口号,而且客户机利用本机地址连接位于同一台机器中的服务器(程序),所以不必在一个物理性的网络里面完成测试(在某些配置环境中,可能要同真正的网络建立连接,否则程序不能工作——尽管实际并不通过那个网络通信)。

下面是服务器程序:

package c15;
import java.io.*;
import java.net.*;

public class JabberServer {
    public static final int PORT=8080;

    public static void main(String[] args) throws IOException{
        ServerSocket s=new ServerSocket(PORT);
        System.out.println("Started: "+s);
        try{
            Socket socket=s.accept();
            try{
                System.out.println("Connection accept: "+socket);
                BufferedReader in= new BufferedReader(new InputStreamReader(socket.getInputStream()));
                PrintWriter out=new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())),true);
                while (true){
                    String str=in.readLine();
                    if (str.equals("END")) break;
                    System.out.println("Echoing: "+str);
                    out.println(str);
                }
            }finally {
                System.out.println("closing");
                socket.close();
            }
        }finally {
            s.close();
        }
    }
}

可以看到,ServerSocket需要的只是一个端口编号,不需要IP地址(因为他就在这台机器上运行)。调用accept的时候,方法会暂时陷入停顿的状态,知道某个客户尝试同它建立连接。accept的作用是:多个客户端同时和服务器进行交互,服务器必须明确和哪一个客户端进行交互,在服务器端就有一个方法叫做accept客户端获取到请求客户端对象。
建立好一个连接以后,accept()就会返回一个Socket对象,他就是那个连接的代表。

多个客户端同时和服务器进行交互,就需要多个IO流对象,但是服务器是没有IO流的,服务器是可以获取到请求的客户端对象Socket使用每个客户端中提供的IO流和客户端进行交互。

①服务器使用客户端的字节输入流读取客户端发送的数据。

②服务器使用客户端的字节输出流给客户端进行回写数据。

这样就巧妙地对多个设备进行通讯。

我们在代码中是使用try-finally代码块,这样就可以保证无论在什么情况下都可以使ServerSocket正确的关闭。

下面是客户端的程序:

package c15;
import java.io.*;
import java.net.*;

public class JabberClient {
    public static void main(String[] args) throws Exception{
        InetAddress addr=InetAddress.getByName(null);
        System.out.println("addr= "+addr);
        Socket socket=new Socket(addr,JabberServer.PORT);
        try{
            System.out.println("socket= "+socket);
            BufferedReader in=new BufferedReader(new InputStreamReader(socket.getInputStream()));
            PrintWriter out=new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())),true);
            for (int i=0;i<10;i++){
                out.println("howdy "+i);
                String str=in.readLine();
                System.out.println(str);
            }
            out.println("END");
        }finally {
            System.out.println("closing...");
            socket.close();
        }
    }
}

在名为socket的套接字创建时,同时使用了InetAdress以及端口号。创建好socket对象后,将其转换为BufferedReader和PrintWriter的过程便与在服务器中相同(同样的两种情况下都要从一个Socket开始)。在这里,客户端通过发送字串"howdy",并在后面跟随一个数字,从而初始化通讯。注意缓冲区必须再次刷新(这是自动发生的,通过传递给PrintWriter构建器的第二个参数)。若缓冲区没有刷新,那么整个会话(通信)都会被挂起,因为用于初始化的“howdy"永远不会发送出去(缓存区不够满,不足以造成发送动作的自动进行)。从服务器返回的每一行都会写入System.out,以验证一切都是正常运转的。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值