一个简单的多线程服务器例子
来源:互联网 发布:网络远程教育学校 编辑:程序博客网 时间:2024/05/21 19:23
一个简单的多线程服务器例子
中国移动允许我们可以通过短信编辑一些指令发送给10086,以获取一些办理的业务信息。下边以一个类似的例子来模拟服务器。
建立一个多线程服务器端,能够处理不同客户端的连接,以查询客户端发送的指令内容。假设客户端可以向服务器端查询一人向另一人发送的短消息,发送指令格式如*#MSG#*from|to,则服务器端的实现:
import java.io.DataInputStream;import java.io.DataOutputStream;import java.io.IOException;import java.net.ServerSocket;import java.net.Socket;import java.util.HashMap;import java.util.Map;import java.util.regex.Matcher;import java.util.regex.Pattern;/** * 服务器端 * * @author 小明 * */public class Server { public static void main(String[] args) throws Exception { /* Map暂存所有消息 */ Map<String, String> msgs = new HashMap<String, String>(); msgs.put("tom to jery", "hello jery"); msgs.put("jery to tom", "hello tom"); msgs.put("kate to tom", "don't forget me this weekend"); // 服务器监听3334端口 ServerSocket server = new ServerSocket(3334); while (true) { // 循环监听客户端连接 Socket socket = server.accept(); // 接收客户端连接 new Thread(new MultiThread(socket, msgs)).start(); // 启动新线程处理该客户端连接 } }}/** * 多线程类,处理每个客户端连接的请求与响应 * * @author 小明 */class MultiThread implements Runnable { /** * 套接字对象 */ private Socket socket; /** * 存放消息的集合 */ private Map<String, String> msgs; public MultiThread(Socket socket, Map<String, String> msgs) { super(); this.socket = socket; this.msgs = msgs; } @Override public void run() { try { DataInputStream in = new DataInputStream(socket.getInputStream()); DataOutputStream out = new DataOutputStream( socket.getOutputStream()); while (true) { // 循环处理套接字输入输出流数据 String str = in.readUTF(); // 读取客户端发送的请求 // 正则表达式,用于判断客户端发送的请求格式是否正确,以及获取请求内容 Pattern pattern = Pattern .compile("[*]#(\\w{3})#[*](\\w*)[|](\\w*)"); // *#MSG#*tom|lily Matcher matcher = pattern.matcher(str); if (matcher.matches()) { // 客户端请求格式正确 matcher.reset(); matcher.find(); // 查找分组 String cmd = matcher.group(1); // 请求内容 if ("MSG".equalsIgnoreCase(cmd)) { // 请求内容为"MSG" String from = matcher.group(2); // 来自 String to = matcher.group(3); // 到 String msg = msgs.get(from + " to " + to); if (msg != null) out.writeUTF(from + " to " + to + ", msg : " + msg); // 向客户端写 else out.writeUTF("没有该消息"); out.flush(); } } else { out.writeUTF("输入数据格式有误"); out.flush(); } } } catch (IOException e) { e.printStackTrace(); } }}
客户端的简单实现:
import java.io.DataInputStream;import java.io.DataOutputStream;import java.io.IOException;import java.net.Socket;import java.util.Scanner;/** * 客户端 * * @author 小明 * */public class Client { public static void main(String[] args) throws Exception { Scanner input = new Scanner(System.in); Socket socket = new Socket("localhost", 3334); // 建立连接套接字 final DataInputStream in = new DataInputStream(socket.getInputStream()); DataOutputStream out = new DataOutputStream(socket.getOutputStream()); while (true) { System.out.print("输入查询内容:"); String request = input.next(); out.writeUTF(request); // 发送查询请求 out.flush(); try { String answer = in.readUTF(); // 读取查询结果 System.out.println("查询结果:" + answer); } catch (IOException e) { e.printStackTrace(); } } }}
运行结果(客户端):
输入查询内容:*#MSG#*tom|jery查询结果:tom to jery, msg : hello jery输入查询内容:*#MSG#*kate|tom查询结果:kate to tom, msg : don't forget me this weekend输入查询内容:*#MSG#*tom|kate查询结果:没有该消息
0 0
- 一个简单的多线程服务器例子
- 一个不错的多线程Socket服务器简单例子
- 一个不错的多线程Socket服务器简单例子
- C# 一个简单的多线程例子
- 一个简单的多线程运用例子
- 一个简单的多线程例子-互斥量
- 一个简单的多线程例子-临界区
- qt多线程一个简单的例子
- qt多线程一个简单的例子
- 一个简单的java多线程例子
- 一个简单的多线程同步例子
- 多线程死锁的一个简单例子
- 一个简单的Netty服务器例子
- 一个重叠io的例子 实现一个简单的服务器
- 多线程的一个例子
- 多线程的一个例子
- 一个简单的C#多线程间同步的例子
- 一个简单的C#多线程间同步的例子
- Android - Uri
- python 第一天(3)
- Linux命令 一
- 如何快速的查看一段代码的执行时间
- android晋级面试题
- 一个简单的多线程服务器例子
- day20/PropertiesDemo.java
- Java程序员最常用的8个Java日志框架
- Markdown test
- Facebook怎样开发软件:工程师驱动的文化
- tintColor ios7特性学习
- day20/RunCount.java
- WIN7 openCV face detection Sample报错解决
- android音频播放