网络通信(Server和Client)

1. OSI结构

OSI模型 数据单位协议
应用层应用软件
表示层解析
会话层建立通道
传输层段 传输和端口号
网络层数据包(路由器)
链路层帧 (frame交换机) mac地址的(解)封装
物理层比特(bit,网线) 物理设备,1 0比特流

1. TCP : 可靠的,,,三次握手,进行数据传输
2. UDP : 不可靠,,,
具体可以参考
http://blog.csdn.net/libaineu2004/article/details/39829889

2.Tcp Socket通信

  1. Socket:套接字是基于tcp协议的
  2. 标识一个网络地址 www.baidu.com
  3. 主机名 ::www.c

3.控制台流获取方式

控制台输入流 : 字符流=字节流 [+码表 +缓存]

 InputStream in2 = System.in; // 字节流
 InputStreamReader isr = new InputStreamReader(in2);
 BufferedReader br = new BufferedReader(isr);

4.客户端与服务器通信

客户端(四步)
  1. 有一个socket:最好是指定ip,端口
  2. 获取到输出流
  3. 写数据
  4. 关流 关socket就可以了!

服务端代码

public class Server {
    public static void main(String[] args) {
        String strRead;
        String strwrite;
        ServerSocket serverSocket = null;
        Socket socket = null;
        try {
            serverSocket = new ServerSocket(9090);
            socket = serverSocket.accept();
            System.out.println("有人来了");
            // 读取控制台
            InputStream in2 = System.in; // 字节流
            InputStreamReader isr = new InputStreamReader(in2);// 字节流转字符流
            BufferedReader br = new BufferedReader(isr);

            InputStream inputStream = socket.getInputStream();// 输入流
            OutputStream outputStream = socket.getOutputStream();// j输出流
            while (true) {
                // 读
                byte[] b = new byte[1024];
                int length = inputStream.read(b);// s
                strRead = new String(b, 0, length);
                System.out.println(strRead);
                if ("Bye".equals(strRead)) {
                    break;
                }
                // 写
                String str = br.readLine();
                outputStream.write(str.getBytes());
                if ("Bye".equals(str)) {
                    break;
                }
            }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally {
            try {
                socket.close();
                serverSocket.close();
                System.out.println("serverSocket.close();");
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
}

客户端代码

 public class Client {
    public static void main(String[] args) {
        String strRead = "";
        Socket socket = null;
        try {
            InputStream in2 = System.in; // 字节流
            InputStreamReader isr = new InputStreamReader(in2);// 字节流转字符流
            BufferedReader br = new BufferedReader(isr);
            socket = new Socket("localhost", 9090);
            InputStream inputStream = socket.getInputStream();// 输入流
            OutputStream outputStream = socket.getOutputStream();// j输出流
            // String content = "你好啊,我是客户端,你是";
            // outputStream.write(content.getBytes());
            // 读数据
            while (true) {
                // 写
                String str = br.readLine();
                outputStream.write(str.getBytes());
                if ("Bye".equals(str)) {
                    break;
                }
                // 读
                byte[] b = new byte[1024];
                int length = inputStream.read(b);// s
                strRead = new String(b, 0, length);
                System.out.println(strRead);
                if ("Bye".equals(strRead)) {
                    break;
                }
            }
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally {
            try {
                socket.close();
                System.out.println("socket.close();");
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

    }
}
服务器(四步)
  1. serversocket
  2. 开始接受客户端(干活)
  3. 已经有socket1,拿到输入流
  4. 关闭:先关闭所有socket然后关闭serversoc public class Servepublic static
    }

多个客户端与服务器通信

注意端口占用问题

服务端代码

public class Server {
    public static void main(String[] args) {
        System.out.println("服务器开启!");
        try {
            ServerSocket serverSocket = new ServerSocket(9090);
            while (true) {
                Socket socket = serverSocket.accept();//
                ServerThread serverThread = new ServerThread(socket);
            }
        } catch (Exception e) {
            // TODO: handle exception
        }
    }
}
public class ServerThread implements Runnable {
    Socket socket;
    ServerSocket serverSocket = null;
    /** 生成流 **/
    InputStream inputStream = null;// 输入流
    OutputStream outputStream = null;// 输出流
    // 读取控制台
    InputStream in2 = System.in;// 字节流
    InputStreamReader isr = new InputStreamReader(in2);// 字节流转字符流
    BufferedReader br = new BufferedReader(isr);
    /** 客户端交互 **/
    String receive = "";
    String send = "";

    public ServerThread(Socket socket) {
        this.socket = socket;
        try {
            outputStream = socket.getOutputStream();// 输出流
            inputStream = socket.getInputStream();// 输入流
            new Thread(this).start();
            while (true) {
                send = br.readLine();
                outputStream.write(send.getBytes());
                if ("bye".equals(receive)) {
                    break;
                }
            }
        } catch (Exception e) {
            // TODO: handle exception
        }
    }

    public void run() {
        while (true) {
            // 读客户端的消息:等!!!
            byte[] b = new byte[1024];
            int length;
            try {
                length = inputStream.read(b);
                receive = new String(b, 0, length);
                System.out.println("receive:" + receive);
                if ("bye".equals(receive)) {
                    break;
                }
                System.out.println("请回复客户端:");
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } // 等!!!
        }
    }
}

客户端代码:

public class Client {
    public static void main(String[] args) {
        Socket socket = null;
        try {
            socket = new Socket("localhost", 9090);
            ClientThread clientThread = new ClientThread(socket);
        } catch (Exception e) {
            // TODO: handle exception
        }
    }
}
public class ClientThread implements Runnable {
    Socket socket;
    // ServerSocket serverSocket = null;
    /** 生成流 **/
    InputStream inputStream = null;// 输入流
    OutputStream outputStream = null;// j输出流
    // 读取控制台
    InputStream in2 = System.in;// 字节流
    InputStreamReader isr = new InputStreamReader(in2);// 字节流转字符流
    BufferedReader br = new BufferedReader(isr);
    /** 客户端交互 **/
    String receive = "";
    String send = "";

    public ClientThread(Socket socket) {
        this.socket = socket;
        try {
            outputStream = socket.getOutputStream();// j输出流
            inputStream = socket.getInputStream();// 输入流
            new Thread(this).start();
            while (true) {
                send = br.readLine();
                outputStream.write(send.getBytes());
                if ("bye".equals(receive)) {
                    break;
                }
            }
        } catch (Exception e) {
            // TODO: handle exception
        }
    }
    public void run() {
        while (true) {
            // 读客户端的消息:等!!!
            byte[] b = new byte[1024];
            int length;
            try {
                length = inputStream.read(b);
                receive = new String(b, 0, length);
                System.out.println("receive:" + receive);
                if ("bye".equals(receive)) {
                    break;
                }
                System.out.println("请回复客户端:");
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } // 等!!!
        }
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值