`
benx
  • 浏览: 276352 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

阻塞java线程通讯例子

    博客分类:
  • java
阅读更多

import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {

	ServerSocket serverSocket;

	private void initServer() throws IOException {
		serverSocket = new ServerSocket();
		serverSocket.bind(new InetSocketAddress("localhost", 8000));
		System.out.println("服务器已启动......");
	}

	private void listenSocket() throws IOException {
		while (true) {
			Socket client = serverSocket.accept();
			System.out.println("和客户端" + client.toString() + "建立连接......");
			new ClientThread(client);
		}
	}

	public static void main(String[] args) throws IOException {
		Server server = new Server();
		server.initServer();
		server.listenSocket();
	}

}

class ClientThread extends Thread {

	private static final String BYE = "bye";

	private Socket socket;

	private DataInputStream inputStream;

	private DataOutputStream outputStream;

	BufferedReader sysin = new BufferedReader(new InputStreamReader(System.in));

	Socket client;

	private boolean openFlag = true;

	public ClientThread(Socket client) {
		super();
		this.client = client;
		process();
	}

	public void process() {
		try {
			this.inputStream = new DataInputStream(client.getInputStream());
			this.outputStream = new DataOutputStream(client.getOutputStream());

			// 监听System.in的输入,把输入转输入给客户
			new Thread() {
				public void run() {
					while (openFlag) {
						try {
							//sysin.ready()这个很重要,先判断是否有值可读,有则读,没有这轮训
							//如果一开始就用sysin.readLine那么会阻塞,导致程序如果出现异常,而不能close
							if (sysin.ready()) {
								String msg = sysin.readLine();
								if (msg.toLowerCase().equals(BYE)) {
									shutdown();
									break;
								}
								outputStream.writeUTF(msg);
								outputStream.flush();
							}
						} catch (IOException e) {
							shutdown();
							break;
						}
					}
				}
			}.start();

			while (openFlag) {
				try {
					String msg = inputStream.readUTF();
					System.out.println("客户端说: " + msg);
				} catch (IOException e) {
					shutdown();
					break;
				}
			}

		} catch (IOException e) {
			System.out.println("连接失败");
			shutdown();
		}
	}

	public void shutdown() {
		System.out.println("关闭Clent连接");
		try {
			if (socket != null) {
				socket.close();
			}
			if (inputStream != null) {
				inputStream.close();
			}
			if (outputStream != null) {
				outputStream.close();
			}
			if (sysin != null) {
				sysin.close();
			}
			System.out.println("关闭Clent连接完成");
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

}

 

 

 

import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.InetSocketAddress;
import java.net.Socket;

public class Client {

	private static final String HOST = "localhost";

	private static final int PORT = 8000;

	private static final String BYE = "bye";

	private Socket socket = new Socket();

	private DataInputStream inputStream;

	private DataOutputStream outputStream;

	private boolean openFlag = true;

	private BufferedReader sysin = new BufferedReader(new InputStreamReader(
			System.in));

	public static void main(String[] args) {
		Client client = new Client();
		client.doProcess();
	}

	public void doProcess() {
		try {
			socket.connect(new InetSocketAddress(HOST, PORT));
			// socket.setSoTimeout(1000);
			System.out.println("已经和服务器端连接.....");
			this.inputStream = new DataInputStream(socket.getInputStream());
			this.outputStream = new DataOutputStream(socket.getOutputStream());

			// 监听System.in的输入,把输入转输入给客户
			new Thread() {
				public void run() {
					while (openFlag) {
						try {
							// sysin.ready()这个很重要,先判断是否有值可读,有则读,没有这轮训
							// 如果一开始就用sysin.readLine那么会阻塞,导致程序如果出现异常,而不能close
							if (sysin.ready()) {
								String msg = sysin.readLine();
								if (msg.toLowerCase().equals(BYE)) {
									shutdown();
									break;
								}
								outputStream.writeUTF(msg);
								outputStream.flush();
							}

						} catch (IOException e) {
							shutdown();
							break;
						}
					}
				}
			}.start();

			while (openFlag) {
				try {
					String msg = inputStream.readUTF();
					System.out.println("服务端说: " + msg);
				} catch (IOException e) {
					shutdown();
					break;
				}
			}

		} catch (IOException e) {
			System.out.println("连接失败");
			e.printStackTrace();
			shutdown();
		}
		System.out.println("over");
	}

	public void shutdown() {
		System.out.println("开始关闭连接");

		openFlag = false;
		try {
			if (socket != null) {
				socket.close();
			}
			if (inputStream != null) {
				inputStream.close();
			}
			if (outputStream != null) {
				outputStream.close();
			}
			if (sysin != null) {
				sysin.close();
			}
			System.out.println("关闭完成");
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

}
 
分享到:
评论

相关推荐

    java多线程经典例子

    Java线程的优先级范围是1(`Thread.MIN_PRIORITY`)到10(`Thread.MAX_PRIORITY`),默认优先级是5(`Thread.NORM_PRIORITY`)。线程优先级越高,获取CPU资源的可能性越大,但并不能保证优先级高的线程一定会先执行...

    java中线程的应用例子

    4. **线程状态**:Java线程有五种状态:新建、可运行、运行、阻塞和死亡。了解这些状态可以帮助开发者更好地控制和调试线程。 5. **线程优先级**:每个线程都有一个优先级,Java中从1(`MIN_PRIORITY`)到10(`MAX_...

    Java线程的简单例子

    Java线程是Java编程中的重要概念,它允许程序同时执行多个任务,极大地提高了程序的并发性和效率。在Java中,线程是程序执行的最小单位,由Java虚拟机(JVM)来管理和调度。理解并熟练掌握Java线程的创建、控制以及...

    java线程实例 各种小Demo

    Java线程有五种状态:新建、可运行、运行、阻塞和终止。可以通过Thread类的getState()方法查看线程状态。线程的控制包括: - sleep():使当前线程进入休眠状态,指定时间后自动唤醒。 - join():让当前线程等待另一...

    java 多线程小例子 很方便 很实用 适合初学者

    ### Java多线程小例子详解 #### 知识点一:基本多线程示例 在给定的代码示例中,我们首先看到的是一个简单的Java多线程应用实例。这个例子展示了如何创建并启动一个新的线程。在`ThreadDemo`类的`main`方法中,...

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

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

    Java线程同步例子.pdf

    根据提供的文件内容,我们可以看到一个典型的Java线程同步的例子,其中涉及到了生产者(Producer)和消费者(Consumer)模式,以及同步方法和同步代码块的使用。 知识点一:生产者消费者模式 生产者消费者模式是多...

    java线程例子大全

    本资源“java线程例子大全”包含了十八个单元的实例代码,覆盖了Java线程操作的多个方面。 1. **线程创建** - 继承`Thread`类:创建一个新的类,该类继承自`Thread`,然后重写`run()`方法。实例化后调用`start()`...

    几个java线程的例子

    Java线程是多任务编程的重要组成部分,特别是在现代计算环境中,多核处理器的广泛使用使得并发执行成为提升系统性能的关键。本篇文章将详细讲解几个Java线程的实例,帮助你深入理解这一关键概念。 首先,我们需要...

    java一个多线程的经典例子

    ### 线程的阻塞与恢复 在示例中,主程序使用`Thread.sleep()`方法让当前线程暂停执行指定时间,以便让其他线程有机会执行。 ```java try { Thread.sleep(7000); // 当前线程休眠7秒 } catch ...

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

    Java线程在其生命周期中会经历多种状态: 1. **新状态(New)**:线程对象已创建,但尚未调用`start()`方法。 2. **可运行状态(Runnable)**:线程已准备好执行,等待CPU时间片分配。 3. **阻塞状态(Blocked)**:线程...

    java线程详解

    Java线程:新特征-阻塞队列 Java线程:新特征-阻塞栈 Java线程:新特征-条件变量 Java线程:新特征-原子量 Java线程:新特征-障碍器 Java线程:深入ThreadLocal 一、标准例子 二、不用ThreadLocal 三、自己...

    java线程的例子(IBM培训提供)

    Java线程是并发编程的核心部分,它允许程序同时执行多个任务,从而提高系统效率和响应速度。在IBM的培训中,这个主题深入讲解了如何在Java中创建和管理线程,以及如何解决并发环境中可能出现的问题。 首先,让我们...

    java多线程经典案例

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

    经典线程例子——Java线程学习指南

    Java线程有五种状态:新建、运行、阻塞、等待和结束。通过Thread类的getState()方法可以获取当前线程的状态。 四、线程池 Java的ExecutorService和ThreadPoolExecutor提供了一种管理线程的方式,可以控制线程的数量...

    JAVA单线程多线程

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

    java多线程示例

    在Java编程语言中,多线程是核心特性之一,它允许程序同时执行多个任务,从而提高了应用程序的效率和响应速度。本示例着重探讨如何在Java中实现和管理多线程,以及它带来的挑战和解决方案。 一、Java多线程基础 1. ...

    Java 多线程 订票 示例 线程安全

    在Java编程中,多线程是并发编程的重要组成部分,它允许多个任务同时执行,从而提高应用程序的效率和响应速度。然而,多线程环境下的数据共享和操作可能会引发线程安全问题,如果不正确处理,可能导致数据不一致、...

    java多线程例子.pdf

    标题和描述中并未直接提供关于Java多线程的具体例子,但是从给定的【部分内容】中我们可以提取和概括出多个关于Java多线程编程的知识点。 1. Java多线程基础概念: Java多线程是Java语言支持并发编程的一个重要...

    java中的线程优先级例子

    一个常见的例子是,高优先级线程等待一个低优先级线程释放共享资源,这会导致高优先级线程被阻塞,反而降低了系统的整体效率。为了解决这些问题,Java引入了优先级队列调度策略,但这个策略并不能完全避免优先级反转...

Global site tag (gtag.js) - Google Analytics