Socket编程
传统Socket编程(服务端)
package org.hxm.nett.one; import java.io.IOException; import java.io.InputStream; import java.net.ServerSocket; import java.net.Socket; /** * 传统socket * @author Administrator * */ public class OioServer { public static void main(String[] args) throws Exception { //创建socket服务,监听10101端口 ServerSocket server=new ServerSocket(10101); System.out.println("服务器启动!"); //获取一个套接字(阻塞) Socket socket = server.accept(); //业务处理 handler(socket); } /** * 读取数据 * @param socket * @throws Exception */ public static void handler(Socket socket){ try { byte[] bytes = new byte[1024]; InputStream inputStream = socket.getInputStream(); while(true){ //读取数据(阻塞) int read = inputStream.read(bytes); if(read != -1){ System.out.println(new String(bytes, 0, read));//注意此处会出现中文乱码 原因是因为socket默认编码是 GBK
//处理办法是new String(bytes, 0, read,"GBK") }else{ break; } } } catch (Exception e) { e.printStackTrace(); }finally{ try { System.out.println("socket关闭"); socket.close(); } catch (IOException e) { e.printStackTrace(); } } } }
启动Socket服务端(启动main)方法
debug启动会发现在 Socket socket = server.accept(); 停止不动进行阻塞
测试连接
windows 下Cmd打开命令窗口,输入telnet ip 端口可连接到服务端(笔者的是 telnet 127.0.0.1 10101,图一为ip 端口错误出现的情况,图二则为正常情况)
在窗口中按 "CTRL+]" ,可进入发送命令窗口
发送消息的命令为Send 字符串,返回到eclipse控制台可查看到发送的字符串
解决传统socket编程的阻塞问题
ExecutorService newCachedThreadPool = Executors.newCachedThreadPool(); //创建socket服务,监听10101端口 ServerSocket server=new ServerSocket(10101); System.out.println("服务器启动!"); while(true){ //获取一个套接字(阻塞) final Socket socket = server.accept(); System.out.println("来个一个新客户端!"); newCachedThreadPool.execute(new Runnable() { @Override public void run() { //业务处理 handler(socket); } }); }
作者:诗和远方
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.