当前位置:首页 > 开发 > 编程语言 > 网络编程 > 正文

Java Socket学习---单线程阻塞

发表于: 2014-09-10   作者:商人shang   来源:转载   浏览:
摘要: 这里首先介绍几个概念:BIO——同步阻塞IO、NIO——同步非阻塞IO、AIO——异步非阻塞IO 今天的例子是最简单的一个例子,没有引入多线程,仅仅是一个单线程阻塞的Socket例子,多线程的下次再继续。   这样子的例子仅仅供学习使用,基本上是没有实用意义的,因为在实际的应用中基本上是不止于一个Client的。   Server端得代码如下: package co

这里首先介绍几个概念:BIO——同步阻塞IO、NIO——同步非阻塞IO、AIO——异步非阻塞IO

今天的例子是最简单的一个例子,没有引入多线程,仅仅是一个单线程阻塞的Socket例子,多线程的下次再继续。

 

这样子的例子仅仅供学习使用,基本上是没有实用意义的,因为在实际的应用中基本上是不止于一个Client的。

 

Server端得代码如下:

package com.henushang.socket;

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

import com.henushang.socket.util.SocketUtils;

public class EchoServer {
	private int port = 8000;
	private ServerSocket serverSocket;
	
	public EchoServer() throws Exception {
		serverSocket = new ServerSocket(port);
		System.out.println("waitting connet...");
	}
	
	public String echo(String msg) {
		return "echo:" + msg;
	}
	
	public void service() {
		Socket socket = null;
		String msg = null;
 		while (true) {
			try {
				socket = serverSocket.accept();// 准备接受连接
				System.out.println("new connection: " + socket.getInetAddress() + ":" + socket.getPort());
				BufferedReader reader = SocketUtils.getReader(socket);// 输入流
				PrintWriter writer = SocketUtils.getWriter(socket);// 输出流
				while ((msg = reader.readLine()) != null) {// 接收消息
					System.out.println(msg);
					writer.println(echo(msg));// 发送消息
					writer.flush();// 注意,在使用缓冲流在发送消息的时候最好进行强制刷新,否则,可能会由于缓冲区不满而暂时不发送消息
					if ("bye".equals(msg)) {
						break;
					}
				}
			} catch (Exception e) {
				e.printStackTrace();
			}finally {
				SocketUtils.close(socket);
			}
		}
	}
	
	public static void main(String[] args) {
		try {
			new EchoServer().service();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
}

 

客户端代码:

package com.henushang.socket;

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

import com.henushang.socket.util.SocketUtils;

public class EchoClient {
	private String host = "127.0.0.1";
	private int port = 8000;
	private Socket socket ;
	
	public EchoClient() throws Exception {
		socket = new Socket(host, port);
	}
	
	public void talk() throws IOException {
		try {
			BufferedReader reader = SocketUtils.getReader(socket);
			PrintWriter writer = SocketUtils.getWriter(socket);
			// 读取本地控制台的消息
			BufferedReader localReader = new BufferedReader(new InputStreamReader(System.in));
			String msg = null;
			while ((msg = localReader.readLine()) != null) {
				writer.println(msg);
				writer.flush();
				System.out.println(reader.readLine());
				if ("bye".equals(msg)) {
					break;
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}finally {
			SocketUtils.close(socket);
		}
	}
	
	public static void main(String[] args) throws Exception{
		new EchoClient().talk();
	}
}

 

下面是我写的一个工具类,做了一些重复的操作的汇集,如下:

package com.henushang.socket.util;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.nio.channels.SocketChannel;

public class SocketUtils {
	
	public static PrintWriter getWriter(Socket socket) throws IOException {
		OutputStream os = socket.getOutputStream();
		return new PrintWriter(os);
	}
	
	public static PrintWriter getWriter(SocketChannel socketChannel) throws IOException {
		return getWriter(socketChannel.socket());
	}
	
	public static BufferedReader getReader(Socket socket) throws IOException{
		InputStream is = socket.getInputStream();
		return new BufferedReader(new InputStreamReader(is, "UTF-8"));
	}
	
	public static BufferedReader getReader(SocketChannel socketChannel) throws IOException{
		return getReader(socketChannel.socket());
	}
	
	public static void close(Socket socket) {
		try {
			if (socket != null) {
				socket.close();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public static void close(SocketChannel socketChannel) {
		try {
			if (socketChannel != null) {
				socketChannel.close();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

 

 

参考:《java网络编程精解》

 

 

 

Java Socket学习---单线程阻塞

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
1、 服务器端处理流程 接触一种技术,首先都要熟悉它的生命周期,这样才能从大局上看每个流程的细节
前几天我们公司C语言组的人需要一个基于socket的报文接收器来方便他们测试项目,我花了小半天给他们
本文转自:http://www.blogjava.net/jake1036/archive/2010/08/01/327703.html 作者:jake1036 1 非
本篇文章观点和例子来自 《Java网络编程精解》, 作者为孙卫琴, 出版社为电子工业出版社。 对于用Se
用java实现socket C/S通信很简单,很多教科书上都有。但是这些通信模型大都是阻塞式的,其弊端也很
简单点说: 阻塞就是干不完不准回来, 非组赛就是你先干,我现看看有其他事没有,完了告诉我一声 我
从:http://blog.sina.com.cn/s/blog_5d0990c7010115ib.html 转载 Socket 阻塞与非阻塞模式 阻塞模
除了普通的Socket与ServerSocket实现的阻塞式通信外,java提供了非阻塞式通信的NIO API。先看一下NI
java socket学习笔记(包括自己总结和转载) 1 socket概念 套接字(socket)是通信的基石,是支持TC
在上一篇文章 《socket编程——一个简单的例子》 http://blog.csdn.net/wind19/archive/2011/01/21/
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号