分享

java Socket编程

 桑枯海 2013-09-19
Java中的网络编程是一个很重要的部分,也是其编程优越性的地方之一。在Java中有一个专门的Java.net类库来管理网络编程的有关方法。
  下面先介绍在Java中怎样用socket进行客户与服务器通信。最后再介绍一个一个最简单的通话程序。

一.怎样用socket进行客户与服务器通信
  在Java中用socket进行客户/服务器之间的通信编程。Socket是两个实体之间进行通信的有效端点。通过socket可以获得源IP地址和 源端口、终点IP地址和终点端口。用户可以将多个socket连入同一个端口,以便对于单个端口可以有多个连接。通过socket客户/服务器编程可以创建一个能被许多人使用的分布式程序,并且所有客户均可以用统一的前端进行工作,并与服务器进行通信。
  要想与服务器通信必须具备三个条件:服务器程序、客户程序和连接它们的socket程序。这三个部分缺一不可。但是,客户与服务器之间的通信有很多的方式,其中另一个方法是把客户作为索取者,把服务器作为给予者。下面我们看一看Java的服务器编程。
  在Java中,服务器有3个主要的功能:
  1.在Java.net类库中通过构造一个ServerSocket类的实例使服务器能够检测到指定端口的信息。用ServerSocke中的accept()方法可以使服务器检测到指定端口的活动。另外,服务器还负责检测要求与它连接的客户。
Socket类的实例代表客户与服务器连接成功。通过编程可以使多个用户通过同一个端口与服务器相连,其中都是Socket 类的实例。
  2.可以分别用Socket类的getInputStream()和getOutStream()方法来发送和捕捉数据。其使用方法如下:
Java代码  收藏代码
  1. try{   
  2.     ServerSocket myServerSocket=new ServerSocket(100);   
  3.     Socket my100Socket=myServerSocket.accept();   
  4.   }catch(Exception e){}   

在上面的代码中,首先构造一个ServerSocket类的实例,并传递给它一个整数作为服务器指定可以使用的给定端口,如下:

  
Java代码  收藏代码
  1. ServerSocket myServerSocket=new ServerSocket(100);   


  在Java程序中如果每次构造ServerSocket时都能保持捕捉异常事件,则就随时指定了准备使用的端口。下面的代码使用accept()方法来检测端口的活动。

  
Java代码  收藏代码
  1. Socket my100Socket=myServerSocket.accept();   


  Accept()方法直到接收到用户的连接请求,才继续执行中断的执行程序。一旦客户的连接成功,my100Socket就代表该连接,并且可以发送和接收数据。
最后,我们看一看客户是怎样请求连接的。其连接方法如下: 

  
Java代码  收藏代码
  1. try{   
  2.     Socket mySocket=new Socket("www.cpcw.com",100);   
  3.   }catch(Exception e ){}   


  通过上面的代码可能看出,也是通过Socket类来实现的。下面我们通过一个网络编程的实例来说明如何进行网络通信。

二.一个最简单的通话程序

通话器服务器:
Java代码  收藏代码
  1. import java.net.*;   
  2. import java.io.*;   
  3. import java.lang.*;   
  4.   
  5. public class myserver{   
  6. public static void main(String args[]){   
  7. ServerSocket server;   
  8. Socket socket;   
  9. String s;   
  10. InputStream Is;   
  11. OutputStream Os;   
  12. DataInputStream DIS;   
  13. PrintStream PS;   
  14.   
  15. try{   
  16. //在端口4321注册服务   
  17. server=new ServerSocket(4321);   
  18. socket=server.accept();   //监听窗口,等待连接   
  19.   
  20. System.out.println("server ok");   
  21. System.out.println("************************************************");   
  22. System.out.println("");   
  23.   
  24. //获得对应Socket的输入/输出流   
  25. Is=socket.getInputStream();   
  26. Os=socket.getOutputStream();   
  27. //建立数据流   
  28. DIS=new DataInputStream(Is);   
  29. PS=new PrintStream(Os);   
  30. DataInputStream in=new DataInputStream(System.in);   
  31. while(true){   
  32. System.out.println("");   
  33. System.out.println("please wait client's message...");   
  34. System.out.println("");   
  35. s=DIS.readLine(); //读入从client传来的字符串   
  36. System.out.println("client said:"+s); //打印字符串   
  37. if(s.trim().equals("BYE"))break//如果是"BYE",就退出   
  38. System.out.print("you say:");   
  39. s=in.readLine(); //读取用户输入的字符串   
  40. PS.println(s); //将读取得字符串传给client   
  41. if(s.trim().equals("BYE"))break//如果是"BYE",就退出   
  42. }   
  43.   
  44. //关闭连接   
  45. DIS.close(); //关闭数据输入流   
  46. PS.close(); //关闭数据输出流   
  47. Is.close(); //关闭输入流   
  48. Os.close(); //关闭输出流   
  49. socket.close(); //关闭sockey   
  50. }   
  51. catch(Exception e){   
  52. System.out.println("Error:"+e);   
  53. }   
  54. }   
  55. }   



通话器客户端
Java代码  收藏代码
  1. import java.net.*;   
  2. import java.io.*;   
  3. import java.lang.*;   
  4.   
  5. public class myclient{   
  6. public static void main(String args[]){   
  7. if (args.length<1){ //判断命令加参数没有   
  8. System.out.println("you forget the name of the server!");   
  9. System.out.println("see also: myclient yxf");   
  10. System.exit(1); //如果没加参数就退出   
  11. }   
  12.   
  13. Socket socket;   
  14. String s="yxfsoft@263.net";   
  15. String len;   
  16. InputStream Is;   
  17. OutputStream Os;   
  18. DataInputStream DIS;   
  19. PrintStream PS;   
  20. try{   
  21. //向主机名为args[0]的服务器申请连接   
  22. //注意端口号要与服务器保持一致:4321   
  23. socket=new Socket(args[0],4321);   
  24.   
  25. System.out.println("client ok");   
  26. System.out.println("************************************************");   
  27. System.out.println("");   
  28.   
  29. //获得对应socket的输入/输出流   
  30. Is=socket.getInputStream();   
  31. Os=socket.getOutputStream();   
  32. //建立数据流   
  33. DIS=new DataInputStream(Is);   
  34. PS=new PrintStream(Os);   
  35. DataInputStream in=new DataInputStream(System.in);   
  36.   
  37. while(true){   
  38. System.out.print("you say:");   
  39. s=in.readLine(); //读取用户输入的字符串   
  40. PS.println(s); //将读取得字符串传给server   
  41. if(s.trim().equals("BYE"))break//如果是"BYE",就退出   
  42. else   
  43. {   
  44. System.out.println("");   
  45. System.out.println("please wait server's message...");   
  46. System.out.println("");   
  47. }   
  48. s=DIS.readLine(); //从服务器获得字符串   
  49. System.out.println("server said:"+s); //打印字符串   
  50. if(s.trim().equals("BYE"))break//如果是"BYE",就退出   
  51.   
  52. }   
  53.   
  54. //关闭连接   
  55. DIS.close(); //关闭数据输入流   
  56. PS.close(); //关闭数据输出流   
  57. Is.close(); //关闭输入流   
  58. Os.close(); //关闭输出流   
  59. socket.close(); //关闭socket   
  60. }   
  61. catch(Exception e){   
  62. System.out.println("Error:"+e);   
  63. }   
  64. }   
  65. }  

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约