浅谈Java网络编程之Socket (1)

和大家一起分享的是Java网络编程之Socket。在Java中Socket可以理解为客户端或者服务器端的一个特殊的对象,这个对象有两个关键的方法,一个是getInputStream方法,另一个是getOutputStream方法。getInputStream方法可以得到一个输入流,客户端的Socket对象上的getInputStream方法得到的输入流其实就是从服务器端发回的数据流。GetOutputStream方法得到一个输出流,客户端Socket对象上的getOutputStream方法返回的输出流就是将要发送到服务器端的数据流,(其实是一个缓冲区,暂时存储将要发送过去的数据)。

 

 

  程序可以对这些数据流根据需要进行进一步的封装。本文的例子就对这些数据流进行了一定的封装(关于封装可以参考Java中流的实现部分)。

 

 

  一、建立服务器类

 

 

  Java中有一个专门用来建立Socket服务器的类,名叫ServerSocket,可以用服务器需要使用的端口号作为参数来创建服务器对象。

 

 

 

 

ServerSocket server = new ServerSocket(9998)

 

 

 

 

  这条语句创建了一个服务器对象,这个服务器使用9998号端口。当一个客户端程序建立一个Socket连接,所连接的端口号为9998时,服务器对象server便响应这个连接,并且server.accept()方法会创建一个Socket对象。服务器端便可以利用这个Socket对象与客户进行通讯。

 

 

 

 

Socket incoming = server.accept()

 

 

 

  进而得到输入流和输出流,并进行封装

 

 

BufferedReader in = new BufferedReader(new

 

 

      InputStreamReader(incoming.getInputStream()));

PrintWriter out = new PrintWriter(incoming.getOutputStream(),true);

 

  随后,就可以使用in.readLine()方法得到客户端的输入,也可以使用out.println()方法向客户端发送数据。从而可以根据程序的需要对客户端的不同请求进行回应。

 

 

  在所有通讯结束以后应该关闭这两个数据流,关闭的顺序是先关闭输出流,再关闭输入流,即使用

 

 

 

 

out.close();

 

 

in.close();

 

 

  二、建立客户端代码

 

 

 

 

  相比服务器端,客户端要简单一些,客户端只需用服务器所在机器的ip以及服务器的端口作为参数创建一个Socket对象。得到这个对象后,就可以用"建立服务器"部分介绍的方法实现数据的输入和输出。

 

 

 

 

Socket socket = new Socket("168.160.12.42",9998);

 

 

in = new BufferedReader(new InputStreamReader(socket.getInputStream()));

out = new PrintWriter(socket.getOutputStream(),true);

 

 

  以上的程序代码建立了一个Socket对象,这个对象连接到ip地址为168.160.12.42的主机上、端口为9998的服务器对象。并且建立了输入流和输出流,分别对应服务器的输出和客户端的写入。

 

 

 

 

  三、建立用户界面

 

 

 

 

  读者可以根据自己的喜好建立自己的用户界面,这不是本文的重点。

 

 

 

 

  经过以上三个步骤,就可以建立一个比较简单的对话程序。但是,为了使这个程序更加完善,应进行以下几个改进:

 

 

 

 

  一、现在服务器只能服务一个客户,也就是单线程的。可以将它改进为多线程服务器。

 

 

 

 

 

 

 

 

 

 

 

 

try

 

 

{ file://建立服务器

 ServerSocket server = new ServerSocket(9998);

 int i=1;

 for(;;)

 {

  Socket incoming = server.accept();

  new ServerThread(incoming,i).start();

  i++;

 }

}catch (IOException ex){ ex.printStackTrace(); }

 

 

 

 

 

 

 

 

 

 

  循环检测是否有客户连接到服务器上,如果有,则创建一个线程来服务这个客户,这个线程的名称是ServerThread,这个类扩展了Thread类,它的编写方法与前述的服务器的写法相同。

 

 

 

 

  二、为了可以随时得到对方传送过来的消息,可以在服务器以及客户端各建立一个独立的线程来察看输入流,如果输入流中有输入,则可以即时显示出来。代码如下:

 

 

 

 

 

 

 

 

 

 

 

 

new Thread()

 

 

{

 public void run()

 {

  try

  { 

   while(true)

   {

    checkInput();

    sleep(1000);//每1000毫秒检测一次

   }

  }catch (InterruptedException ex)

 {

 }catch(IOException ex)

 {

  }

 }

}.start();

 

 

其中的checkInput()方法为

 

 

private void checkInput() throws IOException

{

 String line;

 if((line=in.readLine())!=null) file://检测输入流中是否有新的数据

  t.setPartner(line); file://将数据流中的消息显示出来

}

 

通过以上改进,程序就可以比较好的运行了。

转载于:https://www.cnblogs.com/qiforme/archive/2011/12/03/2272871.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/263004.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Windows10系统Python2.7通过Swig调用C++过程

我用的 python版本是2.7.12: Python 2.7.12 (v2.7.12:d33e0cf91556, Jun 27 2016, 15:24:40) [MSC v.1500 64 bit (AMD64)] on win32 1, 下载Swig 下载地址:http://www.swig.org/download.html,我下载了最新版本swigwin-4.0.0. 下载后直接解压…

《当程序员的那些狗日日子》(六十一)美丽的天际

《当程序员的那些狗日日子》(六十一)美丽的天际 注:这一篇之后,全文完结,后面还会再写一篇《后记》,以记录我在写作中的一些心情和感受,以及我想对各位支持和关注的朋友说的话。 我交了订金订购…

ewebeditor遍历路径漏洞

ewebeditor/admin_uploadfile.asp?id14在id14后面添加&dir..再加 &dir../..&dirhttp://www.cnblogs.com/../.. 看到整个网站文件了 转载于:https://www.cnblogs.com/allyesno/archive/2007/11/04/949171.html

Windows系统Python直接调用C++ DLL

环境:Window 10,VS 2019, Python 2.7.12, 64bit 1,打开 VS 2019,新建C Windows 动态链接库工程 Example,加入下列文件,如果Python是64位的则在VS中 Solution platforms 选择 x64 编译成64位的 D…

用SD卡下载uboot、linux内核和文件系统

1、 移植mtd-utils: a) 下载utd-utils 下载地址为ftp://ftp.infradead.org/pub/mtd-utils/b) 交叉编译mtd-utilsi 修改Makefile CROSSarm-linux-ii makeiii 查看下mtd-utils-1.0.0目录下是否生成了咱们所需要大工具 (flashcp,nandwrite......等)。有工具生成了&#xf…

进行有效编辑的七种习惯

如果你的很多时间是用来敲纯文本,写程序或HTML,那么有效地使用一个好的编辑器能节省你不少时间。这篇文章里的指导和提示将有助于你更快工作,更少犯错误。 文中采用开源文本编辑器Vim(Vi IMproved)说明有效编辑的思想,但这些思想也…

最全的HTML特殊字符集

有些属于utf-8字符集,所以网页需要字符编码是utf-8才能显示全部字符。下面是来自不同的源,所以难免有重复的地方。 left single quote ‘‘right single quote ’’single low-9 quote ‚‚left double quote ““r…

Desktop OS Market Share: Windows 90% - Mac 9% - Linux 1%

http://blog.tangcs.com/2008/12/14/desktop-os-market-share-2008/转载于:https://www.cnblogs.com/WarrenTang/archive/2008/12/14/1354704.html

css3中变形与动画(三)

transform可以实现矩阵变换,transition实现属性的平滑过渡,animation意思是动画,动漫,这个属性才和真正意义的一帧一帧的动画相关。本文就介绍animation属性。 animation属性通过一些关键帧中元素属性的改变来实现动画效果。当然也…

Lock“锁定”语句(C# 参考)

lock 关键字将语句块标记为临界区,方法是获取给定对象的互斥锁,执行语句,然后释放该锁。此语句的形式如下: 以带有颜色区分的格式查看复制到剪贴板打印Object thisLock new Object(); lock (thisLock) {// Critical code section…

个人代码库の自定义后缀名

usingMicrosoft.Win32; //操纵注册表的必要命名空间。namespacemyMethod{publicclassCreateSuffixName {//使程序获取被双击了的文件的路径,用到[Command]函数&#xff0c;可以[获取路径].///<summary>///创建自定义后缀名的方法。///</summary>///<param name&…

漂浮效果

<!doctype html> <html> <head> <title>漂浮效果</title> </head> <body> <div style"position:absolute;" onMouseOver"window.clearInterval(timer)" onMouseOut"creatTimer()"><img src&…

Scott Mitchell 的ASP.NET 2.0数据教程之四十四::DataList和Repeater数据分页

原文 | 下载本教程中的编码例子 | 下载本教程的PDF版 导言 分页和排序是显示数据时经常用到的功能。比如&#xff0c;在一个在线书店里搜索关于ASP.NET 的书的时候&#xff0c;可能结果会是成百上千&#xff0c;而每页只列出十条。而且结果可以根据title&#xff08;书名&#…

Python中的高级数据结构

http://blog.jobbole.com/65218/ 本文由 伯乐在线 - 熊崽Kevin 翻译自 pypix.com。欢迎加入技术翻译小组。转载请参见文章末尾处的要求。 数据结构 数据结构的概念很好理解&#xff0c;就是用来将数据组织在一起的结构。换句话说&#xff0c;数据结构是用来存储一系列关联数据的…

rails3系统架构

http://seamon.iteye.com/blog/1058510转载于:https://www.cnblogs.com/orez88/articles/2276821.html

如何理解 Objective-C Delegate

例如&#xff0c;我们要在一个 ViewController 中使用一个ActionSheet&#xff0c;代码如下&#xff1a; UIActionSheet *actionSheet [[UIActionSheet alloc]initWithTitle:"Delegate Example"delegate:self // telling this class to implement UIActionSheetDele…

必然的宿命,绚然的《暗花》

当开始相信宿命&#xff0c;开始相信看似偶然发生的突发事件自然由天注定时。那么&#xff0c;人的一生就只是一个由着有着来龙去脉的轨迹&#xff0c;不自主前行滚动的球儿。《暗花》里一个个都在掌握中巧妙设出的局&#xff0c;一层叠着一层&#xff0c;直至最后这种宿命感的…

抽象类的实际应用--模版设计

可以为抽象类实例化&#xff1a; package test1;abstract class Person { // 抽象类 Personprivate String name; // 封装属性nameprivate int age;// 封装属性agepublic Person(String name, int age) {// 构造函数 Person----方法名和类名一致this.name name;// 为name赋值t…

Gun N' Rose 小组分工、项目制品与贡献率计算

小组分工与贡献率计算 项目的具体工作有&#xff1a; 项目管理需求分析架构设计与实现模块设计与实现交互设计&#xff08;包括UI&#xff09;项目文档管理项目展示/答辩博客管理每位成员根据自己的能力和特长选择以上工作的一项或者多项来完成&#xff0c;每个工作项可由多个成…

jQuery 判断所有图片加载完成

对于图片的处理&#xff0c;例如幻灯片播放、缩放等&#xff0c;都是依赖于在所有图片完成之后再进行操作。 今天来看下如何判断所有的图片加载完成&#xff0c;而在加载完成之前可以使用 loading 的 gif 图表示正在加载中。 一、普通方法 监听 img 的 load 方法&#xff0c;每…