首页 > 编程语言 > 详细

[Java]网络编程

时间:2020-05-29 17:02:15      阅读:58      评论:0      收藏:0      [点我收藏+]

[Java]网络编程

一、什么是网络编程?

  • 网络编程是指编写运行在多个设备(计算机)的程序,这些设备都通过网络连接起来。

  • 网络编程即使用套接字(一种通信机制)来达到进程间通信,现在一般称为TCP/IP编程。

  • 通信协议的参考模型:OSITCP/IP

    技术分享图片

  • IP地址用来标识一台计算机,端口号用来区分这些不同的程序,例如127.0.0.1:8080

  • TCP协议UDP协议的不同:

    • TCP和UDP位于同一层,都是建立在IP层的基础之上。由于两台电脑之间有不同的IP地址,因此两台电脑就可以区分开来,也就可以互相通话了。
    • TCP是可靠的连接,TCP就像打电话,需要先打通对方电话,等待对方有回应后才会跟对方继续说话,也就是一定要确认可以发信息以后才会把信息发出去。
    • UDP是不可靠的连接,就好比发短信,发出去就可以了,对方有没有接收到它都不管。
    • TCP传送数据虽然可靠,但传送得比较慢;UDP传送数据不可靠,但是传送得快。

二、UDP编程

  • DatagramSocket:用于发送或接收数据包的套接字
  • DatagramPacket:数据包

接收端:

public class UdpReceiverDemo01 {
    public static void main(String[] args) throws Exception {
        DatagramSocket socket = new DatagramSocket(6666);

        while(true) {

            //接收包裹
            byte[] container = new byte[1024];
            DatagramPacket packet = new DatagramPacket(container, 0, container.length);
            socket.receive(packet);

            //输出数据
            byte[] data = packet.getData();
            String receiveData = new String(data, 0, data.length);
            System.out.println(receiveData);
            if(receiveData.startsWith("bye")){
                break;
            }
        }
        //断开连接
        socket.close();
    }
}

发送端:

public class UdpSenderDemo01 {
    public static void main(String[] args) throws Exception {


        DatagramSocket socket = new DatagramSocket(8888);


        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));


        while(true){
            String data = reader.readLine();
            byte[] datas = data.getBytes();
            DatagramPacket packet = new DatagramPacket(datas,0,datas.length,new InetSocketAddress("localhost",6666));

            socket.send(packet);
            if(data.equals("bye")){
                break;
            }

        }

        socket.close();
    }
}

三、TCP编程

客户端:

public class TcpClientDemo02 {

    public static void main(String[] args) throws Exception {
        Socket socket = new Socket(InetAddress.getByName("127.0.0.1"),9000);

        OutputStream os = socket.getOutputStream();

        FileInputStream fis = new FileInputStream(new File("fw.jpg"));
        byte[] buffer = new byte[1024];
        int len;
        while((len=fis.read(buffer)) != -1){
            os.write(buffer,0, len);
        }

        socket.shutdownOutput();

        InputStream inputStream = socket.getInputStream();
        ByteArrayOutputStream baos = new ByteArrayOutputStream();

        byte[] buffer2 = new byte[1024];
        int len2;
        while((len2=inputStream.read(buffer2))!=-1){
            baos.write(buffer2,0,len2);
        }




        System.out.println(baos.toString());

        fis.close();
        os.close();
        socket.close();

    }
}

服务端:

public class TcpServerDemo02 {

    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = new ServerSocket(9000);
        Socket socket = serverSocket.accept();

        InputStream is = socket.getInputStream();

        FileOutputStream fos = new FileOutputStream(new File("receive.jpg"));
        byte[] buffer = new byte[1024];
        int len;
        while((len=is.read(buffer))!=-1){
            fos.write(buffer,0,len);
        }

        OutputStream os = socket.getOutputStream();
        os.write("我ok了".getBytes());

        fos.close();
        is.close();
        serverSocket.close();

    }
}

四、聊天室

接收方:

public class TalkReceiver implements Runnable{

    DatagramSocket socket = null;
    private int port;
    private String msgFrom;

    public TalkReceiver(int port, String msgFrom) {
        this.port = port;
        this.msgFrom = msgFrom;
        try {
            socket = new DatagramSocket(port);
        } catch (SocketException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void run() {
        while(true) {

            //接收包裹
            try {
                byte[] container = new byte[1024];
                DatagramPacket packet = new DatagramPacket(container, 0, container.length);
                socket.receive(packet);
                //输出数据
                byte[] data = packet.getData();
                String receiveData = new String(data, 0, data.length);
                System.out.println(msgFrom+":"+receiveData);
                if(receiveData.startsWith("bye")){
                    break;
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        //断开连接
        socket.close();
    }
}

发送方:

public class TalkSender implements  Runnable{

    DatagramSocket socket = null;
    BufferedReader reader = null;

    private int fromPort;
    private String toIp;
    private int toPort;

    public TalkSender(int fromPort, String toIp, int toPort) {
        this.fromPort = fromPort;
        this.toIp = toIp;
        this.toPort = toPort;

        try {
            socket = new DatagramSocket(fromPort);
            reader = new BufferedReader(new InputStreamReader(System.in));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Override
    public void run() {

        while(true){
            try {
                String data = reader.readLine();
                byte[] datas = data.getBytes();
                DatagramPacket packet = new DatagramPacket(datas,0,datas.length,new InetSocketAddress(this.toIp,this.toPort));
                socket.send(packet);
                if(data.equals("bye")){
                    break;
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        socket.close();
    }
}

学生端:

public class TalkStudent {
    public static void main(String[] args) {
        new Thread(new TalkSender(7777,"localhost",9999)).start();
        new Thread(new TalkReceiver(8888,"老师")).start();
    }
}

教师端:

public class TalkTeacher {
    public static void main(String[] args) {
        new Thread(new TalkSender(5555,"localhost",8888)).start();
        new Thread(new TalkReceiver(9999,"学生")).start();
    }
}

[Java]网络编程

原文:https://www.cnblogs.com/baihan/p/12987893.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!