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

本文实例讲解了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
程序运行结果:

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

(0)

相关推荐

  • Java字符流与字节流区别与用法分析

    本文实例讲述了Java字符流与字节流区别与用法.分享给大家供大家参考,具体如下: 字节流与字符流主要的区别是他们的的处理方式 流分类: 1.Java的字节流 InputStream是所有字节输入流的祖先,而OutputStream是所有字节输出流的祖先. 2.Java的字符流 Reader是所有读取字符串输入流的祖先,而writer是所有输出字符串的祖先. InputStream,OutputStream,Reader,writer都是抽象类.所以不能直接new 字节流是最基本的,所有的Inpu

  • java使用Socket实现SMTP协议发送邮件

    本文实例为大家分享了java 利用Socket实现SMTP协议发送邮件的具体代码,供大家参考,具体内容如下 package mail; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.PrintWriter; impo

  • 深入解析Java编程中面向字节流的一些应用

    文件输入输出流 文件输入输出流 FileInputStream 和 FileOutputStream 负责完成对本地磁盘文件的顺序输入输出操作. [例]通过程序创建一个文件,从键盘输入字符,当遇到字符"#"时结束,在屏幕上显示该文件的所有内容 import java.io.*; class ep10_5{ public static void main(String args[]){ char ch; int data; try{ FileInputStream a=new FileI

  • Java socket字节流传输示例解析

    本文为大家分享了Java socket字节流传输示例,供大家参考,具体内容如下 服务端server端: package com.yuan.socket; import java.io.*; import java.net.ServerSocket; import java.net.Socket; /** * Created by YUAN on 2016-09-17. */ public class TalkServer4Byte { private ServerSocket server; p

  • java实现一个简单TCPSocket聊天室功能分享

    本文实例为大家分享了java实现TCPSocket聊天室功能的相关代码,供大家参考,具体内容如下 1.TCPserver.java import java.net.*; import java.io.*; import java.util.*; import java.util.concurrent.*; public class TCPserver{ private static final int SERVERPORT = 8888; private ServerSocket MyServe

  • Java编程中字节流与字符流IO操作示例

     IO流基本概念 IO流用来处理设备之间的数据传输 Java对数据的操作是通过流的方式 Java用于操作流的对象都是在IO包上 流按操作数据分为两种:字节流和字符流 流按流向分为:输入流,输出流. 字节流的抽象基类:InputStream,OutputStream 字符流的抽象基类:Reader,Writer 注:由这4个类派生出来的子类名称都是以其父类名作为子类名的后缀. 如:InputStream的子类:FileInputStream 如:Reader的子类FileReader 如创建一个F

  • java基于Socket做一个简单下载器

    本文实例为大家分享了java基于Socket制作下载器的过程,及相关代码,供大家参考,具体内容如下 1.首先要建立一个服务器用来处理信息并给客户端传输文件(电脑)  我是用电脑开了一个WIFI,手机连上后使用scoket传输的  SERVERIP要根据自己实际情况更改.端口也可以随便更改0~65535,尽量选大一点 import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.Buf

  • Java基于Socket实现HTTP下载客户端

    没有借助任何第三方库,完全基于JAVA Socket实现一个最小化的HTTP文件下载客户端.完整的演示如何通过Socket实现下载文件的HTTP请求(request header)发送如何从Socket中接受HTTP响应(Response header, Response body)报文并解析与保存文件内容.如何通过SwingWork实现UI刷新,实时显示下载进度. 首先看一下UI部分: [添加下载]按钮: 点击弹出URL输入框,用户Copy要下载文件URL到输入框以后,点击[OK]按钮即开始

  • 网页版在线聊天java Socket实现

    本文为大家分享了一个满足在线网页交流需求的实例,由于java Socket实现的网页版在线聊天功能,供大家参考,具体内容如下 实现步骤: 1.使用awt组件和socket实现简单的单客户端向服务端持续发送消息: 2.结合线程,实现多客户端连接服务端发送消息: 3.实现服务端转发客户端消息至所有客户端,同时在客户端显示: 4.把awt组件生成的窗口界面改成前端jsp或者html展示的界面,java socket实现的客户端改为前端技术实现. 这里首先实现第一步的简单功能,难点在于: 1.没有用过a

  • 详解Java中字符流与字节流的区别

    本文为大家分析了Java中字符流与字节流的区别,供大家参考,具体内容如下 1. 什么是流 Java中的流是对字节序列的抽象,我们可以想象有一个水管,只不过现在流动在水管中的不再是水,而是字节序列.和水流一样,Java中的流也具有一个"流动的方向",通常可以从中读入一个字节序列的对象被称为输入流:能够向其写入一个字节序列的对象被称为输出流. 2. 字节流 Java中的字节流处理的最基本单位为单个字节,它通常用来处理二进制数据.Java中最基本的两个字节流类是InputStream和Out

随机推荐