Socket编程

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 端口错误出现的情况,图二则为正常情况)

Socket编程

Socket编程

 在窗口中按 "CTRL+]" ,可进入发送命令窗口

发送消息的命令为Send 字符串,返回到eclipse控制台可查看到发送的字符串

Socket编程

Socket编程

 解决传统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);
                }
            });
            
        }