NIO服务器与客户端
这里客户端没有采用NIO形式
服务器:
package com.util.Server.NIO; import javax.print.DocFlavor;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.util.Iterator; public class ServerConnect
{
private static final int BUF_SIZE=1024;
private static final int PORT = 888;
private static final int TIMEOUT = 3000;
public static void main(String[] args)
{
selector();
}
public static void handleAccept(SelectionKey key) throws IOException {
ServerSocketChannel ssChannel = (ServerSocketChannel)key.channel();
SocketChannel sc = ssChannel.accept();
sc.configureBlocking(false);
sc.register(key.selector(), SelectionKey.OP_READ,ByteBuffer.allocateDirect(BUF_SIZE));
}
public static void handleRead(SelectionKey key) throws IOException{
SocketChannel sc = (SocketChannel)key.channel();
ByteBuffer buf = (ByteBuffer)key.attachment();
long bytesRead = sc.read(buf);
while(bytesRead>0){
buf.flip();
byte[] bb= new byte[BUF_SIZE];
int i=0;
while(buf.hasRemaining()){
// System.out.println("*"+(byte)(buf).get()+"*");
bb[i] = (byte)(buf).get();
i++;
}
System.out.println(new String(bb,"UTF-8"));
buf.clear();
bytesRead = sc.read(buf);
}
buf.clear();
buf.put("lalalalalala".getBytes());
buf.flip();
sc.write(buf); if(bytesRead == -1){
sc.close();
}
}
public static void handleWrite(SelectionKey key) throws IOException{
ByteBuffer buf = (ByteBuffer)key.attachment();
buf.flip();
SocketChannel sc = (SocketChannel) key.channel();
while(buf.hasRemaining()){
sc.write(buf);
}
buf.compact();
}
public static void selector() {
Selector selector = null;
ServerSocketChannel ssc = null;
try{
selector = Selector.open();
ssc= ServerSocketChannel.open();
ssc.socket().bind(new InetSocketAddress(PORT));
ssc.configureBlocking(false);
ssc.register(selector, SelectionKey.OP_ACCEPT);
while(true){
if(selector.select(TIMEOUT) == 0){
System.out.println("==");
continue;
}
Iterator<SelectionKey> iter = selector.selectedKeys().iterator();
while(iter.hasNext()){
SelectionKey key = iter.next();
if(key.isAcceptable()){
handleAccept(key);
}
if(key.isReadable()){
try {
handleRead(key);
}catch (IOException e){
key.cancel();
}
}
if(key.isWritable()){
handleWrite(key);
}
if(key.isConnectable()){
System.out.println("isConnectable = true");
}
iter.remove();
}
}
}catch(IOException e){
e.printStackTrace();
}
}
} 客户端:
package com.util.Server.Test; import ch.qos.logback.core.OutputStreamAppender; import javax.net.ssl.SSLSocketFactory;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket; public class TestSocketClient {
public static void main(String[] args){
try {
Socket socket = new Socket("localhost", 888);
//Socket socket =SSLSocketFactory.getDefault().createSocket("localhost",888); PrintWriter pw;
pw = new PrintWriter(socket.getOutputStream(), true);
String message = "sadddddddddddddddddddddddddd" +
"asddddddddddddddddddddd\n" +
"werrrrrrrrrrrrrrrrr\n" +
"werrrrrr\nrrrr" +
"xcvvvvvvvvvvvvv" +
"hgjjjjjjjjjj" +
"jhkjjjjjjjjjjjjjjj" +
"assssssssssssss";
System.out.println(message.getBytes().length);
message = "<request type='sampleTest' sender='LabManageSystem'> <sampleTest> <testCode>2</testCode><bulkType>无烟煤03</bulkType><sampleType>3mm无烟煤</sampleType><testType>脱水化验</testType><testResult>化验结果</testResult><testTime> 2018-9-8 20:00:00 </testTime><testStaff>化验人员</testStaff><testStation>化验工位#05</testStation><testDesc>化验正常</testDesc><testStatus>化验完毕</testStatus><checkTime> 2018-9-8 21:00:00 </checkTime><checkStaff>检查人员</checkStaff><checkResult>通过</checkResult><sampleCode>1</sampleCode><testType>脱水化验</testType></sampleTest></request>";
System.out.println(message.getBytes().length);
pw.println(message);
pw.flush();
byte[] buffer = new byte[1024];
while ((socket.getInputStream().read(buffer)) != -1) {
//sb.append(new String(buffer,"UTF-8"));
// ab.add(buffer);
// buffer = new byte[BYTELENGH];
System.out.println(new String(buffer, "UTF-8")); }
//pw.println("你猜猜");
}catch (Exception e){
e.printStackTrace();
}
}
}
NIO服务器与客户端的更多相关文章
- Java IO 与 NIO 服务器&客户端通信小栗子
本篇包含了入门小栗子以及一些问题的思考 BIO package com.demo.bio; import java.io.*; import java.net.ServerSocket; import ...
- Netty入门(二)时间服务器及客户端
在这个例子中,我在服务器和客户端连接被创立时发送一个消息,然后在客户端解析收到的消息并输出.并且,在这个项目中我使用 POJO 代替 ByteBuf 来作为传输对象. 一.服务器实现 1. 首先我们 ...
- SVN服务器和客户端安装教程
SVN是什么?有何用? SVN是Subversion的简称,是一个开放源代码的版本控制系统,相较于RCS.CVS,它采用了分支管理系统,它的设计目标就是取代CVS.互联网上很多版本控制服务已从CVS迁 ...
- 2016windows(10) wamp 最简单30分钟thrift入门使用讲解,实现php作为服务器和客户端的hello world
2016最简单windows(10) wamp 30分钟thrift入门使用讲解,实现php作为服务器和客户端的hello world thrift是什么 最简单解释 thrift是用来帮助各个编程语 ...
- python web编程-CGI帮助web服务器处理客户端编程
这几篇博客均来自python核心编程 如果你有任何疑问,欢迎联系我或者仔细查看这本书的地20章 另外推荐下这本书,希望对学习python的同学有所帮助 概念预热 eb客户端通过url请求web服务器里 ...
- GATT两个角色 服务器与客户端
两个设备应用数据的通信是通过协议栈的GATT层实现的. 从GATT角度来看,当两个设备建立连接后,他们处于以下两种角色之一: GATT服务器: 它是为GATT客户端提供数据服务的设备 GATT客户端: ...
- golang thrift 源码分析,服务器和客户端究竟是如何工作的
首先编写thrift文件(rpcserver.thrift),运行thrift --gen go rpcserver.thrift,生成代码 namespace go rpc service RpcS ...
- GATT 服务器与客户端角色
两个设备应用数据的通信是通过协议栈的GATT层实现的.从GATT角度来看,当两个设备建立连接后,他们处于以下两种角色之一: GATT服务器: 它是为GATT客户端提供数据服务的设备 GATT客户端: ...
- homework-05 服务器与客户端
首先非常抱歉第三次和第四次作业我没交上来,不想找借口强调原因,但是这两次作业我一定会补上,到时候会@助教.谢谢 回到这次作业! 这次作业邹老师没说博客的格式,所以在这里就没有什么回答问题的东西了.这次 ...
随机推荐
- Java学习笔记(二)——类和对象
[1]类是模子,确定对象将会拥有的特征(属性)和行为(方法). [2]类的特点:类是对象的类型: 具有相同属性和方法的一组对象的集合. [3]属性:对象具有的各种特征(每个对象的每个属性都拥有特定值) ...
- while和do-while语句的异同之处
while型语句: “先判断,后执行”: while 执行流程: 当程序执行到 while 循环时 , 会首先判断小括号里的值 ,如果值 为假 :结束while语句 , 程序继续向下走 为真 :会把 ...
- Python排序算法——选择排序
有趣的事,Python永远不会缺席! 如需转发,请注明出处:小婷儿的python https://www.cnblogs.com/xxtalhr/p/10787340.html 一.选择排序(Sele ...
- DSL 系列(1) - 扩展点的论述与实现
前言 DSL 全称为 domain-specific language(领域特定语言),本系列应当会很长,其中包含些许不成熟的想法,欢迎私信指正. 1. DSL 简述 我理解的 DSL 的主要职能是 ...
- Java Arrays工具类的使用
Arrays 类 java.util.Arrays类能方便地操作数组,它提供的所有方法都是静态的.具有以下功能: 给数组赋值:通过fill方法. 对数组排序:通过sort方法,按升序. 比较数组:通过 ...
- 使用protostuff自定义编解码器优化springcloud-feign性能
前言 Spring Cloud feign是伪RPC方式解决微服务间的调用.翻看FeignCloudFeign源码,可以看到Feign默认使用HttpUrlConnection; 代码在Default ...
- 剑指offer--5.用两个栈实现队列
题目:用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 思路: # 栈A用来作入队列# 栈B用来出队列,当栈B为空时,栈A全部出栈到栈B,栈B再出栈(即出队列) v ...
- python三:循环语句练习--小白博客
# 打印0-10去掉5 count = - : count += : continue print(count) # 打印0-10的偶数 count = : print(count) count+= ...
- Python Revisited Day 02 (数据类型)
目录 Python 关键字 整数 整数转换函数 整数位逻辑操作符 浮点类型 math模块函数与常量 复数 精确的十进制数字 decimal 字符串 str.format() 格式规约 Python 关 ...
- c++入门之再次探讨类属性
精辟博文:https://blog.csdn.net/msdnwolaile/article/details/51923859(转载,仅供学习|!)