Java网络编程之简单的服务端客户端应用实例

本文实例讲述了Java网络编程之简单的服务端客户端应用。分享给大家供大家参考。具体如下:

在Java中,我们使用java.net.Socket及其相关类来完成有关网络的相关功能。Socket类非常简单易用,因为Java技术隐藏了建立网络连接和通过连接发送数据的复杂过程。下面所说的内容只适用于TCP协议。

一、连接到服务器

我们可以使用Socket类的构造函数来打开一个套接字,如

Socket sk = new Socket("210.0.235.14",13);

其中,210.0.235.14是一个点分十进制的String对象,表示目的主机的IP地址(或主机名), 13表示指定连接目标主机的13端口。这里的210.0.235.14是位于香港的一个授时服务器,授时服务器默认的端口一般都为13.
注意,在成功连接到服务器之前,程序会阻塞。
接下来可以使用Socket类的getInputStream()方法来得到一个InputStream对象,通过这个对象就可以获取到目标主机给我们发过来的信息:

InputStream inStream = sk.getInputStream();

同理,要向目标主机发送数据,则可以调用getOutputStream()方法来获取一个输出流对象。
下面的例子功能是连接授时服务器,并将返回的信息打印到标准输出中:

try
{
Socket sk = new Socket("210.0.235.14",13);
sk.setSoTimeout(3000);
  InputStream inStream = sk.getInputStream();
  //得到输入流对象
  Scanner sc = new Scanner(inStream);
  //将数据打印到控制台
  while(sc.hasNextLine())
  {
 String str = sc.nextLine();
 System.out.println("Output : " + str);
  }
  sk.close();
}
catch(SocketTimeoutException e) //超时异常
{
  System.out.println("Time Out!");
}
catch(Exception e)
{
  e.printStackTrace();
}

代码中setSoTimeout()方法可以设置超时时间,即如果超过了设定时间还没有完成读写操作,则会抛出SocketTimeoutException,可以通过捕获这个异常来关闭连接。
另外还有一个超时问题是必须要解决的,就是这个Socket类的构造函数

new Socket(host,port);

会一直无限地阻塞下去,直到成功建立了到目标主机的连接为止。这当然不是我们所希望的。我们可以通过如下调用方式解决此问题:

Socket sk = new Socker();
sk.connect(new InetSocketAddress(host,port),2000);
//设置超时时间为2秒

二、获取主机地址

InetAddress类的静态方法getByName(hostname)可以返回代表了某个主机地址的InetAddress对象,这个对象封闭了一个4字节的序列,即主机的IP地址。然后再调用getHostAddress()方法返回一个表示IP地址的String对象.

一些访问量大的主机名通常会对应着多个IP地址以实现负载均衡。我们可以调用getAllByName()方法来获得所有主机地址,该方法返回一个InetAddress对象的数组。

下面是一个简单的小程序,实现的功能是,如果不在命令行中设置参数,就打印出本地的IP地址,如果指定了主机名,则打印出该主机所有的IP地址:

package cls;
import java.net.*;
public class ShowIP
{
  public static void main(String[] args)
  {
    try
    {
      if(args.length > 0)
      {
        String hostName = args[0]; //主机名
        InetAddress[] addr = InetAddress.getAllByName(hostName);
        //得到该主机的所有地址
        //打印输出至控制台
        for(InetAddress address : addr)
        {
          System.out.println(address.getHostAddress());
        }
      }
      else
      {
        System.out.println(InetAddress.getLocalHost().getHostAddress());
      }
    }
    catch(Exception e)
    {
      e.printStackTrace();
    }
  }
}

三、服务器端程序

服务器端应用程序使用ServerSocket类来创建套接字,并钭其绑定至本地端口中,如

ServerSocket sock = new ServerSocker(8000);

sock.accept()方法让程序不停地等待连接,该方法只有当有客户端连接时才会返回一个代表了新连接的Socket对象,即该方法会发生阻塞。
这里一般要为每个连接新开启一个线程为其服务。
下面是一个完整的例子,服务端在8400端口处等待连接,每当连接到来时,新开一个线程为其服务,并将连接信息写入的日志文件中:

package cls;
import java.io.*;
import java.net.*;
import java.util.*;
public class ServerDemo
{
  /**
   * @param args
   */
  public static void main(String[] args)
  {
    try
    {
      //ServerSocket servSocket = new ServerSocket(8000);
      ServerSocket servSocket = new ServerSocket(8400);
      int amount = 0;
      while(true)
      {
        Socket client = servSocket.accept();
        ++amount;
        Date time = new Date();
        String prompt = time.toString() + ": 第" + amount + "个用户 " + client.getInetAddress().getHostAddress() + " 已连接\n";
        System.out.print(prompt); //在控制台输出信息
        ServerDemo.writeLog(prompt); //写入到文件中
        //start a new Thread
        Thread th = new Thread(new ServThread(client,amount));
        th.start();
      }
    }
    catch(Exception e)
    {
      e.printStackTrace();
    }
  }
  //写入日志文件
  public static void writeLog(String str)
  {
    File logFile = new File("server-log.txt");
    try
    {
      FileWriter out = new FileWriter(logFile,true);
      out.append(str);
      out.close();
    }
    catch(Exception e)
    {
      e.printStackTrace();
    }
  }
}
/*
 * 服务线程类
 */
class ServThread implements Runnable
{
  private Socket client;
  private int ix;
  public ServThread(Socket soc,int ix)
  {
    client = soc;
    this.ix = ix;
  }
  public void run()
  {
    try
    {
      InputStream inStream = client.getInputStream();
      OutputStream outStream = client.getOutputStream();
      Scanner recv = new Scanner(inStream);
      PrintWriter send = new PrintWriter(outStream,true);
      send.println("欢迎~随便聊几句吧![输入'bye'关闭联接]");
      while(recv.hasNextLine())
      {
        String str = recv.nextLine();
        if(str.equals("bye"))
        {
          send.println("See you later ~ ^-^");
          break;
        }
        send.println("这是个测试程序,现在还没有什么功能哦");
      }
      Date time = new Date();
      String prompt = time.toString() + ": 第" + ix + "个用户 " + client.getInetAddress().getHostAddress() + " 已断开连接\n";
      System.out.print(prompt);
      ServerDemo.writeLog(prompt); //写入到文件中
      client.close();
    }
    catch(Exception e)
    {
      e.printStackTrace();
    }
  }
}

这个程序已经被放到了服务器上,大家可以使用telnet youthol.tk 8400 命令来体验一下这个程序的运行结果

希望本文所述对大家的java程序设计有所帮助。

(0)

相关推荐

  • Java网络编程基础篇之单向通信 原创

    在网络编程中如果只要求客户机向服务器发送消息,不要求服务器向客户机发送消息,称为单线通信.客户机套接字和服务器套接字链接成功后,可估计通过输出流发送数据,服务器则通过输入流接受数据,下面是简单的单向通信的例子. 实例1:本实例是一个TCP服务器端程序,在 getserver() 方法中建立服务器套接字,调用getClienMessage()方法获取客户端信息.代码如下: import java.io.BufferedReader; import java.io.IOException; impo

  • java网络编程基础知识介绍

    网络基础知识 1.OSI分层模型和TCP/IP分层模型的对应关系 这里对于7层模型不展开来讲,只选择跟这次系列主题相关的知识点介绍. 2.七层模型与协议的对应关系 网络层 ------------ IP(网络之间的互联协议) 传输层 ------------ TCP(传输控制协议).UDP(用户数据报协议) 应用层 ------------ Telnet(Internet远程登录服务的标准协议和主要方式).FTP(文本传输协议).HTTP(超文本传送协议) 3.IP地址和端口号 1.ip地址用于

  • Java套接字(Socket)网络编程入门

    网络应用模式主要有: 主机/终端模式:集中计算,集中管理: 客户机/服务器(Client/Server,简称C/S)模式:分布计算,分布管理: 浏览器/服务器模式:利用Internet跨平台. www(万维网)就是建立在客户机/服务器模式上,以HTML语言和HTTP协议为基础,能够提供各种Internet服务的信息浏览系统.网络信息放在主机的不同位置,www服务器利用超文本链路链接各项信息.www客户机(浏览器Brower)负责与服务器建立联系,向服务器发送请求,处理HTML超媒体,提供图形用户

  • Java网络编程基础教程之Socket入门实例

    当我们想要在Java中使用TCP/IP通过网络连接到服务器时,就需要创建java.net.Socket对象并连接到服务器.假如希望使用Java NIO,也可以创建Java NIO中的SocketChannel对象. 创建Socket 下面的示例代码是连接到IP地址为78.64.84.171服务器上的80端口,这台服务器就是我们的Web服务器(www.jb51.net),而80端口就是Web服务端口. 复制代码 代码如下: Socket socket = new Socket("78.46.84.

  • 简单讲解Java的Socket网络编程的多播与广播实现

    在Java中,我们可以有很多种方法来发送和接收数据.有的方法比较靠近底层,有些问题就需要程序员自己去解决,而有些方法抽象层次比较高,很方便地就可以拿来使用.这些处理数据的方法根据抽象层次由低到高分别有: 1.手动编码:使用位运算逐个自己编码和解析. 2.利用流来自动编码:组合使用OutputStream和ByteArrayOutputStream. 3.序列化:将数据放入一个数据对象中,直接将这个对象序列化后发送. 使用起来很方便,但要注意效率的损失,以及接收方也要使用Java. 4.RMI:将

  • Java的Socket网络编程基础知识入门教程

    一.TCP/IP简介 TCP/IP协议族是互联网使用的协议,也可以用在独立的专用网络中. TCP/IP协议族包括了IP协议.TCP协议和UDP协议. IP协议使用IP地址来分发报文,但它是尽力而为的服务,报文可能丢失.乱序或者 重复发送.TCP和UDP协议在IP协议基础上增加了端口号,从而在两台主机的应用 程序间建立起透明的连接. 不同的是,TCP协议会对IP层的错误进行修复,它通过握手消息在主机间建立连接, 之后通过在消息中加入序列号来恢复消息中的错误.而UDP只是简单地扩展了IP协议, 使它

  • 简单介绍Java网络编程中的HTTP请求

    HTTP请求的细节--请求行   请求行中的GET称之为请求方式,请求方式有:POST.GET.HEAD.OPTIONS.DELETE.TRACE.PUT,常用的有: GET. POST 用户如果没有设置,默认情况下浏览器向服务器发送的都是get请求,例如在浏览器直接输地址访问,点超链接访问等都是get,用户如想把请求方式改为post,可通过更改表单的提交方式实现. 不管POST或GET,都用于向服务器请求某个WEB资源,这两种方式的区别主要表现在数据传递上:如果请求方式为GET方式,则可以在请

  • Java 网络编程socket编程等详解

    网络编程是指编写运行在多个设备(计算机)的程序,这些设备都通过网络连接起来. java.net包中J2SE的API包含有类和接口,它们提供低层次的通信细节.你可以直接使用这些类和接口,来专注于解决问题,而不用关注通信细节. java.net包中提供了两种常见的网络协议的支持: TCP: TCP是传输控制协议的缩写,它保障了两个应用程序之间的可靠通信.通常用于互联网协议,被称TCP / IP. UDP:UDP是用户数据报协议的缩写,一个无连接的协议.提供了应用程序之间要发送的数据的数据包. 本教程

  • Java网络编程之简单的服务端客户端应用实例

    本文实例讲述了Java网络编程之简单的服务端客户端应用.分享给大家供大家参考.具体如下: 在Java中,我们使用java.net.Socket及其相关类来完成有关网络的相关功能.Socket类非常简单易用,因为Java技术隐藏了建立网络连接和通过连接发送数据的复杂过程.下面所说的内容只适用于TCP协议. 一.连接到服务器 我们可以使用Socket类的构造函数来打开一个套接字,如 Socket sk = new Socket("210.0.235.14",13); 其中,210.0.23

  • Java网络编程实例——简单模拟在线聊天

    1.前提知识 需要知道简单的IO流操作,以及简单的UDP发送数据包的原理. 需要用到的类:DatagramSocket.DatagramPacket UDP数据包基于DatagramSocket发送和接收,DatagramPacket用于封装数据包 看下案例: 客户端发送消息: 正常情况下从控制台读信息,封装到DatagramPacket之中,再由DatagramSocket的send方法发出 读取到bye的时候退出聊天 public class UdpOnlineClient { public

  • Java Socket编程实现简单的问候服务

    本文实例讲解了Java Socket编程实现简单的问候服务的详细代码,供大家参考,具体内容如下 服务器端: 实现一个最简单的Hello服务,打印输出客户端IP地址到控制台,对任何连接的客户端都会发送一串字符(Hello, Java Socket)然后关闭与客户端连接.等待下一个客户端的连接请求到来. 客户端: 实现一个最简单的Socket连接到Hello服务器端,接受服务器端发送过来的字节数据打印并输出内容到控制台. 关键技巧: 由于JAVA中提供非常多的输入与输出流API,导致很多初学者接触J

  • Java网络编程实现的简单端口扫描器示例

    本文实例讲述了Java网络编程实现的简单端口扫描器.分享给大家供大家参考,具体如下: 在计算机网络的学习中,不由得觉得这门课的零碎知识点异常之多,同时因为学习的课本是老外的教材--自顶向下方法,因此学习起来不免觉得吃力,但是从老外的教材里更能从一定高度理解计算机网络的知识体系,也是乐在其中,同时做英语的习题感觉也很有趣味,从各方面来说可以说是获益良多,认识了很多专业词汇.节课之后,便想做一个简单的端口扫描器,用的语言是java,因为实现界面很简单,同时也有封装好的Socket类可以使用,主要思路

  • 详解Java网络编程

    一.网络编程 1.1.概述 1.计算机网络是通过传输介质.通信设施和网络通信协议,把分散在不同地点的计算机设备互连起来,实现资源共享和数据传输的系统.网络编程就就是编写程序使联网的两个(或多个)设备(例如计算机)之间进行数据传输.Java语言对网络编程提供了良好的支持,通过其提供的接口我们可以很方便地进行网络编程. 2.Java是 Internet 上的语言,它从语言级上提供了对网络应用程 序的支持,程序员能够很容易开发常见的网络应用程序. 3.Java提供的网络类库,可以实现无痛的网络连接,联

  • Java网络编程TCP实现文件上传功能

    本文实例为大家分享了Java网络编程TCP实现文件上传的具体代码,供大家参考,具体内容如下 上一篇博客,用网络编程TCP 实现聊天,这次实现文件上传. 客户端: package com.kuang.lesson02; import java.io.*; import java.net.InetAddress; import java.net.Socket; //客户端 public class TcpClientDemo2 { public static void main(String[] a

  • 老生常谈Java网络编程TCP通信(必看篇)

    Socket简介: Socket称为"套接字",描述IP地址和端口.在Internet上的主机一般运行多个服务软件,同时提供几种服务,每种服务都打开一个Socket,并绑定在一个端口上,不同的端口对应于不同的服务.Socket和ServerSocket类位于java.net包中.ServerSocket用于服务端,Socket是建立网络连接时使用的.连接成功时,应用程序两端都会产生一个Socket实例,通过操作这个实例完成所需会话. Socket常用方法: -int getLocalP

  • PHP编程实现的TCP服务端和客户端功能示例

    本文实例讲述了PHP编程实现的TCP服务端和客户端功能.分享给大家供大家参考,具体如下: 1.修改php.ini,打开extension=php_sockets.dll 2.服务端程序SocketServer.php <?php //确保在连接客户端时不会超时 set_time_limit(0); //设置IP和端口号 $address = "127.0.0.1"; $port = 3046; /** * 创建一个SOCKET * AF_INET=是ipv4 如果用ipv6,则参

  • 基于Java网络编程和多线程的多对多聊天系统

    1.前言 程序实现基于星型结构(服务器接收来自各个客户端发送的信息,然后将信息传递给其他客户端界面并在其他客户端界面显示发送的信息) 2.类图 3.代码 客户端代码: package netProgram; import java.io.IOException; import java.net.Socket; import java.net.SocketAddress; public class Client implements ScreenInputInterface{ private So

随机推荐