`

浅谈JAVA中如何利用socket进行网络编程(一)

    博客分类:
  • JAVA
 
阅读更多
http://developer.51cto.com/art/201106/268385.htm

Socket是网络上运行的两个程序间双向通讯的一端,它既可以接受请求,也可以发送请求,利用它可以较为方便的编写网络上的数据的传递。在java中,有专门的socket类来处理用户的请求和响应。利用SOCKET类的方法,就可以实现两台计算机之间的通讯。这里就介绍一下在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://将数据流中的消息显示出来  }  通过以上改进,程序就可以比较好的运行了。

希望本文可以帮助到你。
分享到:
评论

相关推荐

    浅谈Socket编程及Java实现

    开一个输出流,用于向服务器发送数据,同时创建一个数据输入流,用于接收服务器...在开发过程中,理解 Socket 的工作原理和使用方法,以及如何处理网络通信中的异常情况,是成为一名合格的 Java 网络程序员的必要技能。

    浅谈Java语言评价胜出的8大技术优势

    ### 浅谈Java语言评价胜出的8大技术优势 #### 1. 强大的API支持 Java提供了非常丰富的API支持,包括网络编程中的Socket API、数据库操作中的SQL API、图形用户界面的Swing和AWT API等。这些API不仅功能强大而且...

    浅谈java的TCP和UDP编程(附实例讲解)

    浅谈java的TCP和UDP编程 Java 编程中,TCP 和 UDP 是两种常用的网络协议,在网络编程中占据着非常重要的地位。今天,我们将深入浅谈 Java 中的 TCP 和 UDP 编程。 TCP 编程 TCP(Transmission Control Protocol)...

    2021-2022年收藏的精品资料软件工程师浅谈Java的输入输出流技术步骤说明.docx

    Java的输入输出流技术是Java编程中不可或缺的一部分,它提供了数据传输和处理的途径,涵盖了文件操作、网络通信、标准输入输出等多种场景。在Java中,流被分为两大类:字节流和字符流。 字节流主要由两个抽象基类...

    浅谈JAVA中输入输出流实例详解

    Java中的输入输出流是编程中不可或缺的一部分,它们用于在程序和外部资源之间传输数据。Java提供了丰富的类库来支持各种类型的输入输出操作,包括文件操作、网络通信、数据压缩等。这里我们将深入探讨Java中的输入...

    JAVA自学之路

    在这儿之后,你可以选择向J2ME、或者Java GUI、Socket编程等方向努力,但是通过第一篇的办法,你可以很容易就将这方向过滤掉(永远不要忘了我们是为了就业),好吧,暂时和它们诀别,还是向着J2EE的方向前进吧。...

    浅谈Linux 网络 I/O 模型简介(图文)

    在Linux系统中,所有的外部设备都被抽象成文件进行操作,而网络通信则通过socket接口实现,表现为socket文件描述符(fd)。根据UNIX网络编程的分类,Linux提供了五种I/O模型,分别是阻塞I/O、非阻塞I/O、I/O复用模型...

    浅谈关于java程序员面试的一些事项

    Java程序员面试是一个重要的过程,尤其是对于应届毕业生和有两三年工作经验的开发者来说,这可能是他们职业生涯中的关键转折点。在决定跳槽时,各种因素如薪资、工作环境、职业发展等都可能成为动机。但无论原因如何...

    Python核心编程第二版

     6.20 *拷贝Python对象、浅拷贝和深拷贝   6.21 序列类型小结   6.22 练习   第7章 映像和集合类型   7.1 映射类型:字典   7.1.1 如何创建字典和给字典赋值   7.1.2 如何访问字典中的值   ...

    (完整版)Java系统架构师面试题 (2).docx

    15. 浅谈一下负载平衡的原理? 负载平衡是一种技术,用于实现高可用性和高性能,通过将请求分配到多个服务器上来实现。 16. 怎么办理权限分派 有几种权限分派模型? 权限分派模型包括自主型接见控制、强迫型接见...

Global site tag (gtag.js) - Google Analytics