本文实例讲述了Java基于Socket实现简单的多线程回显服务器功能。分享给大家供大家参考,具体如下:

需要两个类,一个是EchoServer,代表服务器。另外一个是EchoServerClient,代表客户端。代码如下:
package interview;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class EchoServer {
public static void main(String []args) throws IOException{
ServerSocket server = new ServerSocket(6789);
while(true){
Socket client = server.accept();
ClientHandler handler = new ClientHandler(client);
new Thread(handler).start();
}
}
public static class ClientHandler implements Runnable{
private Socket client;
@Override
public void run() {
InputStreamReader isr = null;
try {
isr = new InputStreamReader(client.getInputStream());
BufferedReader br = new BufferedReader(isr);
PrintWriter pw = new PrintWriter(client.getOutputStream());
String msg = br.readLine();
System.out.println("收到" + client.getInetAddress() + "发送的" + msg);
pw.println("收到了你发的" + msg);
pw.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
public ClientHandler(Socket client){
this.client = client;
}
}
}
下面是客户端代码:
package interview;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;
public class EchoServerClient {
public static void main(String []args) throws UnknownHostException, IOException{
Socket client = new Socket("127.0.0.1", 6789);
Scanner sc = new Scanner(System.in);
System.out.print("请输入要发送的内容:");
String msg = sc.nextLine();
sc.close();
PrintWriter pw = new PrintWriter(client.getOutputStream());
pw.println(msg);
pw.flush();
InputStreamReader isr = new InputStreamReader(client.getInputStream());
BufferedReader br = new BufferedReader(isr);
System.out.println("服务器返回:" + br.readLine());
client.close();
}
}
NIO多路复用套接字方法如下:
package interview;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.nio.charset.CharacterCodingException;
import java.nio.charset.Charset;
import java.nio.charset.CharsetDecoder;
import java.nio.charset.CharsetEncoder;
import java.util.Iterator;
public class EchoServerNIO {
private static ServerSocketChannel serverChannel = null;
private static Selector selector = null;// 多路复用选择器
private static ByteBuffer buffer = null; // 缓冲区
public static void main(String []args) throws IOException{
init();
listen();
}
static void init() throws IOException{
serverChannel = ServerSocketChannel.open();
buffer = ByteBuffer.allocate(1024);
serverChannel.socket().bind(new InetSocketAddress(6789));
serverChannel.configureBlocking(false);
selector = Selector.open();
serverChannel.register(selector, SelectionKey.OP_ACCEPT);
}
static void listen() throws IOException{
while(true){
if(selector.select(5000) != 0){
Iterator<SelectionKey> it = selector.selectedKeys().iterator();
while(it.hasNext()){
SelectionKey key = it.next();
it.remove();
handleKey(key);
}
}
}
}
static void handleKey(SelectionKey key) throws IOException{
SocketChannel channel = null;
if(key.isAcceptable()){
ServerSocketChannel serverChannel = (ServerSocketChannel)key.channel();
channel = serverChannel.accept();
channel.configureBlocking(false);
channel.register(selector, SelectionKey.OP_READ);
}else if(key.isReadable()){
channel = (SocketChannel)key.channel();
buffer.clear();
if(channel.read(buffer) > 0){
buffer.flip();
CharBuffer charBuffer = CharsetHelper.decode(buffer);
String msg = charBuffer.toString();
System.out.println("收到" + channel.getRemoteAddress() + "的消息:" + msg);
channel.write(CharsetHelper.encode(CharBuffer.wrap("received your msg:" + msg)));
}
}
}
public static class CharsetHelper{
private static final String UTF_8 = "UTF-8";
private static CharsetEncoder encoder = Charset.forName(UTF_8).newEncoder();
private static CharsetDecoder decoder = Charset.forName(UTF_8).newDecoder();
private CharsetHelper() {
}
public static ByteBuffer encode(CharBuffer in) throws CharacterCodingException{
return encoder.encode(in);
}
public static CharBuffer decode(ByteBuffer in) throws CharacterCodingException{
return decoder.decode(in);
}
}
}
更多关于java相关内容感兴趣的读者可查看本站专题:《Java Socket编程技巧总结》、《Java文件与目录操作技巧汇总》、《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》和《Java缓存操作技巧汇总》
希望本文所述对大家java程序设计有所帮助。
# Java
# Socket
# 多线程
# 回显
# 服务器
# Java实现基于NIO的多线程Web服务器实例
# java使用socket实现一个多线程web服务器的方法
# Java编程实现多线程TCP服务器完整实例
# Java编程利用socket多线程访问服务器文件代码示例
# java多线程实现服务器端与多客户端之间的通信
# Java多线程实现聊天客户端和服务器
# Java创建多线程服务器流程
# 多路
# 复用
# 客户端
# 操作技巧
# 相关内容
# 感兴趣
# 数据结构
# 给大家
# 请输入
# 另外一个
# 收到了
# 更多关于
# 所述
# 程序设计
# 方法如下
# 选择器
# 编程技巧
# 讲述了
# Override
相关文章:
c++怎么编写动态链接库dll_c++ __declspec(dllexport)导出与调用【方法】
制作网站的软件下载免费,今日头条开宝箱老是需要下载怎么回事?
网站海报制作教学视频教程,有什么免费的高清可商用图片网站,用于海报设计?
C#如何使用XPathNavigator高效查询XML
宝塔面板创建网站无法访问?如何快速排查修复?
电商网站制作多少钱一个,电子商务公司的网站制作费用计入什么科目?
南阳网站制作公司推荐,小学电子版试卷去哪里找资源好?
专业公司网站制作公司,用什么语言做企业网站比较好?
阿里云高弹*务器配置方案|支持分布式架构与多节点部署
手机怎么制作网站教程步骤,手机怎么做自己的网页链接?
电商网站制作公司有哪些,1688网是什么意思?
如何使用Golang安装API文档生成工具_快速生成接口文档
官网自助建站系统:SEO优化+多语言支持,快速搭建专业网站
如何用VPS主机快速搭建个人网站?
黑客如何利用漏洞与弱口令入侵网站服务器?
武汉外贸网站制作公司,现在武汉外贸前景怎么样啊?
如何在景安云服务器上绑定域名并配置虚拟主机?
建站之星CMS建站配置指南:模板选择与SEO优化技巧
c++如何打印函数堆栈信息_c++ backtrace函数与符号名解析【方法】
网站图片在线制作软件,怎么在图片上做链接?
北京网站制作费用多少,建立一个公司网站的费用.有哪些部分,分别要多少钱?
网站制作服务平台,有什么网站可以发布本地服务信息?
移民网站制作流程,怎么看加拿大移民官网?
如何快速使用云服务器搭建个人网站?
制作销售网站教学视频,销售网站有哪些?
小捣蛋自助建站系统:数据分析与安全设置双核驱动网站优化
如何在万网自助建站平台快速创建网站?
详解jQuery中基本的动画方法
常州自助建站工具推荐:低成本搭建与模板选择技巧
齐河建站公司:营销型网站建设与SEO优化双核驱动策略
制作网站的模板软件,网站怎么建设?
公司网站制作需要多少钱,找人做公司网站需要多少钱?
c++怎么用jemalloc c++替换默认内存分配器【性能】
建站一年半SEO优化实战指南:核心词挖掘与长尾流量提升策略
如何挑选高效建站主机与优质域名?
上海制作企业网站有哪些,上海有哪些网站可以让企业免费发布招聘信息?
内网网站制作软件,内网的网站如何发布到外网?
php8.4新语法match怎么用_php8.4match表达式替代switch【方法】
用v-html解决Vue.js渲染中html标签不被解析的问题
如何设置并定期更换建站之星安全管理员密码?
建站之星后台管理如何实现高效配置?
制作假网页,招聘网的薪资待遇,会有靠谱的吗?一面试又各种折扣?
天河区网站制作公司,广州天河区如何办理身份证?需要什么资料有预约的网站吗?
宝塔建站教程:一键部署配置流程与SEO优化实战指南
建站之星展会模版如何一键下载生成?
代刷网站制作软件,别人代刷火车票靠谱吗?
免费视频制作网站,更新又快又好的免费电影网站?
建站之星体验版:智能建站系统+响应式设计,多端适配快速建站
如何基于PHP生成高效IDC网络公司建站源码?
建站之星在线版空间:自助建站+智能模板一键生成方案
*请认真填写需求信息,我们会在24小时内与您取得联系。