网络编程(UDP)

来源:互联网 发布:sql存储过程返回值 编辑:程序博客网 时间:2024/05/02 01:16

网络编程(UDP)

网络编程的三要素:
1.IP:用来标识一台计算机(唯一性)
2.(逻辑)端口:用来标识某一进程的唯一性
3.传输协议:UDP/TCP

DOS:ipconfig /all :查看IP地址DOS: hostnmae :查看主机名

UDP:
俩端(服务端,客户端)不需要建立就连接
传输的数据大小有限制,不超过64KB
不可靠连接(效率高)

TCP:
俩端需要建立连接
传输的数据大小没有限制
可靠连接(效率不高)

InetAddress
此类表示互联网协议(IP)地址

常用方法:
static InetAdress getByName(String host);
给定主机名的情况下确定主机名的IP地址
String host :主机名或IP字符串

    1.getHostAdress():获取IP    2.getHostName():获取主机名

DatagramSocket
此类表示用来发送和接收数据报包的套接字

[发送端]    步骤:        创建客户端Socket 对象:DatagramSocket(int port:端口号(0~65535),InetAddress laddr)        创建数据报包的对象:DatagramPocket        发送:send        释放资源    代码:        public static void main(String[] args) throws Exception {                //创建发送端对象                DatagramSocket ds = new DatagramSocket();                BufferedReader br = new BufferedReader(new InputStreamReader(System.in));                System.out.println("请输入消息");                String s ;                while((s = br.readLine())!=null){                    System.out.println("请输入消息");                    byte[] buf = s.getBytes();                    //创建数据报包                    DatagramPacket dp = new DatagramPacket(buf, buf.length,                            InetAddress.getByName("192.168.0.27"), 8887);                    //发送                    ds.send(dp);                }                //释放资源                ds.close();            }        }[服务端]    步骤:        创建服务端Socket对象        创建数据报包用来接收数据        接收数据:receive        解析数据        释放资源    代码:        public static void main(String[] args) throws Exception {            // 建立服务端对象            DatagramSocket ds = new DatagramSocket(8887);            while (true) {                byte[] bys = new byte[1024];                // 创建数据报包用来接收对象                DatagramPacket dp = new DatagramPacket(bys, bys.length);                //接收数据                ds.receive(dp);                //解析数据                byte[] data = dp.getData();                System.out.println(new String(data,0,data.length));            }        }    结果:        请输入消息        你好        请输入消息        Hello        请输入消息        null        请输入消息        请输入消息        你好        Hello        null

需求:
编写程序,通过UDP协议,完成多线程版本的聊天室程序。

代码:    public class UDPClient implements Runnable {        DatagramSocket ds;        public UDPClient(DatagramSocket ds) {            this.ds = ds;        }        @Override        public void run() {            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));            System.out.println("请输入消息");            String s;            try {                while ((s = br.readLine()) != null) {                    System.out.println("请输入消息");                    byte[] buf = s.getBytes();                    // 创建数据报包                    DatagramPacket dp = new DatagramPacket(buf, buf.length,                             InetAddress.getByName("192.168.0.27"), 8887);                    // 发送数据                    ds.send(dp);                }            } catch (IOException e) {                // TODO Auto-generated catch block                e.printStackTrace();            }        }    }    public class UDPServer implements Runnable {        DatagramSocket ds;        public UDPServer(DatagramSocket ds) {            this.ds = ds;        }        @Override        public void run() {            try {                while (true) {                    byte[] bys = new byte[1024];                    // 创建数据报包用来接收对象                    DatagramPacket dp = new DatagramPacket(bys, bys.length);                    // 接收数据                    ds.receive(dp);                    // 解析数据                    byte[] data = dp.getData();                    System.out.println(new String(data, 0, data.length));                }            } catch (IOException e) {                // TODO Auto-generated catch block                e.printStackTrace();            }        }    }    public class UDPTest {        public static void main(String[] args) throws Exception {            // 创建服务端对象            DatagramSocket receive = new DatagramSocket(8887);            // 创建发送端对象            DatagramSocket send = new DatagramSocket();            // 启动线程            new Thread(new UDPServer(receive)).start();            new Thread(new UDPClient(send)).start();        }    }    结果:    请输入消息    nihao     请输入消息    nihao     请输入消息    再见     请输入消息    再见