`
benx
  • 浏览: 273334 次
  • 性别: 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线程:新特征-阻塞队列 Java线程:新特征-阻塞栈 Java线程:新特征-条件变量 Java线程:新特征-原子量 Java线程:新特征-障碍器 Java线程:深入ThreadLocal 一、标准例子 二、不用ThreadLocal 三、自己...

    java模拟阻塞队列

    实现java模拟阻塞队列的例子,该代码包括,阻塞队列实现生产者,消费者。和模拟阻塞队列实现生产者及消费者模式,帮助你更好的理解java多线程

    JAVA多线程编程详解-详细操作例子

    本压缩包,总共包含两个文档,JAVA多线程编程详解-详细操作例子和 Java多线 程编程总结 例如,runnable、thread、stop()、 suspend、yield、setPriority()、getPriority()、synchronized、wait()、join、线程池同步...

    用JAVA实现缓冲多线程无阻塞读取远程文件.doc

    用JAVA实现缓冲多线程无阻塞读取远程文件.doc

    个人总结的深入java多线程开发

    看完《think in java》多线程章节,自己写的多线程文档,还结合了其他的相关网络资料。 线程 一. 线程池 1)为什么要使用线程池 2 2)一个具有线程池的工作队列 3 3)使用线程池的风险: 4 4)有效使用线程池的原则 5...

    Java并发编程相关源码集 包括多任务线程,线程池等.rar

    volatile关键字的非原子性、volatile关键字的使用、AtomicInteger原子性操作、线程安全小例子:多个线程竞争问题、多个线程多个锁问题、创建一个缓存的线程池、多线程使用Vector或者HashTable的示例(简单线程同步问题...

    jvm-monitoring-agent:从内部监视JVM,检测线程块并自动保存线程转储

    监视JVM线程并在给定时间内阻塞线程时保存线程转储。 用法 从下载jar 将其添加到要监视的应用程序的命令行中: java -javaagent:jvm-monitoring-agent-0.9.0.jar=threshold=1000,debug ...rest of command 配置...

    JAVA2核心技术(中文的PDF).part3.rar

    本书是Java 2技术权威指南,全面覆盖Java 2技术的高级主题,包括:多线程、集合框架、网络API、数据库编程、分布式对象等,深入探究了Swing、Java 2D API、JavaBean、Java安全模式、XML、注释、元数据等主题,同时...

    java NIO参考文档

    举个例子吧 你服务器做一个聊天室 按照以前的阻塞式IO 你必须为每个连接创建一个线程 因为当你调用如 in read buf 时 线程会阻塞在这里 而采用nio 只要注册了事件 它内部采用反应模式 当有IO事件发生时 再调度它 而...

    java concurrent 精简源码

    java concurrent 阻塞队列 线程 里面有详细的例子,下载后请认真阅读里面的内容,可能有点难以理解,请耐心

    JAVA上百实例源码以及开源项目源代码

     当用户发送第一次请求的时候,验证用户登录,创建一个该qq号和服务器端保持通讯连接得线程,启动该通讯线程,通讯完毕,关闭Scoket。  QQ客户端登录界面,中部有三个JPanel,有一个叫选项卡窗口管理。还可以更新...

    JAVA上百实例源码以及开源项目

     当用户发送第一次请求的时候,验证用户登录,创建一个该qq号和服务器端保持通讯连接得线程,启动该通讯线程,通讯完毕,关闭Scoket。  QQ客户端登录界面,中部有三个JPanel,有一个叫选项卡窗口管理。还可以更新...

    Java的线程机制

    并结合例子说明了两种创建线程的方法。 线程是指程序中能顺序执行的一个序列。一个线程只有一个入口点但可能有几个出口点不过,每个时刻的执行点总是只有一个。线程是不能独立运行的程序,而只是某个整体程序...

    疯狂JAVA讲义

    第1章 Java概述 1 1.1 Java语言的发展简史 2 1.2 Java的竞争对手及各自优势 4 1.2.1 C#简介和优势 4 1.2.2 Ruby简介和优势 4 1.2.3 Python的简介和优势 5 1.3 Java程序运行机制 5 1.3.1 高级语言的运行机制 6...

    Java优化编程(第2版)

    第12章 java多线程技术与应用性能优化 12.1 java多线程技术 12.1.1 进程与线程 12.1.2 线程的生命周期 12.2 并行任务与性能 12.2.1 并行任务与多线程 12.2.2 并行任务与死锁 12.3 线程池技术与应用性能优化 12.3.1 ...

    ieda+netty.zip

    Socket就是你想用Java代码API去组织数据,指定协议去通讯,很烦!写的太多代码!Socket帮你封装了 你只需要调用一下Socket的方法就行了,省事!回到图1-1,你会发现线程开太多了 ,100000人连接我开100000线程吗,还是...

Global site tag (gtag.js) - Google Analytics