欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2024-03-31 19:51:16
本文实例讲解了java socket编程实现简单的问候服务的详细代码,供大家参考,具体内容如下 服务器端: 实现一个最简单的hello服务,打印输出客户端ip地址到控制...

本文实例讲解了java socket编程实现简单的问候服务的详细代码,供大家参考,具体内容如下

服务器端:

实现一个最简单的hello服务,打印输出客户端ip地址到控制台,对任何连接的客户端都会发送一串字符(hello, java socket)然后关闭与客户端连接。等待下一个客户端的连接请求到来。

客户端:

实现一个最简单的socket连接到hello服务器端,接受服务器端发送过来的字节数据打印并输出内容到控制台。

关键技巧:

由于java中提供非常多的输入与输出流api,导致很多初学者接触java socket编程时,由于对网络字节通信的本质缺乏了解,直接一个readline()去接受socket字节流。但是由于发送一方并没有发送/r/n导致一直无法读到数据,这个是最常见的一个错误。另外一些常见的错误包括没有初始化接受缓冲区导致字符乱码,没有按照读入接受到字节数重新组装,导致接受到的数据异常。所以代码演示了什么叫按字节发送与按字节接受,这个是网络编程中非常重要的概念与原则。让那些输入流println()方法与输出流readline()方法见鬼去吧,不是不好用,而是我建议你不要用,因为那些会妨碍你的网络编程本质的认识与理解。另外我要特别说明一下:有时候flush()真的不是必须的除非你使用了带有缓冲的输入与输出流来读写字节。

服务器端代码:

package com.gloomyfish.socket.tutorial.two; 
 
import java.io.dataoutputstream; 
import java.io.ioexception; 
import java.net.serversocket; 
import java.net.socket; 
 
public class helloservice extends thread { 
  private serversocket serversocket; 
  public helloservice(int port) throws ioexception { 
    serversocket = new serversocket(port); 
  } 
 
  public void run() 
  { 
    try { 
      while(true) 
      { 
        system.out.println("waiting for client on port " + serversocket.getlocalport()); 
        socket client = serversocket.accept(); // blocked & waiting for income socket 
        system.out.println("just connected to " + client.getremotesocketaddress()); 
        dataoutputstream dos = new dataoutputstream(client.getoutputstream()); 
        byte[] hello = "hello, java socket".getbytes(); 
        dos.write(hello, 0, hello.length); 
        dos.close(); 
        client.close(); 
      } 
    } catch(exception e) { 
      e.printstacktrace(); 
    } 
  } 
   
  public static void main(string[] args) { 
    try { 
      helloservice service = new helloservice(9999); 
      service.start(); 
    } catch (ioexception e) { 
      e.printstacktrace(); 
    } 
  } 
} 

服务器在端口9999监听并等待连接,使用java thread来实现服务器端启动。
客户端代码如下:

package com.gloomyfish.socket.tutorial.two; 
 
import java.io.datainputstream; 
import java.io.ioexception; 
import java.net.inetsocketaddress; 
import java.net.socket; 
import java.net.socketaddress; 
 
public class helloclient { 
  private int clientnumber; 
  private socketaddress address; 
  public helloclient(int clientnum) { 
    clientnumber = clientnum; 
  } 
   
  public void setupclients(string serverhostname, int port) throws ioexception { 
    address = new inetsocketaddress(serverhostname, port); 
    for(int i=0; i<clientnumber; i++) { 
      system.out.println(); 
      system.out.println("start client no. " + (i+1)); 
      socket socket = new socket(); 
      socket.connect(address); 
      datainputstream bufferedreader = new datainputstream(socket.getinputstream()); 
      byte[] cbuff = new byte[256]; 
      char[] charbuff = new char[256]; 
      int size = 0; 
      while( (size = bufferedreader.read(cbuff))> 0) { 
        convertbytetochar(cbuff, charbuff, size); 
        system.out.println(charbuff); 
      } 
      bufferedreader.close(); 
      socket.close(); 
    } 
  } 
   
  private void convertbytetochar(byte[] cbuff, char[] charbuff, int size) { 
    for(int i=0; i<charbuff.length; i++) { 
      if(i < size) { 
        charbuff[i] = (char)cbuff[i]; 
      } else { 
        charbuff[i] = ' '; 
      } 
    } 
     
  } 
 
  public static void main(string[] args) { 
    try { 
      helloclient client = new helloclient(10); 
      client.setupclients("localhost", 9999); 
    } catch (ioexception e) { 
      e.printstacktrace(); 
    } 
  } 
} 

启动10个客户端去连接服务器端,接受到服务器端问候以后客户端关闭连接。
特别提示:一定要初始化缓冲区charbuff
程序运行结果:

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

以上就是本文的全部内容,希望对大家的学习有所帮助。