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(); } } }}
阅读全文
0 0
- Java中Socket的用法
- Java 中Socket的用法
- Java中Socket的用法--Spring MVC
- java socket的用法
- java网络编程Socket中SO_LINGER选项的用法解读
- java中ServerSocket和Socket的简单用法
- java网络编程Socket中SO_LINGER选项的用法解读
- 拿来主义:java中socket和serversocket 的用法
- java网络编程Socket中SO_LINGER选项的用法解读
- java中ServerSocket 与 Socket的用法和区别
- (二)Java中Socket的用法-读书笔记
- Socket中select()的用法
- Java中的Socket的用法
- Java中的Socket的用法
- Java NIO操作Socket的用法
- java中socket的使用
- JAVA Socket用法详解
- java Socket用法详解
- flex
- linux comm命令使用简介
- Git远程操作详解
- Codeforces 265D Good Sequences 贪心+DP
- Linu安装MySQL
- Java中Socket的用法
- postgresql导入导出
- java.net.SocketException: Socket closed
- POJ 3177 Redundant Paths <边双连通分量>
- Android hdpi ldpi mdpi xhdpi xxhdpi适配详解
- SSM项目导出Excel操作
- Eclipse配置C/C++环境教程
- Eclipse代码逆向生成UML插件ObjectAid
- spring boot入门