您的位置:首页 > 编程语言 > Java开发

java的服务端与客户端通信(1)

2016-03-24 20:43 417 查看

一、理解socket

1.1什么是socket?

socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄。应用程序通常通过"套接字"向网络发出请求或者应答网络请求。

Socket和ServerSocket类库位于java.net包中。ServerSocket用于服务器端,Socket是建立网络连接时使用的。在连接成功时,应用程序两端都会产生一个Socket实例,操作这个实例,完成所需的会话。对于一个网络连接来说,套接字是平等的,并没有差别,不因为在服务器端或在客户端而产生不同级别。不管是Socket还是ServerSocket它们的工作都是通过Socket类及其子类完成的。

1.2重要的socket

java.net.Socket继承于java.lang.Object,有八个构造器,其方法并不多,下面介绍使用最频繁的三个方法:

  1.accept方法

用于产生"阻塞",直到接收到一个连接,并且返回一个客户端的Socket对象实例。"阻塞"是一个术语,它使程序运行暂时"停留"在这个地方,直到一个会话产生,然后程序继续;通常"阻塞"是由循环产生的。

  2.getInputStream方法

连接的另一端将得到输入,同时返回一个OutputStream对象实例。

注意:其中getInputStream和getOutputStream方法均会产生一个IOException,它必须被捕获,因为它们返回的流对象,通常都会被另一个流对象使用。

    3.getOutputStream方法

   连接的另一端将得到输入,同时返回一个OutputStream对象实例。

注意:其中getInputStream和getOutputStream方法均会产生一个IOException,它必须被捕获,因为它们返回的流对象,通常都会被另一个流对象使用。

1.3Socket通信原理

服务器:使用ServerSocket监听指定的端口,端口可以随意指定(由于1024以下的端口通常属于保留端口,在一些操作系统中不可以随意使用,所以建议使用大于1024的端口),等待客户连接请求,客户连接后,会话产生;在完成会话后,关闭连接。

客户端:使用Socket对网络上某一个服务器的某一个端口发出连接请求,一旦连接成功,打开会话;会话完成后,关闭Socket。客户端不需要指定打开的端口,通常临时的动态的分配一个1024以上的端口。

  ServerSocket类
  ServerSocket myListener = new ServerSocket(600);
  提供监听服务的端口是600,不同服务之间通过端口来区别。为了随时监听可能的Client端的请求,执行如下语句:
  Socket linkSockt = myListener.accept();这个方法执行将使得Server端处于等待状态,直到接收一个来自Client端的请求,并返回一个与Client通信的Socket对象。    

  Server端与Client端连接后,就实现了相互读写数据,结束通信执行:
  myListener.close();

  Socket类
  Client需从Server获取服务时,应创建一个Socket对象:
  Socket mySocket = new Socket(host,port);
  连通后,利用Socket类方法getOutputStream()获取(write)输出流,和getInputStream()获取(read)输入流。结束通信同样是
  mySocket.close();
  ServerSocket一般仅用于设置端口号和监听,真正进行通信的是Server端的Socket与Client端的Socket,在ServerSocket进行accept后,就将主动权转让给Server端的Socket。

二、socket编程范例及运行过程!

流程图如下:



 客户端代码:

1 import java.net.Socket;
2 import java.io.InputStream;
3 import java.io.OutputStream;
4 import java.io.PrintWriter;
5 import java.io.BufferedReader;
6 import java.io.InputStreamReader;
7 import java.io.IOException;
8 import java.net.UnknownHostException;
9
10 public class ClientText {
11
12       public static final String ip="127.0.32.42";
13       public static int port=7890;
14       private Socket client_s;
15
16       public ClientText(){
17         try{
18           client_s=new Socket(ip,port);
19         }catch(UnknownHostException e){
20           e.printStackTrace();
21         }catch(IOException c){
22           c.printStackTrace();
23         }
24       }
25
26       public void setConnection() throws IOException{
27         InputStream is;
28         OutputStream os;
29         try{
30           is=client_s.getInputStream();
31           os=client_s.getOutputStream();
32           BufferedReader sys_br=new BufferedReader(new InputStreamReader(System.in));
33           BufferedReader client_br=new BufferedReader(new InputStreamReader(is));
34           PrintWriter client_pw=new PrintWriter(os,true);
35            String warnStr=null;
36           if((warnStr=client_br.readLine())!=null){
37             System.out.println(warnStr);
38           }
39           while((warnStr=sys_br.readLine())!=null){
40             client_pw.println(warnStr);
41             break;
42             }
43         }catch(IOException e){
44               e.printStackTrace();
45         }
46       }
47
48     public static void main(String[] args) {
49         // TODO 自动生成的方法存根
50          ClientText myclient=new ClientText();
51             try {
52                 myclient.setConnection();
53             } catch (IOException e) {
54                 // TODO 自动生成的 catch 块
55                 e.printStackTrace();
56             }
57     }
58
59 }


服务端代码:

1 import java.io.IOException;
2 import java.net.ServerSocket;
3 import java.net.Socket;
4 import java.io.InputStream;
5 import java.io.OutputStream;
6 import java.io.InputStreamReader;
7 import java.io.PrintWriter;
8 import java.io.BufferedReader;
9
10 public class ServerText{
11
12   private ServerSocket ss;
13   public static final int port=7890;
14
15   public ServerText(){
16     try{
17       ss=new ServerSocket(port);
18     }catch(IOException e){
19       e.printStackTrace();
20     }
21   }
22
23   public void setConnection()throws IOException{
24     Socket server_s;
25     OutputStream os;
26     InputStream is;
27     try{
28       //服务器程序陷入阻塞状态,随时接受客户端的链接
29       server_s=ss.accept();
30       //接收并连接之后
31       os=server_s.getOutputStream();
32       is=server_s.getInputStream();
33       //给客户端发送数据
34       PrintWriter server_pw=new PrintWriter(os,true);
35       //接收客户端的数据
36       BufferedReader server_br=new BufferedReader(new InputStreamReader(is));
37       String msg=null;
38       server_pw.println("连接成功,请输入一些数据传递到服务端");
39       if((msg=server_br.readLine())!=null){
40         System.out.println("客户端传递过来的数据为:"+msg);
41         server_pw.println("数据传输成功");
42       }else{
43         server_pw.println("数据传输失败,出现错误");
44       }
45     }catch(IOException e){
46       e.printStackTrace();
47     }
48   }
49
50   public static void main(String args[]) throws IOException{
51          ServerText server_text=new ServerText();
52          server_text.setConnection();
53
54       }
55 }


运行结果:

  客户端:



  服务端:



以上就是简单的socket的通信过程。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: