JAVA BIO 服务器与客户端实现示例

代码只兼容JAVA 7及以上版本。

服务器端代码:

package com.stevex.app.bio;

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

import javax.net.ServerSocketFactory;

public class XiaoNa {
	public static void main(String[] args){
		XiaoNa xiaona = new XiaoNa();

		ServerSocket serverSocket = null;
		Socket socket = null;

		try {
			//可以设置客户连接请求队列的长度,比如5,队列长度超过5后拒绝连接请求
			//serverSocket = ServerSocketFactory.getDefault().createServerSocket(8383, 5);
			serverSocket = ServerSocketFactory.getDefault().createServerSocket(8383);	

			while(true){
				try{
					//监听直到接受连接后返回一个新Socket对象
					socket = serverSocket.accept();//阻塞
					//new一个线程处理连接请求
					new Thread(xiaona.new Worker(socket)).start();;
				}
				catch (Throwable e) {	//防止发生异常搞死服务器
					e.printStackTrace();
				}
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
		finally{
			try {
				if(socket != null){
					socket.close();
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

	private static String getAnswer(String question){
		String answer = null;

		switch(question){
		case "who":
			answer = "我是小娜";
			break;
		case "what":
			answer = "我是来帮你解闷的";
			break;
		case "where":
			answer = "我来自外太空";
			break;
		default:
				answer = "请输入 who, 或者what, 或者where";
		}

		return answer;
	}

	private class Worker implements Runnable{
		private Socket socket;

		public Worker(Socket socket){
			this.socket = socket;
		}

		@Override
		public void run() {
			BufferedReader reader = null;
			PrintWriter writer = null;

			try {
				reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));

				writer = new PrintWriter(socket.getOutputStream());

				String question = reader.readLine();//没有内容会阻塞

				while(!question.equals("OVER")){
					String answer = getAnswer(question);
					writer.println(answer);
					question = reader.readLine();
				}

				writer.println("OVER");//OVER作为操作完成暗号
				writer.flush();

				if(writer != null){
					writer.close();
				}

				if(reader != null){
					reader.close();
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}

	}
}

客户端代码:

package com.stevex.app.bio;

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

public class Client {
	public static void main(String[] args) {
		Client c = new Client();

		//种20个线程发起Socket客户端连接请求
		for(int i=0; i<20; i++){
			new Thread(c.new Worker()).start();
		}
	}

	private class Worker implements Runnable{

		@Override
		public void run() {
			Socket socket = null;
			BufferedReader reader = null;
			PrintWriter writer = null;

			try {
				//创建一个Socket并连接到指定的目标服务器
				socket = new Socket("localhost", 8383);

				reader = new BufferedReader(new InputStreamReader(
						socket.getInputStream()));
				writer = new PrintWriter(socket.getOutputStream());

				writer.println("who");
				writer.println("what");
				writer.println("where");
				writer.println("OVER");//OVER作为操作完成暗号
				writer.flush();

				String answer = reader.readLine();	//没有内容会阻塞
				while(! answer.equals("OVER")){
					System.out.println(Thread.currentThread().getId() + "---Message from server:" + answer);
					answer = reader.readLine();
				}

			} catch (IOException e) {
				e.printStackTrace();
			} finally {
				try {
					if (writer != null) {
						writer.close();
					}

					if (reader != null) {
						reader.close();
					}

					if (socket != null) {
						socket.close();
					}
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}

	}
}
时间: 2024-07-30 02:15:19

JAVA BIO 服务器与客户端实现示例的相关文章

JAVA AIO 服务器与客户端实现示例

AIO用于文件处理还是比较快乐的,但用AIO来写网络消息处理服务器端与客户端是比较麻烦的事情,当然这只是我个人意见,主要是有几点原因: 一是AIO需要操作系统支持,还好Windows与Linux(模拟)都支持: 二是AIO同时使用递归调用和异步调用容易把程序员搞晕,代码容易出错: 三是CompletionHandler会使用单独的线程跑,容易出现多线程问题,频繁线程上下文切换比较消耗资源: 四是异步写要创建队列来缓存需要写入的数据,否则肯定会遇到WritePendingException. 相对

JAVA NIO 服务器与客户端实现示例

以下代码只兼容Java 7及以上版本,对于一些关键地方请看注释说明. 公共类: package com.stevex.app.nio; import java.nio.ByteBuffer; import java.nio.CharBuffer; import java.nio.charset.CharacterCodingException; import java.nio.charset.Charset; import java.nio.charset.CharsetDecoder; imp

异步Socket服务器与客户端

本文灵感来自Andre Azevedo 在CodeProject上面的一片文章,An Asynchronous Socket Server and Client,讲的是异步的Socket通信. Socket连接(Socket Connection) Socket服务(Socket Service) 连接主机(Connection Host) 加密与压缩(Encrypt与Compress) 请求入队(Enqueuing Requests) 确保发送和接收(Ensure send and recie

漫谈Java IO之普通IO流与BIO服务器

今天来复习一下基础IO,也就是最普通的IO. 网络IO的基本知识与概念 普通IO以及BIO服务器 NIO的使用与服务器Hello world Netty入门与服务器Hello world Netty深入浅出 输入流与输出流 Java的输入流和输出流,按照输入输出的单元不同,又可以分为字节流和字符流的. JDK提供了很多输入流和输出流,比如: 字节流可以按照不同的变量类型进行读写,而字符流则是基于字符编码的.不同的字符编码包含的字节数是不一样的,因此在使用字符流时,一定要注意编码的问题. 读写 字

java 网络编程 TCP协议 java 服务器和客户端 java socket编程

一个 HelloWord 级别的 Java Socket 通信的例子.通讯过程:        先启动 Server 端,进入一个死循环以便一直监听某端口是否有连接请求.然后运行 Client 端,客户端发出连接请求,服务端监听到这次请求后向客户端发回接受消息,连接建立,启动一个线程去处理这次请求,然后继续死循环监听其他请求.客户端输入字符串后按回车键,向服务器发送数据.服务器读取数据后回复客户端数据.这次请求处理完毕,启动的线程消亡.如果客户端接收到 "OK" 之外的返回数据,会再次

【代码笔记】Java深入学习——实现客户端发送文件到服务器的文件传输

Server.java package com.huaxin.lesson02; import java.io.FileOutputStream; import java.io.InputStream; import java.io.ObjectInputStream; import java.net.ServerSocket; import java.net.Socket; /** * @thing 实现客户端发送文件到服务器 * @thing 客户端发送到客户端(本代码未实现) * @aut

Java Socket应用(六)——服务器响应客户端

转载请注明:http://blog.csdn.net/uniquewonderq 通过输入流来读取客户端信息,相应的时候通过输出流来实现. 服务端类的代码: package com.test; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; imp

Kafka JAVA客户端代码示例--高级应用

什么时间使用高级应用? 针对一个消息读取多次 在一个process中,仅仅处理一个topic中的一组partitions 使用事务,确保每个消息只被处理一次 使用高级应用(调用较底层函数)的缺点? SimpleConsumer需要做很多额外的工作(在以groups方式进行消息处理时不需要) 在应用程序中跟踪上次消息处理的offset 确定一个topic partition的lead broker 手工处理broker leander的改变 使用底层函数(SimpleConsumer)开发的步骤

一个 Java 的 Socket 服务器和客户端通信的例子

http://blog.csdn.net/defonds/article/details/7971259 多个客户端对应一个服务端的通信的一个小例子.  服务端和客户端代码: public class Server { /** * 监听的端口 */ public static final int PORT = 12345; public static void main(String[] args) { System.out.println("服务器启动>>>>>&