(UDP)循环输入聊天

来源:互联网 发布:电脑报 淘宝 编辑:程序博客网 时间:2024/05/13 01:49

1 . 实现聊天功能,发送端发送消息,接收端接收,然后回复消息,刚才第一次发送数据的发送端再接收.
2 . 其实也没有真正的发送端接收端,只是相对另一端说.
3 . 当接收到数据,该回复的时候,创建一个Datagrampacket,这个构造参数的 packet.getAddress(), packet.getPort()的地址和端口要get一下.UDP是面向无连接的,所以发送数据时的packet对象创建的时候要指定要发送的地址和端口号,回复的packet对象创建的时候也要指定要发送的地址和端口号.接收端和发送端都在同一个电脑上,只需要get端口号就行,而且每次get到的端口号都不一样.

发送端:

package test;import java.io.IOException;import java.net.DatagramPacket;import java.net.DatagramSocket;import java.net.InetAddress;import java.net.SocketException;import java.net.UnknownHostException;import java.util.Scanner;/** * UDP循环输入聊天 */public class Test {    public static void main(String[] args) {        //创建socket        DatagramSocket socket = null;        try {            socket = new DatagramSocket();            Scanner scanner = new Scanner(System.in);            while(true){                //输入数据                String string = scanner.next();                //创建包                //InetAddress.getLocalHost()为接收端的地址,也就是本机                DatagramPacket packet = new DatagramPacket(string.getBytes(), string.getBytes().length, InetAddress.getLocalHost(), 6677);                //发送数据                socket.send(packet);                //接收                byte[] bs = new byte[1024];                DatagramPacket packet2 = new DatagramPacket(bs,bs.length);                socket.receive(packet2);                String string2 = new String(packet2.getData(),0,packet2.getLength());                System.out.println("接收端发送来:"+string2);            }        } catch (SocketException e) {            // TODO Auto-generated catch block            e.printStackTrace();        } catch (UnknownHostException e) {            // TODO Auto-generated catch block            e.printStackTrace();        } catch (IOException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }finally{            if(socket!=null){                socket.close();            }        }    }}

接收端:

package test;import java.io.IOException;import java.net.DatagramPacket;import java.net.DatagramSocket;import java.net.InetAddress;import java.net.SocketException;import java.util.Scanner;public class Recive {    public static void main(String[] args) {        DatagramSocket socket = null;        try {            //创建socket            socket = new DatagramSocket(6677);            while(true){                byte[] bs = new byte[1024];                DatagramPacket packet = new DatagramPacket(bs,bs.length);                socket.receive(packet);                String string = new String(packet.getData(),0,packet.getLength());                System.out.println("发送来:"+string);                //回复                Scanner scanner = new Scanner(System.in);                String string2 = scanner.next();                DatagramPacket packet2 = new DatagramPacket(string2.getBytes(),string2.getBytes().length,packet.getAddress(),packet.getPort());                socket.send(packet2);            }        } catch (SocketException e) {            // TODO Auto-generated catch block            e.printStackTrace();        } catch (IOException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }    }}

总结:
* 发送方: socket 没有参数的
* 接收方 : socket 是有端口号
* send 的 packet 是带有 byte lenth InetAddress port
* receive的 packet 是带有 byte lenth

原创粉丝点击