Java网络编程之简单的服务端客户端应用实例_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程序设计有所帮助。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索java
, 网络编程
, 客户端
服务端
数控铣床简单编程实例、vb6.0简单编程实例、c语言简单编程实例、plc简单编程实例、matlab简单编程实例,以便于您获取更多的相关知识。

时间: 2024-08-02 17:57:42

Java网络编程之简单的服务端客户端应用实例_java的相关文章

AgileEAS.NET SOA 中间件平台.Net Socket通信框架-简单例子-实现简单的服务端客户端消息应答

一.AgileEAS.NET SOA中间件Socket/Tcp框架介绍      在文章AgileEAS.NET SOA 中间件平台Socket/Tcp通信框架介绍一文之中我们对AgileEAS.NET SOA中间Socket/Tcp框架进行了总体的介绍,我们知道 AgileEAS.NET SOA中间件Socket/Tcp框架是一套Socket通信的消息中间件: 二.简单例子-实现简单的服务器客户段消息应答      我们接下来实现一个简单的例子,例子的场景非常的简单,客户端向服务端发送一个请求

java网络编程-两台电脑IP地址一样!同一个无线

问题描述 两台电脑IP地址一样!同一个无线 今天学习java网络编程 先用TCP 客户端服务端实现两台电脑通讯,成功了,当时一台是192.168.1.104,一台是105.然后我想试下udp,结果失败了,查了下ip,两台电脑都成104了,这是怎么回事啊 解决方案 IP一样怎么能通讯呢 解决方案二: 那你把两台计算机的IP地址设成不一样的再试不就好了么 解决方案三: 你改回105就可以了啊,获得你的端口号改变下 解决方案四: 估计是得修改一下IP了,可能是你那里没有写对吧

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

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

Java网络编程(一)

关于JAVA网络编程的技术非常繁多,如:SOCKET.RMI.EJB.WEBSERVICE.MQ.中间数据等等方法,但是万变都是源于基础中通信原理,有些是轻量级的.有重量级的:有实时调用.有异步调用:这么多的技术可以说什么都可以用,关键在什么场合用什么最适合你,这些技术主要用于多个子系统之间相互通信的方法,如一个大型的软件应用分多个子系统,它们可能由不同的厂商来完成,这些子系统最终需要整合为一个系统,那么整合的基础就是交互,要么是通过数据交互,要么是通过接口调用,要么通过中间数据等等.本文从最基

JAVA网络编程之模拟表单提交

这一篇博客是对上一篇<JAVA网络编程之获取网络资源>的扩充,这一篇将使用HttpURLConnection来模拟一个表单的提交.在B/S架构的系统中,请求时通过浏览器与服务端进行交互的,提交请求参数时使用form表单进行提交,但是有很多时候,我们需要在程序中直接调用HTTP接口,同时需要传递一些参数,那么这个时候我们就可以通过使用HttpURLConnection来模拟表单的提交过程. 首先,我们可以对请求进行封装 import java.util.ArrayList; import jav

Java网络编程从入门到精通

Hibernate从入门到精通(十一)多对多双向关联映射 Hibernate从入门到精通(十)多对多单向关联映射 Hibernate从入门到精通(九)一对多双向关联映射 Hibernate从入门到精通(八)一对多单向关联映射 Hibernate从入门到精通(七)多对一单向关联映射 Hibernate从入门到精通(六)一对一双向关联映射 Hibernate从入门到精通(五)一对一单向关联映射 Hibernate从入门到精通(四)基本映射 Hibernate从入门到精通(三)Hibernate配置文

遇到一个棘手的问题,需要java网络编程大神帮忙解答下~

问题描述 遇到一个棘手的问题,需要java网络编程大神帮忙解答下~ 问题是这样的: 我把MINA核心的非阻塞轮训方式的的代码用JDK7的AIO异步IO替换了,现在已经包装完成,测试的时候遇到两个问题: 测试的是这样的,服务端启动后20秒后释放所有资源关闭,客户端启动15秒后释放所有资源关闭,大部分情况下测试都是正常的,但是偶尔会出现客户端服务端都关闭后,再次启动服务的过程后,要么服务端抛出AsynchronousCloseException,客户端抛出远程主机强迫关闭一个现有连接:要么是客户端的

java-初学Java网络编程socket,为何我的服务器打不开?

问题描述 初学Java网络编程socket,为何我的服务器打不开? 初学Java网络编程socket,写了个服务器,但是打不开,求指导.代码如下 import java.io.*; import java.net.*; import java.util.*; import javafx.application.Application; import javafx.application.Platform; import javafx.scene.Scene; import javafx.scen

服务器-关于java网络编程中获取输入流中数据的问题?

问题描述 关于java网络编程中获取输入流中数据的问题? //服务器端接收消息的类.定制端口号为8888 serviceSocket = new ServerSocket(10000); //获取socket.这个方法是阻塞式的 socket = serviceSocket.accept(); inputStream = socket.getInputStream(); byte buf[] = new byte[1024]; int len = 0; len =inputStream.read