最近看了一下socket编程,写了两套客户端服务端的demo,原理后续会补上,先上代码:
Bio Server:
package com.lcy.jdk;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
/**
* 功能描述:
*
* @author liuchaoyong
* @version 1.0
* @date 2019/10/28 13:40
*/
public class SocketServer {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(55533);
System.out.println("等待连接...");
while (true){
Socket socket = serverSocket.accept();
System.out.println("客户端接入...");
InputStream inputStream = socket.getInputStream();
int len;
byte[] bytes = new byte[1024];
StringBuilder stringBuilder = new StringBuilder();
while ((len =inputStream.read(bytes)) != -1){
stringBuilder.append(new String(bytes,0,len,"UTF-8"));
}
System.out.println("接收消息..."+stringBuilder.toString());
OutputStream outputStream = socket.getOutputStream();
outputStream.write("发送消息成功...".getBytes("UTF-8"));
socket.close();
}
}
}
Bio Client:
package com.lcy.jdk;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
/**
* 功能描述:
*
* @author liuchaoyong
* @version 1.0
* @date 2019/10/28 13:50
*/
public class SocketClient {
public static void main(String[] args) throws IOException {
Socket socket = new Socket("127.0.0.1",55533);
OutputStream outputStream = socket.getOutputStream();
outputStream.write("你好朋友".getBytes("UTF-8"));
socket.shutdownOutput();
InputStream inputStream = socket.getInputStream();
int len;
byte[] bytes = new byte[1024];
StringBuilder stringBuilder = new StringBuilder();
while ((len = inputStream.read(bytes)) != -1){
stringBuilder.append(new String(bytes,0,len,"UTF-8"));
}
System.out.println("服务端返回消息..."+stringBuilder.toString());
socket.close();
}
}
Nio Server:
package com.lcy.jdk;
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.nio.charset.Charset;
import java.util.Iterator;
/**
* 功能描述:
*
* @author liuchaoyong
* @version 1.0
* @date 2019/10/28 14:52
*/
public class NioSocketServer {
public static void main(String[] args) throws IOException {
ServerSocketChannel ssc = ServerSocketChannel.open();
ssc.socket().bind(new InetSocketAddress(55533));
//设置非阻塞才能将ssc注册到选择器中,否则会抛异常IllegalBlockingModeException,
ssc.configureBlocking(false);
Selector selector = Selector.open();
//服务端监听请求连接事件
ssc.register(selector, SelectionKey.OP_ACCEPT);
while (true) {
System.out.println("等待连接...");
//选择器阻塞监听事件
selector.select();
System.out.println("客户端接入...");
Iterator<SelectionKey> iterator = selector.selectedKeys().iterator();
while (iterator.hasNext()) {
SelectionKey selectionKey = iterator.next();
if (selectionKey.isAcceptable()) {
//获取客户端连接,把接收到的客户端的SocketChannel也注册在服务端Selector中,并监听客户端Channel的read事件
SocketChannel sc = ssc.accept();
sc.configureBlocking(false);
sc.register(selector, SelectionKey.OP_READ);
}
if (selectionKey.isReadable()) {
SocketChannel socketChannel = (SocketChannel) selectionKey.channel();
ByteBuffer buffer = ByteBuffer.allocate(1024);
if (socketChannel.read(buffer) == -1) {
System.out.println("未接收到信息...");
socketChannel.close();
} else {
buffer.flip();
String request = Charset.defaultCharset().decode(buffer).toString();
System.out.println("接收消息..." + request);
socketChannel.write(ByteBuffer.wrap("发送消息成功...".getBytes()));
selectionKey.interestOps(SelectionKey.OP_READ | SelectionKey.OP_WRITE);
}
}
iterator.remove();
}
}
}
}
Nio Client:
package com.lcy.jdk;
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.SocketChannel;
import java.nio.charset.Charset;
import java.util.Iterator;
/**
* 功能描述:
*
* @author liuchaoyong
* @version 1.0
* @date 2019/10/28 15:43
*/
public class NioSocketClient {
public static void main(String[] args) throws IOException {
SocketChannel sc = SocketChannel.open(new InetSocketAddress(55533));
sc.configureBlocking(false);
Selector selector = Selector.open();
sc.register(selector, SelectionKey.OP_READ);
sc.write(ByteBuffer.wrap("朋友你好".getBytes()));
selector.select();
Iterator<SelectionKey> iterator = selector.selectedKeys().iterator();
while (iterator.hasNext()) {
SelectionKey selectionKey = iterator.next();
SocketChannel socketChannel = (SocketChannel) selectionKey.channel();
if (selectionKey.isReadable()) {
ByteBuffer buffer = ByteBuffer.allocate(1024);
if(socketChannel.read(buffer) == -1){
System.out.println("未接收到信息...");
socketChannel.close();
}else {
buffer.flip();
String request = Charset.defaultCharset().decode(buffer).toString();
System.out.println("接收消息..." + request);
}
}
iterator.remove();
}
sc.close();
}
}