首页 / JAVA / 第四章、java中Socket的用法
第四章、java中Socket的用法
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了第四章、java中Socket的用法,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含5253字,纯文字阅读大概需要8分钟。
内容图文
![第四章、java中Socket的用法](/upload/InfoBanner/zyjiaocheng/837/8779a70e7c2e415d9681fb8d256aef0b.jpg)
1.普通Socket的用法
java中的通信时通过Socket实现的,Socket分为ServerSocket和Socket两大类。ServerSocket用于服务端,可以通过accept方法监听请求,监听到请求后返回Socket,Socket用于具体完整的数据传输,客户端直接使用Socket发起请求并传输数据。
服务端代码
package com.roy.socket; 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 Server { public static void main(String[] args) { try { //创建一个ServerSocket监听8080端口 ServerSocket serverSocket = new ServerSocket(8080); //等待请求,阻塞 Socket socket = serverSocket.accept(); //接受到请求后是同socket进行通信,创建BufferedReader用于读取数据 //InputStreamReader可以转换字节流为字符流 BufferedReader is = new BufferedReader(new InputStreamReader(socket.getInputStream())); String line = is.readLine(); System.out.println("received from client: "+ line); //创建printWriter,用于发送数据 PrintWriter pWriter = new PrintWriter(socket.getOutputStream()); pWriter.println("received data: " + line); pWriter.flush(); //关闭资源 pWriter.close(); is.close(); socket.close(); serverSocket.close(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
客户端代码
package com.roy.socket; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.Socket; import java.net.UnknownHostException; public class Client { public static void main(String[] args) { String msg = "Client data"; try { //创建一个Socket Socket socket = new Socket("127.0.0.1", 8080); //使用Socket创建printwriter和bufferedReader进行读写数据 PrintWriter printWriter = new PrintWriter(socket.getOutputStream()); BufferedReader is = new BufferedReader(new InputStreamReader(socket.getInputStream())); printWriter.println(msg); printWriter.flush(); String line = is.readLine(); System.out.println("received from server: " + line); printWriter.close(); is.close(); socket.close(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
2.NioSocket的用法
nio提供了相应的工具Serve和SocketChannel,它们分别对应原来的ServerSocket和Socket。
Buffer、Channel、Slector理解:NioSocket模式相当于现在的电商快递模式。Buffer就是要送的货物,Channel就是送货员(或者开往某个区域的配货车),Selector就是中转站的分捡员。
package com.roy.niosocket; import java.io.IOException; import java.net.InetSocketAddress; import java.nio.ByteBuffer; import java.nio.channels.SelectableChannel; 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; public class NIOServer { public static void main(String[] args) { //创建ServerSocketChannel,监听8080端口 try { ServerSocketChannel serverSocketChannel = ServerSocketChannel.open(); serverSocketChannel.socket().bind(new InetSocketAddress(8080)); //设置为非阻塞 serverSocketChannel.configureBlocking(false); //为serverSocketChannel注册选择器 Selector selector = Selector.open(); serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT); //创建处理器 Handler handler = new Handler(1024); while(true){ //等待请求,每次等待阻塞3秒,超过3秒后线程继续向下执行,如果传入0或者不传参数则将一直阻塞 if(selector.select(3000)==0){ System.out.println("等待请求超时-----"); continue; } System.out.println("处理请求----------"); //获取处理的selectionKey Iterator<SelectionKey> keyIter = selector.selectedKeys().iterator(); while(keyIter.hasNext()){ SelectionKey key = keyIter.next(); try { //接受到连接请求时 if (key.isAcceptable()) { handler.handleAccept(key); } //读数据 if (key.isReadable()) { handler.handleReader(key); } } catch (Exception e) { keyIter.remove(); continue; } //处理完成后,从待处理的SelectionKey迭代器中移除当前所使用的key keyIter.remove(); } } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } private static class Handler{ private int bufferSize = 1024; private String localCharset = "UTF-8"; public Handler() { // TODO Auto-generated constructor stub } public Handler(int bufferSize) { this(bufferSize,null); } public Handler(String localCharset) { this(-1,localCharset); } public Handler(int bufferSize,String localCharset){ if(bufferSize>0){ this.bufferSize = bufferSize; } if(localCharset!=null){ this.localCharset = localCharset; } } public void handleAccept(SelectionKey key) throws IOException{ SocketChannel sc = ((ServerSocketChannel)key.channel()).accept(); sc.configureBlocking(false); sc.register(key.selector(), SelectionKey.OP_READ, ByteBuffer.allocate(bufferSize)); } public void handleReader(SelectionKey key) throws IOException{ //获取channel SocketChannel sc = (SocketChannel) key.channel(); //获取buffer并重置 ByteBuffer buffer =(ByteBuffer) key.attachment(); buffer.clear(); //没有读到内容则关闭 if (sc.read(buffer)==-1) { sc.close(); }else { //将buffer转换为读状态 buffer.flip(); //将buffer中接受到的值按localCharset格式编码后保存到receivedString String receivedString = Charset.forName(localCharset).newDecoder().decode(buffer).toString(); System.out.println("received from client :" + receivedString); //返回数据给客户端 String sendString = "received data: "+receivedString; buffer = ByteBuffer.wrap(sendString.getBytes(localCharset)); sc.write(buffer); //关闭socket sc.close(); } } } }
内容总结
以上是互联网集市为您收集整理的第四章、java中Socket的用法全部内容,希望文章能够帮你解决第四章、java中Socket的用法所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。