`

socket简介

 
阅读更多

要完成这个工作,需要完成三个部分的工作,以下依次说明:

一、建立服务器类

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

  1. ServerSocket server = new ServerSocket(9998)  

这条语句创建了一个服务器对象,这个服务器使用9998号端口即在端口9998上注册服务,这里稍微要注意的是端口的分配必须是唯一的。因为端口是为了唯一标识每台计算机唯一服务的,另外端口号是从0~65535之间的,前1024个端口已经被Tcp/Ip 作为保留端口,因此你所分配的端口只能是1024个之后的。当一个客户端程序建立一个Socket连接,所连接的端口号为9998时,服务器对象server便响应这个连接,并且server.accept()方法会创建一个Socket对象。服务器端便可以利用这个Socket对象与客户进行通讯。

  1. Socket incoming = server.accept() ;    // 监听窗口,等待连接  

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

  1. BufferedReader in = new BufferedReader(new  
  2.   
  3. InputStreamReader(incoming.getInputStream()));   
  4.   
  5. /*  
  6.  
  7. 当读取文件时,先把内容读到缓存中,当调用in.readLine()时,再从缓存中以字符的方式读取数据(以下简称“缓存字节读取方式”)。  
  8.  
  9. */  
  10.   
  11. PrintWriter ut = new PrintWriter(incoming.getOutputStream(),true);   

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

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

  1. out.close();   
  2.   
  3. in.close();   

二、建立客户端代码

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

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

或:

  1. Socket socket = new Socket(InetAddress.getLocalHost(),5678);        // 向主机名为InetAddress.getLocalHost()的服务器申请连接  

客户机必须知道有关服务器的IP地址,对于着一点Java也提供了一个相关的类InetAddress 该对象的实例必须通过它的静态方法来提供,它的静态方法主要提供了得到本机IP 和通过名字或IP直接得到InetAddress的方法。

  1. in = new BufferedReader(new InputStreamReader(socket.getInputStream()));   
  2.   
  3. out = new PrintWriter(socket.getOutputStream(),true);       

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

三、实例分析

服务方:

  1. import java.io.*;   
  2. import java.net.*;   
  3. public class MyServer {   
  4. public static void main(String[] args) throws IOException{   
  5. ServerSocket server=new ServerSocket(5678);  //在端口5678上注册服务   
  6. Socket client=server.accept();       // 监听窗口,等待连接   
  7. BufferedReader in=new BufferedReader(new InputStreamReader(client.getInputStream()));   
  8.   
  9. fferedReader serverInput=new BufferedReader(new InputStreamReader(System.in));   
  10. PrintWriter ut=new PrintWriter(client.getOutputStream());   
  11. while(true){   
  12.  String str=in.readLine();          //// 读取从client传来的数据信息   
  13.   
  14.           str = serverInput.readLine();      // 读取用户键盘输入的字符串   
  15.  System.out.println(str);           //服务器控制台输出数据信息   
  16.  out.println("has receive....");  //服务器向客户端发送信息:has receive....   
  17.  out.flush();   
  18.  if(str.equals("end"))   
  19.   break;   
  20. }   
  21. client.close();   
  22. }   
  23. }   

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

  客户机代码:

  1. import java.net.*;   
  2. import java.io.*;   
  3.   
  4. public class Client{   
  5. static Socket server;   
  6.   
  7. public static void main(String[] args)throws Exception{   
  8. server=new Socket(InetAddress.getLocalHost(),5678);                                     // 向主机名为InetAddress.getLocalHost()的服务器申请连接   
  9. BufferedReader in=new BufferedReader(new InputStreamReader(server.getInputStream()));  //客户端建立输入流并进行封装   
  10. PrintWriter ut=new PrintWriter(server.getOutputStream());   
  11. BufferedReader wt=new BufferedReader(new InputStreamReader(System.in));    //客户端从键盘输入信息   
  12.   
  13. while(true){   
  14.  String str=wt.readLine();     //客户端读取(获得)键盘的字符串   
  15.   
  16.         String str1=in.readLine();    // 从服务器获得字符串   
  17.  out.println(str);                      //客户端向服务器发送信息   
  18.  out.flush();   
  19.  if(str.equals("end")){   
  20.   break;   
  21.  }   
  22.  System.out.println(in.readLine());   
  23. }   
  24. server.close();   
  25. }   
  26. }   

  客户机代码则是接受客户键盘输入,并把该信息输出,然后输出"End"用来做退出标识。

  这个程序只是简单的两台计算机之间的通讯,如果是多个客户同时访问一个服务器呢?你可以试着再运行一个客户端,结果是会抛出异常的。那么多个客户端如何实现呢?

  其实,简单的分析一下,就可以看出客户和服务通讯的主要通道就是Socket本身,而服务器通过accept方法就是同意和客户建立通讯.这样当客户建立Socket的同时。服务器也会使用这一根连线来先后通讯,那么既然如此只要我们存在多条连线就可以了。那么我们的程序可以变为如下:

 服务器: 

  1. import java.io.*;   
  2.  import java.net.*;   
  3.   
  4.  public class MyServer {   
  5.  public static void main(String[] args) throws IOException{   
  6.  ServerSocket server=new ServerSocket(5678);   
  7.  while(true){   
  8.   Socket client=server.accept();   
  9.   BufferedReader in=new BufferedReader(new InputStreamReader(client.getInputStream()));   
  10.   PrintWriter ut=new PrintWriter(client.getOutputStream());   
  11.   while(true){   
  12.    String str=in.readLine();   
  13.    System.out.println(str);   
  14.    out.println("has receive....");   
  15.    out.flush();   
  16.    if(str.equals("end"))   
  17.     break;   
  18.   }   
  19.   client.close();   
  20.  }   
  21.  }   
  22.  }   

  这里仅仅只是加了一个外层的While循环,这个循环的目的就是当一个客户进来就为它分配一个Socket直到这个客户完成一次和服务器的交互,这里也就是接受到客户的"End"消息.那么现在就实现了多客户之间的交互了。但是.问题又来了,这样做虽然解决了多客户,可是是排队执行的。也就是说当一个客户和服务器完成一次通讯之后下一个客户才可以进来和服务器交互,无法做到同时服务,那么要如何才能同时达到既能相互之间交流又能同时交流呢?很显然这是一个并行执行的问题了。所以线程是最好的解决方案。

  那么下面的问题是如何使用线程.首先要做的事情是创建线程并使得其可以和网络连线取得联系。然后由线程来执行刚才的操作,要创建线程要么直接继承Thread要么实现Runnable接口,要建立和Socket的联系只要传递引用就可以了.而要执行线程就必须重写run方法,而run方法所做的事情就是刚才单线程版本main所做的事情,因此我们的程序变成了这样:

  1. import java.net.*;   
  2. import java.io.*;   
  3.   
  4. public class MultiUser extends Thread{   
  5. private Socket client;   
  6.   
  7. public MultiUser(Socket c){   
  8. this.client=c;   
  9. }   
  10.   
  11. public void run(){   
  12. try{   
  13.  BufferedReader in=new BufferedReader(new InputStreamReader(client.getInputStream()));   
  14.  PrintWriter ut=new PrintWriter(client.getOutputStream());   
  15.  //Mutil User but can't parallel   
  16.  while(true){   
  17.   String str=in.readLine();   
  18.   System.out.println(str);   
  19.   out.println("has receive....");   
  20.   out.flush();   
  21.   if(str.equals("end"))   
  22.    break;   
  23.  }   
  24.  client.close();   
  25. }catch(IOException ex){   
  26. }finally{   
  27. }   
  28. }   
  29.   
  30. public static void main(String[] args)throws IOException{   
  31. ServerSocket server=new ServerSocket(5678);   
  32. while(true){   
  33. //transfer location change Single User or Multi User   
  34. MultiUser mu=new MultiUser(server.accept());   
  35. mu.start();   
  36. }   
  37. }   
  38. }   

分享到:
评论

相关推荐

    [Perl文]IO::Socket简介

    [Perl文]IO::Socket简介 ''''''''''''''''''' new()方法: SOCKET对象变量=IO::Socket::INET->new(SOCKET变量值); 实例: $sock=IO::Socket::INET->new('192.168.1.2:23'); 讲解: 所有的PERL对象编程都把对象...

    Socket简介

    Socket简介 简介 套接字(socket)是一个抽象层,应用程序可以通过它发送或接收数据,可对其进行像对文件一样的打开、读写和关闭等操作。套接字允许应用程序将I/O插入到网络中,并与网络中的其他应用程序进行通信。...

    Web Socket简介

    ### Web Socket简介及应用 #### 一、WebSocket概述 WebSocket是一种新型的通信协议,它作为HTML5中的一个重要组成部分,为Web开发带来了革命性的变化。在介绍WebSocket之前,我们需要回顾一下Web开发的历史,尤其...

    http和socket简介和对比

    - 建立 Socket 连接涉及服务器监听、客户端请求和连接确认三个步骤,与 TCP 连接类似,但更底层,可自定义协议和处理方式。 4. **Socket 连接与 TCP 连接的对比**: - HTTP 是基于 Socket 实现的应用层协议,提供...

    Socket简介及使用

    socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,都可以用“打开open –> 读写write/read –> 关闭close”模式来操作。我的理解就是Socket就是该模式的一个实现,socket即是一种特殊的文件,一些...

    SuperSocket客户端+服务端完整demo

    SuperSocket简介** SuperSocket设计的目标是让开发者能够快速搭建网络应用,它支持自定义协议,可以轻松地处理各种业务逻辑。框架的核心组件包括SocketServer和SocketAppServer,前者用于处理基础的Socket通信,后...

    HP-Socket压力测试 易源代码

    一、HP-Socket简介 HP-Socket是一个C++编写的网络通信库,它提供了丰富的API接口,支持TCP、UDP等多种网络协议。该框架不仅具备多线程处理能力,还支持异步事件驱动模型,以实现高效的网络通信。其易源代码的特点...

    C#编写socket做服务器和客户端例子

    一、Socket简介 Socket是网络通信的基础接口,它允许应用程序通过Internet进行通信。在C#中,System.Net.Sockets命名空间提供了Socket类,用于实现TCP和UDP协议。TCP(传输控制协议)提供面向连接的、可靠的数据传输...

    Socket说明文档(英文版)

    #### 一、Socket简介 **Socket** 是一种网络通信方式,它允许两台计算机之间进行数据交换。在互联网世界里,Socket 的历史远远早于 Java 语言的诞生,但 Java 使得 Socket 的使用变得更加简单高效。本章节将详细...

    lua socket 支持lua SOCKET编程

    1. **Lua Socket简介** Lua Socket是一个由Diego Nehab开发的开源库,其目标是为Lua提供一个易于使用的网络编程接口。它基于Lua的简洁语法,使得开发者可以快速地创建网络应用程序,如Web服务器、客户端、代理等。 ...

    判断Socket是否断开的小代码

    #### Socket简介 Socket是应用层与传输层之间的一个抽象层,用于实现网络应用程序之间的通信。它可以理解为两个应用程序之间的一个端到端的连接。在TCP/IP协议族中,Socket通常被用来实现客户端与服务器之间的通信...

    WPF Socket 服务协议

    2. **Socket简介**: Socket是操作系统提供的接口,它允许应用程序实现进程间的网络通信。Socket可以基于TCP(面向连接,可靠传输)或者UDP(无连接,尽力而为传输)。 **二、WPF中集成Socket** 在WPF项目中,我们...

    socket_socket_

    **一、Socket简介** Socket,又称套接字,是网络通信的基本单元,它提供了进程间的通信能力,允许不同机器上的程序通过网络进行交互。Socket分为两种类型:流式套接字(Stream Sockets, TCP)和数据报套接字...

    SuperSocket

    SuperSocket简介 SuperSocket旨在简化套接字服务器的开发流程,提供了一种面向对象的模型,允许开发者专注于业务逻辑,而不是底层的网络通信细节。它支持自定义协议,可以轻松处理多种网络协议,如HTTP、FTP、TCP...

    SuperSocket通讯.rar

    一、SuperSocket简介 SuperSocket设计初衷是为了简化基于TCP/IP协议的网络通信开发,它提供了一套完整的解决方案,包括服务端和客户端的实现,使得开发者可以专注于业务逻辑,而无需关心底层通信细节。SuperSocket...

    ios手机socket服务端源码

    **Socket简介** Socket,又称套接字,是网络编程的基本接口,它为应用程序提供了网络通信的能力。Socket允许两个或多个设备通过TCP/IP协议进行数据传输。在iOS开发中,我们通常使用C语言风格的低级API(如CFStream)...

    opnet中Socket接口模块开发文档.doc

    1. **Socket简介** - Socket起源于UNIX系统的4BSD版本,用于进程间的通信。在网络环境中,Socket成为了TCP/IP协议族的一部分,为开发网络应用程序提供了便利。 - Socket是一个通信端点,它包含了IP地址和端口号,...

    SuperSocket1.6版本文档(中文).zip

    1. **SuperSocket简介**:文档首先会介绍SuperSocket的基本概念,包括其设计理念、核心功能和优点,例如它的轻量级特性、强大的插件机制以及对多线程和异步操作的支持。 2. **安装与配置**:详细步骤指导如何在C#...

Global site tag (gtag.js) - Google Analytics