【Android笔记】ServerSocket 与 Socket的区别
1 ServerSocket类
创建一个ServerSocket类,同时在运行该语句的计算机的指定端口处建立一个监听服务,如:
ServerSocket MyListener=new ServerSocket(600);
这里指定提供监听服务的端口是600,一台计算机可以同时提供多个服务,这些不同的服务之间通过端口号来区别,不同的端口号上提供不同的服务。为了随时监听可能的Client请求,执行如下的语句:
Socket LinkSocket=MyListener.accept();
该语句调用了ServerSocket对象的accept()方法,这个方法的执行将使Server端的程序处于等待状态,程序将一直阻塞直到捕捉到一个来自Client端的请求,并返回一个用于与该Client通信的Socket对象Link-Socket。此后Server程序只要向这个Socket对象读写数据,就可以实现向远端的Client读写数据。结束监听时,关闭ServerSocket对象:
Mylistener.close();
2 Socket类
当Client程序需要从Server端获取信息及其他服务时,应创建一个Socket对象:
Socket MySocket=new Socket(“ServerComputerName”,600);
Socket类的构造函数有两个参数,第一个参数是欲连接到的Server计算机的主机地址,第二个参数是该Server机上提供服务的端口号。
Socket对象建立成功之后,就可以在Client和Server之间建立一个连接,并通过这个连接在两个端点之间传递数据。利用Socket类的方法getOutputStream()和getInputStream()分别获得向Socket读写数据的输入/输出流,最后将从Server端读取的数据重新返还到Server端。
当Server和Client端的通信结束时,可以调用Socket类的close()方法关闭Socket,拆除连接。
ServerSocket 一般仅用于设置端口号和监听,真正进行通信的是服务器端的Socket与客户端的Socket,在ServerSocket 进行accept之后,就将主动权转让了。
1. 服务器端程序设计
在服务器端,利用ServerSocket类的构造函数ServerSocket(int port)创建一个ServerSocket类的对象,port参数传递端口,这个端口就是服务器监听连接请求的端口,如果在这时出现错误将抛出IOException异常对象,否则将创建ServerSocket对象并开始准备接收连接请求。
服务程序从调用ServerSocket的accept()方法开始,直到连接建立。在建立连接后,accept()返回一个最近创建的Socket对象,该Socket对象绑定了客户程序的IP地址或端口号。
2.客户端程序设计
当客户程序需要与服务器程序通信时,需在客户机创建一个Socket对象。Socket类有构造函数Socket(InetAddress addr,int port)和Socket(String host,intport),两个构造函数都创建了一个基于Socket的连接服务器端流套接字的流套接字。对于第一个InetAd-dress子类对象通过addr参数获得服务器主机的IP地址,对于第二个函数host参数包被分配到InetAddress对象中,如果没有IP地址与host参数相一致,那么将抛出UnknownHostException异常对象。两个函数都通过参数port获得服务器的端口号。假设已经建立连接了,网络API将在客户端基于Socket的流套接字中捆绑客户程序的IP地址和任意一个端口号,否则两个函数都会抛出一个IOException对象。
如果创建了一个Socket对象,那么它可通过get-InputStream()方法从服务程序获得输入流读传送来的信息,也可通过调用getOutputStream()方法获得输出流来发送消息。在读写活动完成之后,客户程序调用close()方法关闭流和流套接字。
附小程序加以说明:
服务器端代码:
1 import java.io.IOException; 2 import java.io.OutputStream; 3 import java.net.ServerSocket; 4 import java.net.Socket; 5 6 7 8 public class Myserver { 9 10 //建立ServerSocket,并设置其端口号 11 private ServerSocket ss; 12 13 public static final int port=8962; 14 15 public Myserver(){ 16 17 try{ 18 19 ss=new ServerSocket(port); 20 21 }catch(IOException e){ 22 23 e.printStackTrace(); 24 } 25 26 } 27 public void setConnection() throws IOException{ 28 //建立服务器端的Socket 29 Socket s; 30 OutputStream os; 31 try{ //ServerSocke.accept()t返回一个Socket对象 32 33 s=ss.accept(); 34 os=s.getOutputStream(); 35 os.write("hello".getBytes()); 36 os.close(); 37 s.close(); 38 }catch(IOException e){ 39 40 e.printStackTrace(); 41 } 42 43 } 44 45 public static void main(String[] args) throws IOException { 46 47 Myserver ms=new Myserver(); 48 ms.setConnection(); 49 50 } 51 52 }
客户端代码:
1 import java.io.BufferedReader; 2 import java.io.IOException; 3 import java.io.InputStream; 4 import java.io.InputStreamReader; 5 import java.net.Socket; 6 7 8 9 public class Myclient { 10 public static final String IP="172.16.221.134"; 11 public static final int port=8962; 12 private Socket s; 13 14 public Myclient() throws IOException{ 15 try{ 16 s=new Socket(IP,port); 17 18 }catch(IOException e){ 19 20 e.printStackTrace(); 21 } 22 } 23 24 public void setConnection()throws IOException{ 25 26 InputStream is; 27 28 try{ 29 is=s.getInputStream(); 30 BufferedReader br=new BufferedReader(new InputStreamReader(is)); 31 32 System.out.println(br.readLine()); 33 34 }catch(IOException e){ 35 36 e.printStackTrace(); 37 } 38 39 40 } 41 public static void main(String args[]) throws IOException{ 42 43 Myclient mc=new Myclient(); 44 mc.setConnection(); 45 46 } 47 }
参考原文:http://www.cnblogs.com/mareymarey111/archive/2011/12/08/2280253.html
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。