`
kree
  • 浏览: 128837 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

一个Java多线程阻塞模式通信的例子

阅读更多

程序分Server和Client

服务器端打开侦听的端口,一有客户端连接就创建两个新的线程来负责这个连接

一个负责客户端发送的信息(ClientMsgCollectThread 类),

另一个负责通过该Socket发送数据(ServerMsgSendThread )

Server.java代码如下:

/*
 * 创建日期 2009-3-7
 *
 * TODO 要更改此生成的文件的模板,请转至
 * 窗口 - 首选项 - Java - 代码样式 - 代码模板
 */
package faue.MutiUser;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * 服务器端
 * 
 * @author Faue
 */
public class Server extends ServerSocket {

 private static final int SERVER_PORT = 10000;

 /**
  * 构造方法,用于实现连接的监听
  * 
  * @throws IOException
  */
 public Server() throws IOException {
  super(SERVER_PORT);

  try {
   while (true) {
    Socket socket = super.accept();

    new Thread(new ClientMsgCollectThread(socket), "getAndShow"
      + socket.getPort()).start();
    new Thread(new ServerMsgSendThread(socket), "send"
      + socket.getPort()).start();

   }
  } catch (IOException e) {
   e.printStackTrace();
  }

 }

 public static void main(String[] args) throws IOException {
  new Server();
 }

 /**
  * 该类用于创建接收客户端发来的信息并显示的线程
  * 
  * @author Faue
  * @version 1.0.0
  */
 class ClientMsgCollectThread implements Runnable {

  private Socket client;

  private BufferedReader in;

  private StringBuffer inputStringBuffer = new StringBuffer("Hello");

  /**
   * 得到Socket的输入流
   * 
   * @param s
   * @throws IOException
   */
  public ClientMsgCollectThread(Socket s) throws IOException {
   client = s;

   in = new BufferedReader(new InputStreamReader(client
     .getInputStream(), "GBK"));
  }

  public void run() {
   try {

    while (!client.isClosed()) {
     inputStringBuffer.delete(0, inputStringBuffer.length());
     inputStringBuffer.append(in.readLine());

     System.out.println(getMsg(inputStringBuffer.toString()));
    }
   } catch (IOException e) {
    //e.printStackTrace();
    System.out.println(client.toString() + " is closed!");

   }
  }

  /**
   * 构造显示的字符串
   * 
   * @param line
   * @return
   */
  private String getMsg(String line) {
   return client.toString() + " says:" + line;
  }

 }

 /**
  * 该类用于创建发送数据的线程
  * 
  * @author Faue
  * @version 1.0.0
  */
 class ServerMsgSendThread implements Runnable {

  private Socket client;

  private PrintWriter out;

  private BufferedReader keyboardInput;

  private StringBuffer outputStringBuffer = new StringBuffer("Hello");

  /**
   * 得到键盘的输入流
   * 
   * @param s
   * @throws IOException
   */
  public ServerMsgSendThread(Socket s) throws IOException {
   client = s;

   out = new PrintWriter(client.getOutputStream(), true);
   keyboardInput = new BufferedReader(new InputStreamReader(System.in));

  }

  public void run() {
   try {

    while (!client.isClosed()) {
     outputStringBuffer.delete(0, outputStringBuffer.length());
     outputStringBuffer.append(keyboardInput.readLine());

     out.println(outputStringBuffer.toString());
    }
   } catch (IOException e) {
    //e.printStackTrace();
    System.out.println(client.toString() + " is closed!");

   }
  }

 }

}

 客户端:

实现基于IP地址的连接,连接后也创建两个线程来实现信息的发送和接收

 

/*
 * 创建日期 2009-3-7
 * 
 */
package faue.MutiUser;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;

/**
 * 客户端
 * 
 * @author Faue
 */
public class Client {

 private Socket mySocket;

 /**
  * 创建线程的构造方法
  * 
  * @param IP
  * @throws IOException
  */
 public Client(String IP) throws IOException {

  try {
   mySocket = new Socket(IP, 10000);
   new Thread(new ServerMsgCollectThread(mySocket), "getAndShow"
     + mySocket.getPort()).start();
   new Thread(new ClientMsgSendThread(mySocket), "send"
     + mySocket.getPort()).start();

  } catch (IOException e) {
   //e.printStackTrace();
   System.out.println("Server.IP:" + IP
     + " port:10000 can not be Connected");
  }
 }

 public static void main(String[] args) throws IOException {
  try {
   new Client(args[0]);
  } catch (Exception e) {
   System.out.println("输入的IP地址错误");
  }
 }

 /**
  * 该类用于创建接收服务端发来的信息并显示的线程
  * 
  * @author Faue
  * @version 1.0.0
  */
 class ServerMsgCollectThread implements Runnable {

  private Socket client;

  private BufferedReader in;

  private StringBuffer inputStringBuffer = new StringBuffer("Hello");

  /**
   * 得到Socket的输入流
   * 
   * @param s
   * @throws IOException
   */
  public ServerMsgCollectThread(Socket s) throws IOException {
   client = s;

   in = new BufferedReader(new InputStreamReader(client
     .getInputStream(), "GBK"));
  }

  public void run() {
   try {

    while (!client.isClosed()) {
     inputStringBuffer.delete(0, inputStringBuffer.length());
     inputStringBuffer.append(in.readLine());
     System.out.println(getMsg(inputStringBuffer.toString()));
    }
   } catch (IOException e) {
    //e.printStackTrace();
    System.out.println(client.toString() + " is closed!");
    System.exit(0);
   }
  }

  /**
   * 构造输入字符串
   * 
   * @param line
   * @return
   */
  private String getMsg(String line) {
   return client.toString() + " says:" + line;
  }

 }

 /**
  * 该类用于创建发送数据的线程
  * 
  * @author Faue
  * @version 1.0.0
  */
 class ClientMsgSendThread implements Runnable {

  private Socket client;

  private PrintWriter out;

  private BufferedReader keyboardInput;

  private StringBuffer outputStringBuffer = new StringBuffer("Hello");

  /**
   * 得到键盘的输入流
   * 
   * @param s
   * @throws IOException
   */
  public ClientMsgSendThread(Socket s) throws IOException {
   client = s;

   out = new PrintWriter(client.getOutputStream(), true);
   keyboardInput = new BufferedReader(new InputStreamReader(System.in));

  }

  public void run() {
   try {

    while (!client.isClosed()) {
     outputStringBuffer.delete(0, outputStringBuffer.length());
     outputStringBuffer.append(keyboardInput.readLine());

     out.println(outputStringBuffer.toString());
    }
    out.println("--- See you, bye! ---");
   } catch (IOException e) {
    //e.printStackTrace();
    System.out.println(client.toString() + " is closed!");
    System.exit(0);
   }
  }

 }

} 

 

此文主要用来与非阻塞通信作比较

分享到:
评论

相关推荐

    java多线程经典案例

    本案例将深入探讨Java多线程中的关键知识点,包括线程同步、线程通信和线程阻塞。 线程同步是为了防止多个线程同时访问共享资源,导致数据不一致。Java提供了多种同步机制,如synchronized关键字、Lock接口...

    java多线程经典例子

    在Java多线程编程中,理解如何创建和...总的来说,这个例子展示了Java多线程的基本操作,包括创建、启动、管理和通信。理解和掌握这些概念对于进行并发编程是至关重要的,可以帮助开发者构建高效、稳定的多线程应用。

    java多线程设计模式

    ### Java多线程设计模式详解 #### 一、Java多线程基础 Java语言自诞生以来,便内置了对多线程的支持。多线程可以让应用程序在同一时间处理多个任务,提高程序的执行效率和响应速度。Java中创建线程有两种基本方式...

    java多线程编程-详细炒作例子

    ### Java多线程编程详解与实战案例 #### 理解多线程概念与Java内存模型 多线程,作为现代编程中的一项关键技术,允许在单一应用程序中并发执行多个指令流,每个这样的指令流被称为一个线程。在Java中,线程被视为...

    JAVA多线程的一个带UI界面的例子

    在Java编程中,多线程是一项关键特性,...总之,这个"JAVA多线程的一个带UI界面的例子"涵盖了Java多线程编程和GUI设计的核心概念,通过实际的代码示例,有助于开发者深入理解如何在实际应用中正确、高效地使用多线程。

    JAVA单线程多线程

    多线程能够显著提高程序的并发性和效率,尤其是在处理I/O操作、网络通信等耗时操作时,可以避免阻塞主线程,从而提升整个系统的响应速度。 多线程的优点包括: 1. **提高系统利用率**:通过多线程可以充分利用多核...

    Java多线程实现异步调用实例

    总之,Java多线程和异步调用是构建高效、响应迅速的应用程序的关键技术。通过合理利用这些工具和机制,开发者可以编写出能够充分利用多核处理器优势的代码,从而提高软件性能。在实际应用中,理解并熟练掌握这些概念...

    JAVA设计模式与JAVA多线程设计模式详解

    Java平台提供了丰富的多线程支持,包括线程的创建、同步、通信等。常见的多线程设计模式有生产者消费者模式、守护线程模式、线程池模式和读写锁模式。生产者消费者模式利用阻塞队列实现数据的生产和消费,提高了系统...

    java多线程示例

    在Java编程语言中,多线程是核心特性之一,它允许程序同时执行多个任务,从而提高了应用程序的效率和响应...文档“java多线程实例.docx”可能包含具体的示例代码和详细解释,建议参考学习,以加深对Java多线程的理解。

    Java的多线程-线程间的通信.doc

    在Java多线程编程中,线程间的通信是非常重要的概念,用于协调多个并发执行的任务。线程的状态转换是理解线程通信的基础,主要包括四个状态:新(New)、可执行(Runnable)、死亡(Dead)和停滞(Blocked)。新状态...

    java中线程的应用例子

    5. **线程优先级**:每个线程都有一个优先级,Java中从1(`MIN_PRIORITY`)到10(`MAX_PRIORITY`),默认优先级是5(`NORM_PRIORITY`)。但优先级并不保证线程的执行顺序,它只是影响调度策略。 6. **线程池**:`...

    Java多线程实例代码

    Java多线程是Java编程中的重要概念,它允许程序同时执行多个任务,提高了程序的效率和响应性。在Java中,实现多线程有两种主要方式:通过继承`Thread`类和实现`Runnable`接口。 1. 继承Thread类: 当你需要创建一...

    java多线程经典讲义

    Java多线程是Java编程中一个非常重要的领域,它允许程序在同一时间执行多个任务,从而提高了效率和资源利用率。在Java中,线程是进程中的一个执行单元,每个进程至少包含一个线程,通常Java虚拟机(JVM)启动时会...

    java线程同步及通信

    Java线程同步与通信是多线程编程中的关键概念,用于解决并发访问共享资源时可能出现的数据不一致性和竞态条件问题。以下将详细介绍这两个主题,以及如何通过代码示例进行演示。 1. **线程同步**: 线程同步是确保...

    java 多线程 socket聊天程序

    Java多线程Socket聊天程序是基于Java编程语言实现的一个网络通信应用,主要涉及了Java的Socket编程和多线程技术。这两个核心概念在Java中占据了非常重要的地位,特别是在开发网络应用和服务端系统时。 首先,Java ...

    java 同步阻塞并唤醒指定线程

    总的来说,理解并熟练掌握Java中的多线程同步和阻塞机制对于编写高效且线程安全的代码至关重要。通过合理使用`synchronized`、`wait()`, `notify()`和`notifyAll()`,以及高级并发工具,开发者可以构建出复杂且可靠...

    java多线程设计模式.pdf

    Java 多线程设计模式是开发高效并发应用的关键技术之一。Java 语言提供了内置的多线程支持,允许开发者创建并管理多个执行线程。在Java中,有两种方式来创建线程: 1. **扩展Thread类**:创建一个新的类继承自...

    彻底明白Java的多线程-线程间的通信.doc

    Java的多线程是编程中的一个关键概念,特别是在并发处理和高性能应用中。本文将深入讲解如何在Java中实现多线程以及线程间的通信。 首先,我们要理解一个虚假的多线程示例。在例1中,创建了两个`TestThread`对象,...

    JAVA多线程编程(详细操作例子)(低分分享).doc

    Java多线程编程是Java开发中的重要组成部分,它允许程序同时执行多个...总的来说,Java多线程编程涉及到线程创建、同步、通信、状态转换等多个方面,理解并掌握这些概念和机制对于编写高效、安全的并发程序至关重要。

Global site tag (gtag.js) - Google Analytics