网络编程

8 网络编程

8.1 IP地址 端口

IP地址

在网络中每台计算机都必须有一个的IP地址;例如:192.168.1.100 

127.0.0.1代表本机(Localhost)

端口

两台计算机进行连接,总有一台服务器,一台客户端。
服务器和客户端之间的通信通过端口进行 例如 8080

8.2 获取本机IP地址

public class Test {

    public static void main(String[] args) throws UnknownHostException {

       InetAddress host=InetAddress.getLocalHost();

       String ip=host.getHostAddress();

       System.out.println("本机ip地址:"+ip); // 本机ip地址:192.168.25.1

    }

}

8.3 Socket

建立连接

public class Server {

    public static void main(String[] args) {

       try {

           //服务端打开端口8888

           ServerSocket ss=new ServerSocket(8888);

           //在8888端口上监听 是否有连接请求

           System.out.println("在8888端口上监听");

           Socket s = ss.accept();

           System.out.println("有连接:"+s);

           s.close();

           ss.close();

       } catch (IOException e) {

           // TODO Auto-generated catch block

           e.printStackTrace();

       }

    }

}

public class Client {

    public static void main(String[] args) {

       try {

           //在8888端口请求连接

           Socket s = new Socket("127.0.0.1",8888); //Socket[addr=/127.0.0.1,port=8888,localport=61557]

//         Socket s = new Socket("localhost",8888); //Socket[addr=localhost/127.0.0.1,port=8888,localport=61567]

           System.out.println(s);

           s.close();

       } catch (IOException e) {

           // TODO Auto-generated catch block

           e.printStackTrace();

       }

    }

}

收发数字

一旦建立了连接,服务端和客户端就可以通过Socket进行通信了 
1. 客户端打开输出流,并发送数字 110 
2. 服务端打开输入流,接受数字 110,并打印

public class Server {

    public static void main(String[] args) {

       try {

           //服务端打开端口8888

           ServerSocket ss=new ServerSocket(8888);

           //在8888端口上监听 是否有连接请求

           System.out.println("在8888端口上监听");

           Socket s = ss.accept();

           //打开输入流

           InputStream is=s.getInputStream();

           int msg=is.read();

           System.out.println(msg);

           is.close();

           s.close();

           ss.close();

       } catch (IOException e) {

           // TODO Auto-generated catch block

           e.printStackTrace();

       }

    }

}

public class Client {

    public static void main(String[] args) {

       try {

           //在8888端口请求连接

           Socket s = new Socket("127.0.0.1",8888); //Socket[addr=/127.0.0.1,port=8888,localport=61557]

           // 打开输出流

           OutputStream os=s.getOutputStream();

           // 发送数字110 到服务端

           os.write(110);

           os.close();  

           s.close();

       } catch (IOException e) {

           // TODO Auto-generated catch block

           e.printStackTrace();

       }

    }

}

收发字符串

直接使用字节流收发字符串比较麻烦,使用数据流对字节流进行封装,这样收发字符串就容易了 
1. 把输出流封装在DataOutputStream中 
使用writeUTF发送字符串 "Hello Woeld!" 
2. 把输入流封装在DataInputStream 
使用readUTF读取字符串,并打印

public class Server {

    public static void main(String[] args) {

       try {

           //服务端打开端口8888

           ServerSocket ss=new ServerSocket(8888);

           //在8888端口上监听 是否有连接请求

           System.out.println("在8888端口上监听");

           Socket s = ss.accept();

           //打开输入流

           InputStream is=s.getInputStream();

           // 把输入流封装在DataInputStream

           DataInputStream dis=new DataInputStream(is);

           //使用readUTF读取字符串

           String msg = dis.readUTF();

           System.out.println(msg);

           dis.close();

           is.close();

           s.close();

           ss.close();

       } catch (IOException e) {

           // TODO Auto-generated catch block

           e.printStackTrace();

       }

    }

}

public class Client {

    public static void main(String[] args) {

       try {

           //在8888端口请求连接

           Socket s = new Socket("127.0.0.1",8888); //Socket[addr=/127.0.0.1,port=8888,localport=61557]

           // 打开输出流

           OutputStream os=s.getOutputStream();

           //把输出流封装在DataOutputStream中

            DataOutputStream dos = new DataOutputStream(os);

            dos.writeUTF("Hello World!");

            dos.close();

           os.close();  

           s.close();

       } catch (IOException e) {

           // TODO Auto-generated catch block

           e.printStackTrace();

       }

    }

}

8.4 多线程

接受和发送都在主线程中,不能同时进行。 为了实现同时收发消息,基本设计思路是把收发分别放在不同的线程中进行
1. SendThread 发送消息线程
2. RecieveThread 接受消息线程
3. Server一旦接受到连接,就启动收发两个线程
4. Client 一旦建立了连接,就启动收发两个线程

public class Server {

    public static void main(String[] args) {

       try {

            ServerSocket ss = new ServerSocket(8888);

            System.out.println("监听在端口号:8888");

            Socket s = ss.accept();

            //启动发送消息线程

            new SendThread(s).start();

            //启动接受消息线程

            new RecieveThread(s).start();

        } catch (IOException e) {

            // TODO Auto-generated catch block

            e.printStackTrace();

        }

    }

}

public class Client {

    public static void main(String[] args) {

        try {

            Socket s = new Socket("127.0.0.1", 8888);

            // 启动发送消息线程

            new SendThread(s).start();

            // 启动接受消息线程

            new RecieveThread(s).start();

        } catch (UnknownHostException e) {

            // TODO Auto-generated catch block

            e.printStackTrace();

        } catch (IOException e) {

            // TODO Auto-generated catch block

            e.printStackTrace();

        }

    }

}

public class RecieveThread extends Thread {

    private Socket s;

    public RecieveThread(Socket s) {

        this.s = s;

    }

    public void run() {

        try {

            InputStream is = s.getInputStream();

            DataInputStream dis = new DataInputStream(is);

            while (true) {

                String msg = dis.readUTF();

                System.out.println(msg);

            }

        } catch (IOException e) {

            // TODO Auto-generated catch block

            e.printStackTrace();

        }

    }

}

public class SendThread extends Thread {

    private Socket s;

    public SendThread(Socket s){

        this.s = s;

    }

    public void run(){

        try {

            OutputStream os = s.getOutputStream();

            DataOutputStream dos = new DataOutputStream(os);

            while(true){

                Scanner sc = new Scanner(System.in);

                String str = sc.next();

                dos.writeUTF(str);

            }

        } catch (IOException e) {

            // TODO Auto-generated catch block

            e.printStackTrace();

        }

    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值