Java网络Socket编程详解

来源:互联网 发布:c语言 va list 编辑:程序博客网 时间:2024/05/10 11:46

1、Socket 通信简介及模型

  Java Socket 可实现客户端--服务器间的双向实时通信。java.net包中定义的两个类socket和ServerSocket,分别用来实现双向连接的client和server端。

2、使用套接字实现基于TCP协议的服务器和客户机程序  

       依据TCP协议,在C/S架构的通讯过程中,客户端和服务器的Socket动作如下:
    (1)客户端:
          1.用服务器的IP地址和端口号实例化Socket对象。
          2.调用connect方法,连接到服务器上。
          3.将发送到服务器的IO流填充到IO对象里,比如BufferedReader/PrintWriter。
          4.利用Socket提供的getInputStream和getOutputStream方法,通过IO流对象,向服务器发送数据流。
          5.通讯完成后,关闭打开的IO对象和Socket。
    (2)服务器:
          1. 在服务器,用一个端口来实例化一个 ServerSocket对象。此时,服务器就可以这个端口时刻监听从客户端发来的连接请求。
          2.调用ServerSocket的accept方法,开始监听连接从端口上发来的连接请求。   
          3.利用accept方法返回的客户端的Socket对象,进行读写IO的操作
          4.通讯完成后,关闭打开的流和Socket对象。

3、Socket 通信实现方法

     3.1  服务器端(非多线程)    
          1.用指定的端口实例化一个SeverSocket对象。服务器就可以用这个端口监听从客户端发来的连接请求。
          2.调用ServerSocket的accept()方法,以在等待连接期间造成阻塞,监听连接从端口上发来的连接请求。
          3.利用accept方法返回的客户端的Socket对象,进行读写IO的操作
          4.关闭打开的流和Socket对象

/** * 基于TCP协议的Socket通信,实现用户登录,服务端*///1、创建一个服务器端Socket,即ServerSocket,指定绑定的端口,并监听此端口ServerSocket serverSocket =newServerSocket(10086);//1024-65535的某个端口//2、调用accept()方法开始监听,等待客户端的连接Socket socket = serverSocket.accept();//3、获取输入流,并读取客户端信息InputStream is = socket.getInputStream();InputStreamReader isr =newInputStreamReader(is);BufferedReader br =newBufferedReader(isr);String info =null;while((info=br.readLine())!=null){System.out.println("Hello,我是服务器,客户端说:"+info);}socket.shutdownInput();//关闭输入流//4、获取输出流,响应客户端的请求OutputStream os = socket.getOutputStream();PrintWriter pw = new PrintWriter(os);pw.write("Hello World!");pw.flush(); //5、关闭资源pw.close();os.close();br.close();isr.close();is.close();socket.close();serverSocket.close();

     3.2  客户端
          1.用服务器的IP地址和端口号实例化Socket对象。
          2.调用connect方法,连接到服务器上。
          3.获得Socket上的流,把流封装进BufferedReader/PrintWriter的实例,以进行读写
          4.利用Socket提供的getInputStream和getOutputStream方法,通过IO流对象,向服务器发送数据流
          5.关闭打开的流和Socket。

//1、创建客户端Socket,指定服务器地址和端口Socket socket =newSocket("127.0.0.1",10086);//2、获取输出流,向服务器端发送信息OutputStream os = socket.getOutputStream();//字节输出流PrintWriter pw =newPrintWriter(os);//将输出流包装成打印流pw.write("用户名:admin;密码:admin");pw.flush();socket.shutdownOutput();//3、获取输入流,并读取服务器端的响应信息InputStream is = socket.getInputStream();BufferedReader br = new BufferedReader(new InputStreamReader(is));String info = null;while((info=br.readLine())!null){ System.out.println("Hello,我是客户端,服务器说:"+info);}  //4、关闭资源br.close();is.close();pw.close();os.close();socket.close();

     3.3  服务器端 (多线程)
         1.服务器端创建ServerSocket,循环调用accept()等待客户端连接
         2.客户端创建一个socket并请求和服务器端连接
         3.服务器端接受客户端请求,创建socket与该客户建立专线连接
         4.建立连接的两个socket在一个单独的线程上对话
         5.服务器端继续等待新的连接

//服务器线程处理 和本线程相关的socketSocket socket =null;public serverThread(Socket socket){this.socket = socket;}ServerSocket serverSocket =newServerSocket(10086);Socket socket =null;int count =0;//记录客户端的数量while(true){socket = serverScoket.accept();ServerThread serverThread =newServerThread(socket); serverThread.start(); count++;System.out.println("客户端连接的数量:"+count);}

参考资料:http://www.blogjava.net/Reg/archive/2010/07/17/326392.html


原创粉丝点击