`
chenqqabcd
  • 浏览: 5465 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

3.基于Socket的Java网络编程

 
阅读更多
引用
事实上网络编程简单的理解就是两台计算机相互通讯数据而已,对于程序员而言,去掌握一种编程接口并使用一种编程模型相对就会显得简单的多了,Java SDK提供一些相对简单的Api来完成这些工作。Socket就是其中之一,对于Java而言,这些Api存在与java.net 这个包里面,因此只要导入这个包就可以准备网络编程了。

  

   网络编程的基本模型就是客户机到服务器模型,简单的说就是两个进程之间相互通讯,然后其中一个必须提供一个固定的位置,而另一个则只需要知道这个固定的位置。并去建立两者之间的联系,然后完成数据的通讯就可以了,这里提供固定位置的通常称为服务器,而建立联系的通常叫做客户端,基于这个简单的模型,就可以进入网络编程啦。

  

  Java对这个模型的支持有很多种Api,而这里我只想介绍有关Socket的编程接口,对于Java而言已经简化了Socket的编程接口。首先我们来讨论有关提供固定位置的服务方是如何建立的。Java提供了ServerSocket来对其进行支持.事实上当你创建该类的一个实力对象并提供一个端口资源你就建立了一个固定位置可以让其他计算机来访问你,ServerSocket server=new ServerSocket(6789);这里稍微要注意的是端口的分配必须是唯一的。因为端口是为了唯一标识每台计算机唯一服务的,另外端口号是从0~65535之间的,前1024个端口已经被Tcp/Ip 作为保留端口,因此你所分配的端口只能是1024个之后的。好了,我们有了固定位置.现在所需要的就是一根连接线了.该连接线由客户方首先提出要求。因此Java同样提供了一个Socket对象来对其进行支持,只要客户方创建一个Socket的实例对象进行支持就可以了。Socket client=new Socket(InetAddress.getLocalHost(),5678);客户机必须知道有关服务器的IP地址,对于着一点Java也提供了一个相关的类InetAddress 该对象的实例必须通过它的静态方法来提供,它的静态方法主要提供了得到本机IP 和通过名字或IP直接得到InetAddress的方法。

  

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


BufferedReader in=new BufferedReader(new InputStreamReader(server.getInputStream()));
   PrintWriter out=new PrintWriter(server.getOutputStream());
  
引用
上面两句就是建立缓冲并把原始的字节流转变为Unicode可以操作,而原始的字节流来源于Socket的两个方法,getInputStream()和getOutputStream()方,分别用来得到输入和输出,那么现在有了基本的模型和基本的操作工具,我们可以做一个简单的Socket例程了。

服务方:
import java.io.*;
     import java.net.*;
     public class MyServer {
     public static void main(String[] args) throws IOException{
     ServerSocket server=new ServerSocket(5678);
     Socket client=server.accept();
     BufferedReader in=new BufferedReader(new InputStreamReader(client.getInputStream()));
     PrintWriter out=new PrintWriter(client.getOutputStream());
     while(true){
      String str=in.readLine();
      System.out.println(str);
      out.println("has receive....");
      out.flush();
      if(str.equals("end"))
       break;
     }
     client.close();
     }
     } 

引用
这个程序的主要目的在于服务器不断接收客户机所写入的信息只到,客户机发送"End"字符串就退出程序,并且服务器也会做出"Receive"为回应,告知客户机已接收到消息。

客户机代码:
import java.net.*;
     import java.io.*;
  
     public class Client{
     static Socket server;
  
     public static void main(String[] args)throws Exception{
     server=new Socket(InetAddress.getLocalHost(),5678);
     BufferedReader in=new BufferedReader(new InputStreamReader(server.getInputStream()));
     PrintWriter out=new PrintWriter(server.getOutputStream());
     BufferedReader wt=new BufferedReader(new InputStreamReader(System.in));
  
     while(true){
      String str=wt.readLine();
      out.println(str);
      out.flush();
      if(str.equals("end")){
       break;
      }
      System.out.println(in.readLine());
     }
     server.close();
     }
     } 

 
引用
客户机代码则是接受客户键盘输入,并把该信息输出,然后输出"End"用来做退出标识。
  
   这个程序只是简单的两台计算机之间的通讯,如果是多个客户同时访问一个服务器呢?你可以试着再运行一个客户端,结果是会抛出异常的。那么多个客户端如何实现呢?
   其实,简单的分析一下,就可以看出客户和服务通讯的主要通道就是Socket本身,而服务器通过accept方法就是同意和客户建立通讯.这样当客户建立Socket的同时。服务器也会使用这一根连线来先后通讯,那么既然如此只要我们存在多条连线就可以了。那么我们的程序可以变为如下:

服务器:
  
     import java.io.*;
     import java.net.*;
  
     public class MyServer {
     public static void main(String[] args) throws IOException{
     ServerSocket server=new ServerSocket(5678);
     while(true){
      Socket client=server.accept();
      BufferedReader in=new BufferedReader(new InputStreamReader(client.getInputStream()));
      PrintWriter out=new PrintWriter(client.getOutputStream());
      while(true){
       String str=in.readLine();
       System.out.println(str);
       out.println("has receive....");
       out.flush();
       if(str.equals("end"))
        break;
      }
      client.close();
     }
     }
     } 

引用
这里仅仅只是加了一个外层的While循环,这个循环的目的就是当一个客户进来就为它分配一个Socket直到这个客户完成一次和服务器的交互,这里也就是接受到客户的"End"消息.那么现在就实现了多客户之间的交互了。但是.问题又来了,这样做虽然解决了多客户,可是是排队执行的。也就是说当一个客户和服务器完成一次通讯之后下一个客户才可以进来和服务器交互,无法做到同时服务,那么要如何才能同时达到既能相互之间交流又能同时交流呢?很显然这是一个并行执行的问题了。所以线程是最好的解决方案。
  
  那么下面的问题是如何使用线程.首先要做的事情是创建线程并使得其可以和网络连线取得联系。然后由线程来执行刚才的操作,要创建线程要么直接继承Thread要么实现Runnable接口,要建立和Socket的联系只要传递引用就可以了.而要执行线程就必须重写run方法,而run方法所做的事情就是刚才单线程版本main所做的事情,因此我们的程序变成了这样:

import java.net.*;
     import java.io.*;
  
     public class MultiUser extends Thread{
     private Socket client;
  
     public MultiUser(Socket c){
     this.client=c;
     }
  
     public void run(){
     try{
      BufferedReader in=new BufferedReader(new InputStreamReader(client.getInputStream()));
      PrintWriter out=new PrintWriter(client.getOutputStream());
      //Mutil User but can parallel
      while(true){
       String str=in.readLine();
       System.out.println(str);
       out.println("has receive....");
       out.flush();
       if(str.equals("end"))
        break;
      }
      client.close();
     }catch(IOException ex){
     }finally{
     }
     }
  
     public static void main(String[] args)throws IOException{
     ServerSocket server=new ServerSocket(5678);
     while(true){
     //transfer location change Single User or Multi User
     MultiUser mu=new MultiUser(server.accept());
     mu.start();
     }
     }
     } 

我的类直接从Thread类继承了下来.并且通过构造函数传递引用和客户Socket建立了联系,这样每个线程就有了。一个通讯管道.同样我们可以填写run方法,把之前的操作交给线程来完成,这样多客户并行的Socket就建立起来了。
  
   以上的代码使用的是
  
  
 BufferedReader in=new BufferedReader(new InputStreamReader(client.getInputStream()));
   PrintWriter out=new PrintWriter(client.getOutputStream());

   还有一种方法是使用
  
  
 DataInputStream isFromClient = new DataInputStream(client.getInputStream());
   DataOutputStream osToClient = new DataOutputStream(client.getOutputStream());

  关于这两种输入输出流的不同,我也只知道前一种对字符串支持比较好,后面对于读取一个字符串需要处理,但是可以支持很多种类型的输出。对于传递字符串而言前一种应该是很好的选择了。
分享到:
评论

相关推荐

    基于SOCKET的网络编程

    ### 基于SOCKET的网络编程知识点解析 #### 一、实验背景与目标 本实验旨在通过实际操作,使学生深入理解并掌握基于SOCKET的网络编程技术。实验选择了Java语言作为开发工具,利用Swing框架来构建图形用户界面(GUI...

    用Java实现基于Socket的网络编程

    在这个项目中,我们讨论的是如何用Java实现基于Socket的网络编程,具体是一个简单的聊天室应用。Socket编程是网络通信的基础,它允许两个或多个设备通过TCP(传输控制协议)进行数据交换。TCP是一个面向连接的、可靠...

    Java中基于Socket的网络编程.pdf

    "Java中基于Socket的网络编程.pdf" 本文档主要介绍了Java中基于Socket的网络编程的相关知识点: 1. Socket通信的基本原理:Socket是Java网络编程的基础, Socket是一种套接字,用于网络通信,通过Socket可以建立...

    Java Socket网络编程.pdf

    Java Socket网络编程是Java平台中的核心特性,它为开发者提供了在TCP/IP协议下创建网络应用的能力。Socket编程主要用于实现客户端和服务器之间的通信,基于客户机/服务器模型。在这个模型中,服务器端通常处于被动...

    基于socket java 语言网络通讯机制和程序设计

    本文旨在探讨Java语言在网络通讯中的应用及其基于Socket的编程机制。随着互联网技术的飞速发展,网络编程已经成为软件开发中不可或缺的一部分。Java作为一种跨平台的语言,凭借其丰富的API和强大的网络功能,在网络...

    基于java socket网络编程实现的五子棋游戏,可多人在线玩耍,聊天

    本项目“基于Java Socket网络编程实现的五子棋游戏,可多人在线玩耍,聊天”正是这种技术的实际应用。 首先,我们来深入理解Java Socket编程。Socket是网络通信中的端点,它允许两台计算机(或者网络上的任何其他...

    华科-计算机网络实验报告-Java_Socket编程-网络组建实验.docx

    "华科-计算机网络实验报告-Java_Socket编程-网络组建实验.docx" 这份实验报告主要涵盖了计算机网络实验的两个部分:Socket 编程和网络组建实验。下面是对这两部分的详细解释和知识点总结: Socket 编程 Socket ...

    利用Socket进行Java网络编程.zip_java socket _java 网络编程_java 聊天_socket jav

    在提供的"利用Socket进行Java网络编程.doc"文档中,可能包含了详细的步骤和示例代码,讲解了如何实现上述过程。而"www.pudn.com.txt"可能是文档来源的说明或者其他辅助信息。 总的来说,Java Socket编程是构建网络...

    Java源码:Socket编程.rar_java socket _java编程_socket java_socket编程 jav

    Java Socket编程是网络编程中的重要组成部分,主要用于实现客户端与服务器之间的通信。在Java中,Socket是基于TCP协议的,提供了一种可靠的、基于字节流的双向通信方式。本资料包含的"Java源码:Socket编程"是一个...

    基于Socket的java网络编程

    Java网络编程的核心是基于Socket进行通信,Socket是TCP/IP协议栈的一种实现,它允许两个网络节点(通常是客户端和服务器)通过TCP或UDP进行数据交换。Socket接口为应用程序提供了低级别的网络通信控制,允许开发者...

    socket通讯资料汇总

    用Java实现一个UDP通信模型.pdf 用Java实现一个Socket通信模型.pdf 用Java实现网络通讯.pdf 用JAVA实现基于TCP的SOCKET编程.pdf 用Java实现基于TCPIP协议的网络通信程序.pdf ...基于SOCKET的JAVA网络编程.pdf ...

    基于java socket网络编程实现的简单模拟qq聊天的程序,可实现并发聊天

    Java Socket网络编程是Java语言中实现网络通信的基础,它提供了低级别的、面向连接的、可靠的字节流服务。在这个基于Java Socket实现的简单模拟QQ聊天程序中,我们主要探讨以下几个核心知识点: 1. **Socket原理**...

    Java网络编程的研究.pdf

    3. 基于Socket的Java网络编程:介绍基于Socket的Java网络编程的基本概念和应用。 基于Socket的Java网络编程是指使用Socket类实现网络通信的编程方式。这种编程方式可以实现客户端和服务器端之间的网络通信,例如,...

    Java基于socket的进程间通信 聊天小程序

    Java基于Socket的进程间通信(IPC)是一种网络编程技术,常用于实现客户端和服务器之间的通信。在这个场景下,我们讨论的是一个简单的聊天小程序,它利用了Java的Socket库来搭建客户端与服务器之间的桥梁,实现数据...

    JAVA网络编程学习资料

    Java的`java.net`包提供了丰富的网络编程API,包括Socket、ServerSocket、URL、URLConnection等。这些类使得开发者能够方便地处理TCP和UDP连接,访问网络资源,以及进行HTTP通信。同时,`javax.transaction`包则...

    elecfans.com-Java网络编程与分布式计算

    Java网络编程与分布式计算是Java开发中的重要领域,它涵盖了多方面的重要概念和技术。Java语言以其平台无关性和强大的网络支持,成为了实现网络应用和分布式系统的主要工具。在本专题中,我们将深入探讨Java如何处理...

    JavaTCP-Socket.zip_JAVA socket编程_java socket _socket 聊天

    Java TCP套接字编程是网络通信中的核心...总结,Java Socket编程为开发者提供了构建网络通信应用的基础工具,通过TCP套接字,我们可以创建可靠的聊天应用。理解并熟练掌握Socket编程,是开发网络应用程序的关键步骤。

    S.SOCKET编程,Java网络编程(上)

    Java网络编程是开发分布式应用程序的关键组成部分,而S.SOCKET编程是Java中实现网络通信的核心机制。本文主要探讨了网络基础知识、计算机网络的分类、网络工作模式以及Internet的发展历程,同时还涉及了网络通信协议...

    Java网络编程/Java网络编程实例

    1. **Java Socket编程**:Java的Socket类提供了基于TCP/IP协议的网络通信能力。通过ServerSocket创建服务器端,Socket创建客户端,两者建立连接后可以进行双向数据传输。例如,你可以构建一个简单的聊天应用或文件...

    总结java_socket编程.doc

    在Java中,Socket编程主要是基于TCP/IP协议的网络编程。 网络编程的两个主要问题 在网络编程中,有两个主要的问题需要解决:一是如何准确地定位网络上的一台或多台主机,二是找到主机后如何可靠高效地进行数据传输...

Global site tag (gtag.js) - Google Analytics