【网络编程】狂神说笔记

TCP模型

初识TCP

服务端代码

import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;

class ClientThread extends Thread{
    Socket socket;

    public ClientThread(Socket socket) {
        this.socket = socket;
    }
    @Override
    public void run() {
        InputStream in = null;
        try {
            in = socket.getInputStream();
            BufferedReader reader = new BufferedReader(new InputStreamReader(in));
            String line;
            while ((line = reader.readLine()) != null) {
                System.out.println("read:" +line);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (in != null) {
                    in.close();
                }
                socket.close();
                System.out.println("close socket: " + socket);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        
    }
    
}
public class TCPServer {
    ServerSocket server;
    int serverPort = 8848;

    public TCPServer() {
        try {
            server = new ServerSocket(serverPort);
            System.out.println("create a server socket and the port is " + serverPort);

        } catch (IOException e) {

            e.printStackTrace();
        }
    }

    private void listen() {
        while (true) {
            try {
                Socket socket = server.accept();
                System.out.println("socket:" + socket);
                new ClientThread(socket).start();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    public static void main(String[] args) {
        new TCPServer().listen();
    }
}

客户端代码

import java.net.InetAddress;
import java.net.Socket;

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;


import java.io.OutputStream;
import java.io.PrintWriter;

public class TCPClient extends JFrame implements ActionListener {
    Socket client = null;
    String serverAddr = "localhost";
    int serverPort = 8848;
    PrintWriter out;
    JTextField tf;

    public TCPClient() {
        try {
            client = new Socket(serverAddr, serverPort);
            System.out.println("client:" + client);
            out = new PrintWriter(client.getOutputStream());
            out.println("hello");
            out.flush();
        } catch (Exception e) {
            e.printStackTrace();
        }
        Container cp = getContentPane();
        cp.setLayout(new FlowLayout(FlowLayout.LEFT, 15, 15));
        cp.add(new JLabel("enter your message or \"quit\""));
        tf = new JTextField(40);
        tf.addActionListener(this);
        cp.add(tf);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        pack();
        setTitle("TCP client");
        setVisible(true);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        String message = tf.getText();
        if (message.equals("quit")) {
            try {
                if (out != null) {
                    out.close();
                }
                if (client != null) {
                    client.close();
                }
                System.exit(0);
            } catch (Exception exception) {
                exception.printStackTrace();
            }
        } else {
            out.println(message);
            out.flush();
            tf.setText("");
        }
    }
    public static void main(String[] args) {
        new TCPClient();
    }
}

TCP握手

服务器端

package note.JAVA.NET.UploadFile;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {
    public static void main(String[] args) throws IOException{
        ServerSocket server = new ServerSocket(8848);
        Socket socket = server.accept(); //阻塞式监听
        OutputStream out = socket.getOutputStream();

        FileInputStream fileInputStream = new FileInputStream(new File("note/res/receive.txt"));
        int len;
        byte[] buffer = new byte[1024];
        while ((len = fileInputStream.read(buffer)) != -1) {
            out.write(buffer, 0, len);
        }
        server.close();
        fileInputStream.close();
        out.close();
        socket.close();
    }
}

客户端

package note.JAVA.NET.TCPShakeHand;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;

public class Client {
    public static void main(String[] args) throws UnknownHostException, IOException{
        Socket socket = new Socket(InetAddress.getByName("127.0.0.1"), 8848);

        OutputStream socketOut = socket.getOutputStream();
        InputStream socketIn = socket.getInputStream();
        
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        byte[] buffer = new byte[1024];
        int len;
        while ((len = socketIn.read(buffer)) != -1) {
            byteArrayOutputStream.write(buffer,0,len);
            System.out.println("receive: " + byteArrayOutputStream.toString());
        }

        socket.close();
        socketIn.close();
        socketOut.close();


    }
}

Tomcat

初识Tomcat

UDP

receiver

package note.JAVA.NET.UDP;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;

public class Server {
    public static void main(String[] args) throws IOException {
        DatagramSocket socket = new DatagramSocket(8848);
        byte[] buffer = new byte[1024];
        DatagramPacket packet = new DatagramPacket(buffer, 0, buffer.length);

        socket.receive(packet);
        System.out.println("receive:" + new String(packet.getData(), 0, packet.getData().length));
        socket.close();
    }
}

sender

package note.JAVA.NET.UDP;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class Client {
    public static void main(String[] args) throws IOException {
        DatagramSocket socket = new DatagramSocket();

        String message = "hello server";
        InetAddress localhost = InetAddress.getByName("localhost");
        int port = 8848;

        DatagramPacket packet = new DatagramPacket(message.getBytes(), 0, message.getBytes().length,localhost,port);

        socket.send(packet);

        socket.close();
    }
}

聊天实现

循环发送接收消息

发送方
package note.JAVA.NET.UDPChat;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;


public class UDPSender {

    public static void main(String[] args) throws IOException {
        DatagramSocket socket = new DatagramSocket(6666);
        while (true) {
            BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
            String data = reader.readLine();
            byte[] buffer = data.getBytes();
            DatagramPacket packet = new DatagramPacket(buffer, 0, buffer.length,
                    new InetSocketAddress("localhost", 8848));
            socket.send(packet);
            if (data.equals("quit")) {
                System.out.println("sender closed");
                socket.close();
                break;
            } else {
                System.out.println("send:" + data);
            }
        }
        
    }

}

接收方
package note.JAVA.NET.UDPChat;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;

public class UDPReceiver {
    public static void main(String[] args) throws IOException {
        DatagramSocket socket = new DatagramSocket(8848);

        while (true) {
            byte[] buffer = new byte[1024];
            DatagramPacket packet = new DatagramPacket(buffer, 0, buffer.length);

            socket.receive(packet);

            String data = new String(packet.getData(), 0, packet.getData().length);

            if (data.equals("quit")) {
                System.out.println("receiver closed");
                socket.close();
                break;
            } else {
                System.out.println("receive:" + data);
            }

        }
    }
}

双人聊天

线程1
package NET.UDPChat;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;


public class SenderThread implements Runnable{
    DatagramSocket socket;
    BufferedReader reader;

    private String receiverIP = "localhost";
    private int receiverPort = 8848;

    private String senderIP = "localhost";
    private int senderPort = 8080;

    SenderThread(String receiverIP, int receiverPort, String senderIP, int senderPort){
        try {
            this.receiverIP = receiverIP;
            this.receiverPort = receiverPort;
            this.senderIP = senderIP;
            this.senderPort = senderPort;
            socket = new DatagramSocket(senderPort);
            reader = new BufferedReader(new InputStreamReader(System.in));
        } catch (Exception exception) {
            exception.printStackTrace();
        }

    }

    @Override
    public void run() {
        while (true) {
            try {
                String data = reader.readLine();
                byte[] buffer = data.getBytes();
                DatagramPacket packet = new DatagramPacket(buffer, 0, buffer.length,
                        new InetSocketAddress(receiverIP, receiverPort));
                socket.send(packet);
                if (data.equals("quit")) {
                    break;
                } else {
                    System.out.println(socket.getLocalPort() + " send:" + data);
                }
            } catch (Exception exception) {
                exception.printStackTrace();
            }
        }
        try {
            System.out.println("sender closed");
            socket.close();
        } catch (Exception exception) {
            exception.printStackTrace();
        }
    }
    
}
线程2
package NET.UDPChat;

import java.io.BufferedReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;



public class ReceiverThread implements Runnable{
    DatagramSocket socket;
    BufferedReader reader;

    private String receiverIP;
    private int receiverPort;

    private String senderIP;
    private int senderPort;

    ReceiverThread(String receiverIP, int receiverPort) {
        try {
            this.receiverIP = receiverIP;
            this.receiverPort = receiverPort;
            socket = new DatagramSocket(receiverPort);
        } catch (Exception exception) {
            exception.printStackTrace();
        }

    }

    @Override
    public void run() {
        while (true) {
            try {
                byte[] buffer = new byte[1024];
                DatagramPacket packet = new DatagramPacket(buffer, 0, buffer.length);
                socket.receive(packet);
                String data = new String(packet.getData(), 0, packet.getData().length);
                if (data.equals("quit")) {
                    break;
                } else {
                    System.out.println(socket.getLocalPort() + " receive:" + data);
                }
            } catch (Exception exception) {
                exception.printStackTrace();
            }
        }
        try {
            System.out.println("receiver closed");
            socket.close();
        } catch (Exception exception) {
            exception.printStackTrace();
        }
    }

}

主线程
package NET.UDPChat;


public class Chat1 {

    public static void main(String[] args) {
        new Thread(new SenderThread("localhost", 4444, "localhost", 2222)).start();
        new Thread(new ReceiverThread("localhost", 1111)).start();
    }

}



package NET.UDPChat;

public class Chat2 {
    public static void main(String[] args) {
        new Thread(new SenderThread("localhost", 1111, "localhost", 3333)).start();
        new Thread(new ReceiverThread("localhost", 4444)).start();
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

pass night

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值