Java中Socket的用法

来源:互联网 发布:如何组建办公网络 编辑:程序博客网 时间:2024/06/05 08:32

一般简单用法

//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监听8080端口            ServerSocket server = new ServerSocket(8081);            //等待请求            Socket socket = server.accept();//只要在server监听到socket活动后启动socket进行通信。            //接受到请求后使用socket进行通信, 创建BufferedReader用于读取数据;            BufferedReader is = new BufferedReader(new InputStreamReader(socket.getInputStream()));            String line = is.readLine();//is 是 取得的客户端的 字符流中 的 文本内容            System.out.println(" received from client:  " + line);            //创建一个PrintWriter. 用于发送数据,,发送 数据用PrintWriter            PrintWriter pw = new PrintWriter(socket.getOutputStream());            pw.println(" received data: " + line);            pw.flush();            //关闭资源'            pw.close();            is.close();            socket.close();            server.close();        } catch ( Exception e) {            e.printStackTrace();        }    }}//CLient下的代码package Socket;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,跟本机的5554端口链接            Socket socket = new Socket("127.0.0.1", 8081);            //使用Socket 创建的PrintWriter和BufferedReader进行读写数据            PrintWriter pw = new PrintWriter(socket.getOutputStream());//PrintWriter 首先先将Client 的数据传给Server            BufferedReader is = new BufferedReader(new InputStreamReader(socket.getInputStream()));//然后Client将Server中的数据读取出来            //发送数据            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 ) {            e.printStackTrace();        }    }}

Java中网络通信是通过Socket实现的, Socket分为ServerSocket和Socket两大类,ServerSocket用于服务端,可以通过accept()方法监听请求,监听到请求后返回一个Socket对象,Socket用于具体完成数据传输,客户端 直接使用Socket发起请求并传输数据。

NioSocket简单用法

nio提供了ServerSocketChannel, 和ScocketChannel对应于Socket的ServerSocket和Socket.

package Socket;import java.awt.event.KeyEvent;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;public class NIOServer {    public static void main(String[] args) throws IOException {        //创建ServerSocketChannel ,监听8080端口        ServerSocketChannel ssc = ServerSocketChannel.open();        ssc.socket().bind(new InetSocketAddress(8080));        //设置为非阻塞模式        ssc.configureBlocking(false);        //为ssc注册选择器        Selector selector = Selector.open();        ssc.register(selector, SelectionKey.OP_ACCEPT);        //创建处理器        Handler handler = new Handler(1024);        while ( true ) {            //等待请求, 每次等待阻塞3s, 超过3s后线程继续向下运行, 如果传入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.handlerAccept(key);                    }                    //读数据                     if ( key.isReadable() ) {                        handler.handlerAccept(key);                    }                } catch ( Exception e ) {                    keyIter.remove();                    continue;                }                //处理完后, 从待处理的SelectionKey迭代器移除当前所使用的key                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 handlerAccept( 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 handlerRead( 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();//the limitis set to the current position and then the position is set to zero;                //将buffer中接收到的值按localCharset格式编码后保存到receivedString                String receivedString = Charset.forName(localCharset).newDecoder().decode(buffer).toString();                System.out.println("receiced form client: " + receivedString);                //返回数据给客户端                String sendString = "received data: " + receivedString;                buffer = ByteBuffer.wrap(sendString.getBytes(localCharset));                sc.write(buffer);                //关闭Socket                sc.close();            }        }    }}
原创粉丝点击