我的定位:中高级人才(框架熟练、Java语法精通、数据库会用、Linux会用、中间件会用、有大数据经验!)
开始,我以为自己什么都知道。后来发现,其实我什么都不知道。

Socket编程

package cn.bdqn.tcp;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * @author 小豆腐
 * 
 * 服务器(超市)
 *
 */
public class ServerSocketTest {

    public static void main(String[] args) {
        ServerSocket serverSocket=null;
        Socket socket=null;  //顾客
        InputStream stream=null; //购物车
        BufferedReader br=null;  //收银员
        
        OutputStream os=null; //收银员的回应语句
        try {
            //创建一个指定位置的超市
             serverSocket=new ServerSocket(8800);
             //超市开门 等待顾客上门购物
             socket=serverSocket.accept();
             //顾客开始购物
             stream=socket.getInputStream();
             /**
              * 买单
              * BufferedReader收银员拿InputStreamReader(扫码枪)
              * 扫购物车中的物品 stream
              */
             br=new BufferedReader(new InputStreamReader(stream));
             /**
              * 怎么扫码的?只要是购物车中有物品就 一个一个扫码
              * info理解成 账单
              * 每扫描一次,账单就多一个记录
              */
             String  info=null;
             while((info=br.readLine())!=null){ //说明购物车中有东西
                 System.out.println("顾客的账单====》"+info);
             }
             //只是说 顾客结账完毕 并没有走出超市(关闭)
             socket.shutdownInput();
             os=socket.getOutputStream(); //打开输出流
              //服务员说:谢谢光临!
             os.write("谢谢您的光临!".getBytes());
        } catch (IOException e) {
            e.printStackTrace();
        }finally{
            try {
                os.close();
                //超市关门   这个超市 只接待了一个顾客 就关门了???
                br.close();
                stream.close();
                socket.close();
                serverSocket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            
            
        }

    }

}
package cn.bdqn.tcp;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;

/**
 * 
 * @author 小豆腐
 *
 *
 *客户端(顾客)
 */
public class SocketTest {

    public static void main(String[] args) {
        Socket socket=null;  //顾客
        OutputStream os=null; //钱包
        
        InputStream stream=null; //账单
        BufferedReader br=null;  //收银员
        
        try {
            //去哪个地方(localhost)的哪个超市(8800)购物?
            socket=new Socket("localhost", 8800);
            //打开钱包,疯狂购物   花钱===》出! 
            os=socket.getOutputStream();
            //开始消费  买什么东西?
            os.write("我买了一束玫瑰花!".getBytes());
            //购物完毕
            socket.shutdownOutput();
            
            //接收收银员的回应
            stream=socket.getInputStream();
            br=new BufferedReader(new InputStreamReader(stream));
            String  info=null;
            while((info=br.readLine())!=null){
                System.out.println(info);
            }
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally{
            //关闭资源
            try {
                br.close();
                stream.close();
                os.close();
                socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            
        }
        

    }

}

传递一个对象

package cn.bdqn.tcp.object;

import java.io.Serializable;

/**
 * 
 * @author 小豆腐
 *  用户的实体类
 */
public class User  implements Serializable  {
    
    private String  name;
    private String  pwd;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getPwd() {
        return pwd;
    }
    public void setPwd(String pwd) {
        this.pwd = pwd;
    }
    public User(String name, String pwd) {
        super();
        this.name = name;
        this.pwd = pwd;
    }
    public User() {
        super();
    }
    @Override
    public String toString() {
        return "User [name=" + name + ", pwd=" + pwd + "]";
    }
    

}
package cn.bdqn.tcp.object;

import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * 
 * @author 小豆腐
 *
 *服务器
 */
public class ServerLogin {

    public static void main(String[] args) {
        ServerSocket serverSocket=null;
        Socket socket=null;
        InputStream is=null;
        OutputStream os=null;
        //反序列化
        ObjectInputStream ois=null;
        
        try {
            //创建serverSocket
            serverSocket=new ServerSocket(8800);
            //监听客户端的登录信息
            socket=serverSocket.accept();
            //打开输入输出流
            is=socket.getInputStream();
            os=socket.getOutputStream();
            ois=new ObjectInputStream(is);
            //获取登录用户的信息
            User user=(User) ois.readObject();
            System.out.println("登录用户的用户名是:"+user.getName());
            System.out.println("登录用户的密码是:"+user.getPwd());
            socket.shutdownInput();
            
            //服务器给客户端一个响应
            os.write("恭喜您!登录成功!".getBytes());
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }finally{
            try { //释放资源
                os.close();
                socket.close();
                ois.close();
                is.close();
                serverSocket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        
        

    }

}
package cn.bdqn.tcp.object;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;

/**
 * 
 * @author 小豆腐
 *
 *客户端
 */
public class ClientLogin {

    public static void main(String[] args) {
        Socket socket=null;
        InputStream is=null;
        OutputStream os=null;
        //序列化
        ObjectOutputStream oos=null;
        BufferedReader br=null;
        
        try {
            //创建socket对象
            socket=new Socket("localhost", 8800);
            //打开输入输出流
            is=socket.getInputStream();
            os=socket.getOutputStream();
            //创建一个登录的对象
            User user=new User("小白", "123456");
            oos=new ObjectOutputStream(os);
            //开始把对象发送给服务器
            oos.writeObject(user);
            socket.shutdownOutput();
            
            //接收服务器的回应
            br=new BufferedReader(new InputStreamReader(is));
            String  info=null;
            while((info=br.readLine())!=null){
                System.out.println("服务器给我们的回应是:"+info);
            }
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally{
            try { //释放资源
                br.close();
                socket.close();
                oos.close();
                os.close();
                is.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        
        
        
    }

}

 服务器循环监听客户端的登陆信息, 客户端代码和User类不变

package cn.bdqn.tcp.thread;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * 
 * @author 小豆腐
 *  服务器
 */
public class ServerLogin {
    public static void main(String[] args) {
        ServerSocket serverSocket=null;
        Socket socket=null;
        try {
            //创建服务器的serverSocket对象
            serverSocket=new ServerSocket(8800);
            //一直监听
            while(true){
                socket=serverSocket.accept();
                //创建对应的线程类
                LoginThread thread=new LoginThread(socket);
                //启动
                thread.start();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        

    }

}

需要的线程类

package cn.bdqn.tcp.thread;

import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.OutputStream;
import java.net.Socket;

import cn.bdqn.tcp.object.User;
/**
 * 
 * @author 小豆腐
 * 服务器监听的线程类
 *
 */
public class LoginThread extends Thread {
    Socket socket=null;
    
    
    public LoginThread(Socket socket) {
        this.socket=socket;
    }

    @Override
    public void run() {
        InputStream is=null;
        OutputStream os=null;
        //反序列化
        ObjectInputStream ois=null;
        try {
            //打开输入输出流
            is=socket.getInputStream();
            os=socket.getOutputStream();
            ois=new ObjectInputStream(is);
            //获取登录用户的信息
            User user=(User) ois.readObject();
            System.out.println("登录用户的用户名是:"+user.getName());
            System.out.println("登录用户的密码是:"+user.getPwd());
            socket.shutdownInput();
            //服务器给客户端一个响应
            os.write("恭喜您!登录成功!".getBytes());
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }finally{
            try { //释放资源
                os.close();
                socket.close();
                ois.close();
                is.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    
    
    
}

 

posted @ 2017-06-29 13:17  想太多先森  阅读(168)  评论(0编辑  收藏  举报