Java培训之socket学习实例

上传人:M****1 文档编号:495834216 上传时间:2022-07-27 格式:DOC 页数:5 大小:63.50KB
返回 下载 相关 举报
Java培训之socket学习实例_第1页
第1页 / 共5页
Java培训之socket学习实例_第2页
第2页 / 共5页
Java培训之socket学习实例_第3页
第3页 / 共5页
Java培训之socket学习实例_第4页
第4页 / 共5页
Java培训之socket学习实例_第5页
第5页 / 共5页
亲,该文档总共5页,全部预览完了,如果喜欢就下载吧!
资源描述

《Java培训之socket学习实例》由会员分享,可在线阅读,更多相关《Java培训之socket学习实例(5页珍藏版)》请在金锄头文库上搜索。

1、文档供参考,可复制、编制,期待您的好评与关注! 北京尚学堂提供事实上网络编程简单的理解就是两台计算机相互通讯数据而已.对于程序员而言,去掌握一种编程接口并使用一种编程模型相对就会显得简单的多了.Java SDK提供一些相对简单的Api来完成这些工作.Socket就是其中之一.对于Java而言.这些Api存在与 这个包里面.因此只要导入这个包就可以准备网络编程了.网络编程的基本模型就是客户机到服务器模型.简单的说就是两个进程之间相互通讯,然后其中一个必须提供一个固定的位置,而另一个则只需要知道这个固定的位置.并去建立两者之间的联系.然后完成数据的通讯就可以了.这里提供固定位置的通常称为服务器,而

2、建立联系的通常叫做客户端.基于这个简单的模型,就可以进入网络编程啦.Java对这个模型的支持有很多种Api.而这里我只想介绍有关Socket的编程接口.对于Java而言已经简化了Socket的编程接口.首先我们来讨论有关提供固定位置的服务方是如何建立的.Java提供了ServerSocket来对其进行支持.事实上当你创建该类的一个实力对象并提供一个端口资源你就建立了一个固定位置可以让其他计算机来访问你.Java代码 1. ServerSocketserver=newServerSocket(6789);这里稍微要注意的是端口的分配必须是唯一的.因为端口是为了唯一标识每台计算机唯一服务的.另外端

3、口号是从065535之间的,前1024个端口已经被Tcp/Ip 作为保留端口,因此你所分配的端口只能是1024个之后的.好了.我们有了固定位置.现在所需要的就是一根连接线了.该连接线由客户方首先提出要求.因此Java同样提供了一个Socket对象来对其进行支持.只要客户方创建一个Socket的实例对象进行支持就可以了.Java代码 1. Socketclient=newSocket(InetAddress.getLocalHost(),5678);客户机必须知道有关服务器的IP地址.对于着一点Java也提供了一个相关的类InetAddress 该对象的实例必须通过它的静态方法来提供.它的静态方

4、法主要提供了得到本机IP 和通过名字或IP直接得到InetAddress的方法.好了.上面的方法基本可以建立一条连线让两台计算机相互交流了.可是数据是如何传输的呢?事实上I/O操作总是和网络编程息息相关的.因为底层的网络是继续数据的.除非远程调用,处理问题的核心在执行上.否则数据的交互还是依赖于IO操作的.所以你也必须导入java.io这个包.java的IO操作也不复杂.它提供了针对于字节流和Unicode的读者和写者,然后也提供了一个缓冲用于数据的读写.Java代码 1. BufferedReaderin=2. newBufferedReader(newInputStreamReader(s

5、erver.getInputStream();3. PrintWriterout=newPrintWriter(server.getOutputStream();上面两句就是建立缓冲并把原始的字节流转变为Unicode可以操作.而原始的字节流来源于Socket的两个方法.getInputStream()和getOutputStream()方.分别用来得到输入和输出.那么现在有了基本的模型和基本的操作工具.我们可以做一个简单的Socket例程了.服务方:Java代码 1. importjava.io.*;2. .*;3. 4. publicclassMyServer5. publicstatic

6、voidmain(Stringargs)throwsIOException6. ServerSocketserver=newServerSocket(5678);7. Socketclient=server.accept();8. BufferedReaderin=9. newBufferedReader(newInputStreamReader(client.getInputStream();10. PrintWriterout=newPrintWriter(client.getOutputStream();11. while(true)12. Stringstr=in.readLine()

7、;13. System.out.println(str);14. out.println(hasreceive.);15. out.flush();16. if(str.equals(end)17. break;18. 19. client.close();20. 21. 这个程序的主要目的在于服务器不断接收客户机所写入的信息只到.客户机发送End字符串就退出程序.并且服务器也会做出Receive为回应.告知客户机已接收到消息.客户机代码:Java代码 1. .*;2. importjava.io.*;3. 4. publicclassClient5. staticSocketserver;6

8、. 7. publicstaticvoidmain(Stringargs)throwsException8. server=newSocket(InetAddress.getLocalHost(),5678);9. BufferedReaderin=10. newBufferedReader(newInputStreamReader(server.getInputStream();11. PrintWriterout=newPrintWriter(server.getOutputStream();12. BufferedReaderwt=newBufferedReader(newInputSt

9、reamReader(System.in);13. 14. while(true)15. Stringstr=wt.readLine();16. out.println(str);17. out.flush();18. if(str.equals(end)19. break;20. 21. System.out.println(in.readLine();22. 23. server.close();24. 25. 客户机代码则是接受客户键盘输入,并把该信息输出,然后输出End用来做退出标识.这个程序只是简单的两台计算机之间的通讯.如果是多个客户同时访问一个服务器呢?你可以试着再运行一个客户端

10、,结果是会抛出异常的.那么多个客户端如何实现呢?其实,简单的分析一下,就可以看出客户和服务通讯的主要通道就是Socket本身.而服务器通过accept方法就是同意和客户建立通讯.这样当客户建立Socket的同时.服务器也会使用这一根连线来先后通讯.那么既然如此只要我们存在多条连线就可以了.那么我们的程序可以变为如下:服务器:Java代码 1. importjava.io.*;2. .*;3. 4. publicclassMyServer5. publicstaticvoidmain(Stringargs)throwsIOException6. ServerSocketserver=newSer

11、verSocket(5678);7. while(true)8. Socketclient=server.accept();9. BufferedReaderin=10. newBufferedReader(newInputStreamReader(client.getInputStream();11. PrintWriterout=newPrintWriter(client.getOutputStream();12. while(true)13. Stringstr=in.readLine();14. System.out.println(str);15. out.println(hasre

12、ceive.);16. out.flush();17. if(str.equals(end)18. break;19. 20. client.close();21. 22. 23. 这里仅仅只是加了一个外层的While循环.这个循环的目的就是当一个客户进来就为它分配一个Socket直到这个客户完成一次和服务器的交互,这里也就是接受到客户的End消息.那么现在就实现了多客户之间的交互了.但是.问题又来了.这样做虽然解决了多客户,可是是排队执行的.也就是说当一个客户和服务器完成一次通讯之后下一个客户才可以进来和服务器交互.无法做到同时服务.那么要如何才能同时达到既能相互之间交流又能同时交流呢?很显

13、然这是一个并行执行的问题了.所以线程是最好的解决方案.那么下面的问题是如何使用线程.首先要做的事情是创建线程并使得其可以和网络连线取得联系.然后由线程来执行刚才的操作.要创建线程要么直接继承Thread要么实现Runnable接口,要建立和Socket的联系只要传递引用就可以了.而要执行线程就必须重写run方法.而run方法所做的事情.就是刚才单线程版本main所做的事情.因此我们的程序变成了这样:Java代码 1. .*;2. importjava.io.*;3. 4. publicclassMultiUserextendsThread5. privateSocketclient;6. 7.

14、 publicMultiUser(Socketc)8. this.client=c;9. 10. 11. publicvoidrun()12. try13. BufferedReaderin=14. newBufferedReader(newInputStreamReader(client.getInputStream();15. PrintWriterout=newPrintWriter(client.getOutputStream();16. /MutilUserbutcantparallel17. while(true)18. Stringstr=in.readLine();19. System.out.println(str);20. ou

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 国内外标准规范

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号