Java 关于Socket
来源:互联网 发布:mac桌面文件 编辑:程序博客网 时间:2024/06/16 22:49
Java Socket主要有普通Socket和NioSocket
普通Socket又分为 ServerSocket和Socket两种,ServerSocket用于服务端,通过accept方法监听请求,然后返回给Socket。
客户端直接用Socket发起请求并传输数据。
Clinet
import java.io.BufferedReader;import java.io.InputStreamReader;import java.io.PrintWriter;import java.net.Socket;public class Client{ public static void main(String[] args) { String msg = "Client Data"; try { Socket socket = new Socket("127.0.0.1",10000); PrintWriter pw = new PrintWriter(socket.getOutputStream()); BufferedReader is = new BufferedReader(new InputStreamReader(socket.getInputStream())); pw.println(msg); pw.flush(); String line = is.readLine(); System.out.println("received from Server: " + line); pw.close(); is.close(); socket.close(); } catch (Exception e) { // TODO: handle exception } }}
Server
import java.io.BufferedReader;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 server = new ServerSocket(10000); Socket socket = server.accept(); BufferedReader is = new BufferedReader(new InputStreamReader(socket.getInputStream())); String line = is.readLine(); System.out.println("receive:"+line); PrintWriter pw = new PrintWriter(socket.getOutputStream()); pw.println("received data:"+line); pw.flush(); pw.close(); is.close(); socket.close(); server.close(); } catch (Exception e) { // TODO: handle exception } }}
java.nio包是Java在1.4之后增加的,用来提高I/O操作的效率。在nio包中主要包括以下几个类或接口:
Buffer:缓冲区,用来临时存放输入或输出数据。
Charset:用来把Unicode字符编码和其它字符编码互转。
Channel:数据传输通道,用来把Buffer中的数据写入到数据源,或者把数据源中的数据读入到Buffer。
Selector:用来支持异步I/O操作,也叫非阻塞I/O操作。
nio包中主要通过下面两个方面来提高I/O操作效率:
通过Buffer和Channel来提高I/O操作的速度。
通过Selector来支持非阻塞I/O操作。
import java.io.IOException;import java.net.InetSocketAddress;import java.net.ServerSocket;import java.net.SocketAddress;import java.net.SocketOption;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;import java.util.Set;import java.util.logging.Handler;public class NIOSocket { public static void main(String[] args) throws Exception { //创建SeverSocketChannel,监听8080 ServerSocketChannel ssc = ServerSocketChannel.open(); ssc.socket().bind(new InetSocketAddress(8080)); //设置非阻塞 ssc.configureBlocking(false); Selector selector = Selector.open(); ssc.register(selector, SelectionKey.OP_ACCEPT); Handler handler = new Handler(1024); while(true){ if(selector.select(3000) == 0){ System.out.println("等待连接超时。。"); continue; } System.out.println("处理请求。。"); Iterator<SelectionKey> keyIter = selector.selectedKeys().iterator(); while(keyIter.hasNext()){ SelectionKey key = keyIter.next(); try { if(key.isAcceptable()){ handler.handleAccept(key); } if(key.isReadable()){ handler.handleRead(key); } } catch (Exception e) { // TODO: handle exception } keyIter.remove(); } } } private static class Handler{ private int bufferSize = 1024; private String localCharset = "utf-8"; public Handler(){} 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 handleRead(SelectionKey key)throws IOException{ SocketChannel sc = (SocketChannel)key.channel(); ByteBuffer buffer = (ByteBuffer)key.attachment(); buffer.clear(); if(sc.read(buffer) == -1){ sc.close(); }else{ buffer.flip(); String receivedString = Charset.forName(localCharset).newDecoder() .decode(buffer).toString(); System.out.println("received form client: " + receivedString); String sendString = "received data: " + receivedString; buffer = ByteBuffer.wrap(sendString.getBytes(localCharset)); sc.write(buffer); sc.close(); } } }}
0 0
- Java 关于Socket
- 关于java socket的问题
- JAVA socket 关于DNS 缓存
- 关于java web 启动socket
- 关于Java Socket编程的详细介绍
- 关于Java Socket编程的详细介绍
- 关于Java socket通信的随笔
- java关于socket的ssl双向认证。
- 关于java socket 关闭的思考.
- 关于java Socket Connection timed out: connect
- 关于java的Socket编程复习
- 关于Socket的使用以及java实现
- 关于Java Socket编程的详细介绍
- 关于socket
- 关于socket
- 关于Socket
- 关于socket
- 关于socket
- Android中的闹钟与通知(附Demo)
- MIXER as Reinforcement Learning
- SSM配置 的官网配置网址
- 1062. Talent and Virtue (25)
- 3、relative与absolute的主要区别:
- Java 关于Socket
- CS1010号错误是什么
- 父子游标不可共享的情况分析
- JAVA动态代理学习
- [VSLAM] RTAB-Map 安装遇到问题及解决
- 产生流水号
- java基础知识(第一章)
- HDOJ 1004 Java 答案
- Android加载网页控件WebView