java socket编程开发简单例子 与 nio非阻塞通道

时间:2021-10-09 16:27:49

基本socket编程

1、以下只是简单例子,没有用多线程处理,只能一发一收(由于scan.nextLine()线程会进入等待状态),使用时可以根据具体项目功能进行优化处理

2、以下代码使用了1.8新特性,如果要测试以下代码,java版本不能低于1.8

3、如果发送的信息需要安全保护,也可以使用安全套接字,SSLSocket例子

使用socket编程需要注意的两个方法,sendUrgentData 与 setOOBInline;sendUrgentData是发送紧急数据用,只可以发送ASCII码,可用于判断远程链接是否断开;setOOBInline设置是否接收紧急数据,默认false丢弃,特别注意的是开启接收紧急数据,在获取数据时,没有区分普通数据与紧急数据方法的支持。

    // 客户端
public static void main(String[] args) {
try (Scanner scan = new Scanner(System.in);
Socket client = new Socket("127.0.0.1", 8484);
PrintWriter writer = new PrintWriter(client.getOutputStream());
BufferedReader reader = new BufferedReader(new InputStreamReader(client.getInputStream()));) {
while (true) {
// writer.print(scan.nextLine() + "\n");
// Writer 的 write(scan.nextLine() + "\n");方法
// 注意:由于服务器端是使用readLine,如果是用上面两种方式写入,必须加换行符,否则readLine是读取不到数据的
writer.println(scan.nextLine());
writer.flush();
while (reader.ready()) {
System.out.println(reader.readLine());
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
    // 服务端
public static void main(String[] args) {
try (Scanner scan = new Scanner(System.in);
ServerSocket server = new ServerSocket(8484);
Socket sc = server.accept();
BufferedReader reader = new BufferedReader(new InputStreamReader(sc.getInputStream()));
PrintWriter writer = new PrintWriter(sc.getOutputStream());) {
while (true) {
writer.println(scan.nextLine());
writer.flush();
while (reader.ready()) {
System.out.println(reader.readLine());
}
} } catch (Exception e) {
e.printStackTrace();
}
}

nio非阻塞socket通道编程
这里简单介绍:参考源 http://www.ibm.com/developerworks/cn/education/java/j-nio/j-nio.html
1、ServerSocketChannel 相当于封装的ServerSocket
2、SocketChannel 相当于封装的Socket
3、通过将ServerSocketChannel 与 SocketChannel 注册到选择器Selector中
4、选择器中通过selector.select()线程堵塞的方式去获取有事件发生的Channel,类似于server.accept()的堵塞方式
5、如果有事件发生,通过selector.selectedKeys()获取到所有发生事件的注册信息
6、通过注册selectedKey获取到实际的通道对象