网络通信

  • ip 电脑地址
  • UDP TCP
  • 端口号
  • socket 插座, 数据流间的插座, 用来联通
  • 类似电脑是港口ip, socket是航线用来发货, 端口号是港口停放船的泊位, UDP TCP是小船还是大船来运送数据箱子

DatagramSocket 与 DatagramPacket

  • DatagramSocket 创建一条航线
  • DatagramPacket 指定电脑ip(港口), 端口号(泊位), 运送的数据(集装箱)
import java.io.IOException;
import java.net.*;
import java.nio.charset.StandardCharsets;

public class Demo1_Send {
    public static void main(String[] args) throws IOException {
        String msg = "中午一起吃饭";
        DatagramSocket datagramSocket = new DatagramSocket();
        DatagramPacket datagramPacket = new DatagramPacket
                (msg.getBytes(StandardCharsets.UTF_8),msg.getBytes().length, InetAddress.getByName("127.0.0.1"),2000);

        datagramSocket.send(datagramPacket);
        datagramSocket.close();
    }
}
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;

public class Demo2_Receive {
    public static void main(String[] args) throws IOException {
        DatagramSocket socket = new DatagramSocket(2000);
        DatagramPacket packet = new DatagramPacket(new byte[1024], 1024);
        socket.receive(packet);
        byte[] arr = packet.getData();
        int len = packet.getLength();
        System.out.println(new String(arr,0,len));
        socket.close();
    }
}

能够不断录入的版本

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.nio.charset.StandardCharsets;
import java.util.Scanner;

public class Demo3_Send {
    public static void main(String[] args) throws IOException {
        Scanner sc = new Scanner(System.in);
        DatagramSocket datagramSocket = new DatagramSocket();
        while (true){
            String msgLine = sc.nextLine();
            if( "quit".equals(msgLine)){
                break;
            }
            System.out.println(msgLine);
            DatagramPacket packet =
                    new DatagramPacket (msgLine.getBytes(StandardCharsets.UTF_8),
                            msgLine.getBytes().length,
                            InetAddress.getByName("127.0.0.1"),
                            2000);

            datagramSocket.send(packet);
        }
        datagramSocket.close();
    }
}
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;

public class Demo3_Receive {
    public static void main(String[] args) throws IOException {
        DatagramSocket socket = new DatagramSocket(2000);
        DatagramPacket packet = new DatagramPacket(new byte[1024], 1024);

        while (true){
            socket.receive(packet);
            byte[] arr = packet.getData();
            int len = packet.getLength();
            System.out.println("信息" + new String(arr,0,len));
        }
    }
}

多线程发送和接收信息

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.nio.charset.StandardCharsets;
import java.util.Scanner;

public class Demo4_MoreThread {
    public static void main(String[] args) {
        MyReceive myReceive = new MyReceive();
        MySend mySend = new MySend();
        myReceive.start();
        mySend.start();
    }

}
class MyReceive extends Thread{
    @Override
    public void run() {
        try {
            DatagramSocket socket = null;
            socket = new DatagramSocket(2000);
            DatagramPacket packet = new DatagramPacket(new byte[1024], 1024);

            while (true){
                socket.receive(packet);
                byte[] arr = packet.getData();
                int len = packet.getLength();
                System.out.println("信息" + new String(arr,0,len));
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

class MySend extends Thread{
    @Override
    public void run() {
        Scanner sc = new Scanner(System.in);
        DatagramSocket datagramSocket = null;
        try {
            datagramSocket = new DatagramSocket();
            while (true){
                String msgLine = sc.nextLine();
                if( "quit".equals(msgLine)){
                    break;
                }
                DatagramPacket packet =
                        new DatagramPacket (msgLine.getBytes(StandardCharsets.UTF_8),
                                msgLine.getBytes().length,
                                InetAddress.getByName("127.0.0.1"),
                                2000);

                datagramSocket.send(packet);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        datagramSocket.close();
    }
}

GUI 聊天

import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;
import java.nio.charset.StandardCharsets;
import java.text.SimpleDateFormat;
import java.util.Date;

public class Demo5_GUIChat extends Frame{
    private TextField textField;
    private TextArea viewText;
    private TextArea sendText;
    private Button send;
    private Button log;
    private Button clear;
    private Button shake;
    private DatagramSocket socket;
//    private BufferedReader br;
    private FileInputStream fis;
    private BufferedWriter bw;
    public Demo5_GUIChat() throws SocketException,IOException{
        init();
        southPanel();
        centerPanel();
        event();
        Receive r = new Receive();
        r.start();
        this.setVisible(true);

    }

    public void event() {
        this.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                try {
                    bw.close();
                } catch (IOException ex) {
                    ex.printStackTrace();
                }
                socket.close();
                System.exit(0);
            }
        });
        send.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                try {
                    send();
                } catch (SocketException ex) {
                    ex.printStackTrace();
                } catch (IOException ex) {
                    ex.printStackTrace();
                }
            }
        });
        log.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                try {
                    logFile();
                } catch (IOException ex) {
                    ex.printStackTrace();
                }
            }
        });

        clear.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                viewText.setText("");
            }
        });

        shake.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
//                shake();
                try {
                    send(new byte[]{-1},textField.getText());
                } catch (IOException ex) {
                    ex.printStackTrace();
                }
            }
        });

        sendText.addKeyListener(new KeyAdapter() {
            @Override
            public void keyReleased(KeyEvent e) {
                if(e.getKeyCode() == KeyEvent.VK_ENTER ){
                    try {
                        send();
                    } catch (IOException ex) {
                        ex.printStackTrace();
                    }
                }
            }
        });
    }
    public void shake(){
        int x = this.getX();
        int y = this.getY();
        for(int i=0;i<20;i++){
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            if(i % 2 == 0){
                this.setLocation(x+3,y+3);
            } else {
                this.setLocation(x,y);
            }
        }
    }
    public void logFile() throws IOException {

//        br = new BufferedReader(new InputStreamReader(new FileInputStream("chat.log")));
//        br = new BufferedReader(new FileReader("chat.log"));
//        viewText.setText("");
//        int len ;
//        char [] arr = new char[1024];
//        while ( ( len =br.read(arr)) != -1){
//            viewText.append(new String(arr,0,len));
//        }
//        br.close();
        fis = new FileInputStream("chat.log");
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        int len;
        byte[] arr = new byte[8192];
        while ( (len = fis.read(arr)) != -1){
            bos.write(arr,0,len);
        }
        viewText.setText(bos.toString());
        bos.close();

    }
    public void send(byte[] arr,String ip) throws IOException {
        DatagramPacket packet = new DatagramPacket(arr,
                arr.length,
                InetAddress.getByName(ip),
                9999);
        socket.send(packet);
    }

    public void send() throws IOException {
        String msg = sendText.getText();
        if( "".equals(msg.trim())  || null ==msg){
            return;
        } else {
            String ip = textField.getText();
            if( ip.equals(null) || ip.trim().equals("")){
                ip = "255.255.255.255";
            }
            String time = getTime();
            send(msg.getBytes(StandardCharsets.UTF_8),ip);

            String chatlog = time+" "+"我对:"+(ip.equals("255.255.255.255")? "所有人":ip)+"说:"+"\n"+ msg +"\n"+"\n";
            viewText.append(chatlog);
            bw.write(chatlog);
            bw.flush();
            sendText.setText("");
        }

    }
    public String getTime(){
        Date date = new Date();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
        return sdf.format(date);
    }


    public void centerPanel() {
        Panel center = new Panel();
        viewText = new TextArea();
        sendText = new TextArea(5,2);
        viewText.setEditable(false);
        viewText.setBackground(Color.WHITE);
        center.setLayout( new BorderLayout());
        center.add(sendText, BorderLayout.SOUTH);
        center.add(viewText, BorderLayout.CENTER);
        sendText.setFont(new Font("xxx", Font.PLAIN,20));
        viewText.setFont(new Font("xxx", Font.PLAIN,16));
        this.add(center, BorderLayout.CENTER);
    }

    public void southPanel() {
        Panel south = new Panel();
        textField = new TextField(15);
        textField.setText("127.0.0.1");
        send = new Button("发送");
        log = new Button("记录");
        clear = new Button("清除");
        shake = new Button("振动");
        south.add(textField);
        south.add(send);
        south.add(log);
        south.add(clear);
        south.add(shake);
        this.add(south, BorderLayout.SOUTH);
    }

    private void init() throws IOException {
        this.setLocation(500,10);
        this.setSize(500,800);
        socket = new DatagramSocket();
//        bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("chat.log",true)));
        bw = new BufferedWriter(new FileWriter("chat.log",true));
    }

    public static void main(String[] args) throws SocketException,IOException {
        Demo5_GUIChat guiChat = new Demo5_GUIChat();

    }
    private class Receive extends Thread{
        //发送 接收同时进行
        @Override
        public void run() {
            try {
                DatagramSocket socket = new DatagramSocket(9999);
                DatagramPacket packet = new DatagramPacket(new byte[8192], 8192);
                while (true){
                    socket.receive(packet);
                    byte[] arr = packet.getData();
                    int length = packet.getLength();
                    if( length == 1 && arr[0] == -1){
                        shake();
                        continue;
                    }
                    String msg = new String(packet.getData(), 0, packet.getLength());
                    String chatlog = getTime()+" "+textField.getText()+" "+"对我说:"+"\n"+msg+"\n\n" ;
                    viewText.append(chatlog);
                    bw.write(chatlog);
                    bw.flush();
                }
            } catch (SocketException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }

        }
    }
}

TCP协议 (重要)

  • TCP 三次握手
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.charset.StandardCharsets;

public class Demo2_Server {
    public static void main(String[] args) throws IOException {
        ServerSocket server = new ServerSocket(2000);
        Socket socket = server.accept();

        InputStream is = socket.getInputStream();
        OutputStream os = socket.getOutputStream();

        os.write("明天还上班不".getBytes(StandardCharsets.UTF_8));

        byte[] arr = new byte[8192];
        int len;
        len = is.read(arr);
        System.out.println(new String(arr,0,len));
    }
}
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.nio.charset.StandardCharsets;

public class Demo1_Client {
    public static void main(String[] args) throws IOException {
        Socket socket = new Socket("127.0.01",2000);
        InputStream is = socket.getInputStream();
        OutputStream os = socket.getOutputStream();
        byte[] arr = new byte[8192];
        int len = is.read(arr);

        os.write("吃了".getBytes(StandardCharsets.UTF_8));
        System.out.println(new String(arr,0,len));
    }
}

服务端 客户端TCP 优化

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.charset.StandardCharsets;

public class Demo2_Server {
    public static void main(String[] args) throws IOException {
        ServerSocket server = new ServerSocket(2000);
        Socket socket = server.accept();

        BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        OutputStream out;
        PrintStream ps = new PrintStream(socket.getOutputStream()) ;
        ps.println("快乐, 放假了");
        System.out.println(br.readLine());
        ps.println("出来玩吧");
        System.out.println(br.readLine());
    }
}
import java.io.*;
import java.net.Socket;

public class Demo2_Client {
    public static void main(String[] args) throws IOException {
        Socket socket = new Socket("127.0.01",2000);
        BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        PrintStream ps = new PrintStream(socket.getOutputStream()) ;

        System.out.println( br.readLine());
        ps.println("是的, 放假了");
        System.out.println( br.readLine());
        ps.println("起飞");
    }
}

服务增加多线程

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

public class Demo2_Server {
    public static void main(String[] args) throws IOException {
        ServerSocket server = new ServerSocket(2000);
        while (true){
            final Socket socket = server.accept();
            new Thread(){
                @Override
                public void run() {
                    try {
                        BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                        OutputStream out;
                        PrintStream ps = new PrintStream(socket.getOutputStream()) ;
                        ps.println("快乐, 放假了");
                        System.out.println(br.readLine());
                        ps.println("出来玩吧");
                        System.out.println(br.readLine());
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }.start();
        }
    }
}

服务端反转字符并写给客户端

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

public class Demo3_Server {
    public static void main(String[] args) throws IOException {
        ServerSocket server = new ServerSocket(2000);
        while (true){
            final Socket socket = server.accept();
            new Thread(){
                @Override
                public void run() {
                    while (true){
                        try {
                            BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                            PrintStream ps = new PrintStream(socket.getOutputStream()) ;
                            StringBuilder sb = new StringBuilder( br.readLine());
                            ps.println(sb.reverse());
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }.start();
        }
    }
}
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;
import java.util.Scanner;

public class Demo3_Client {
    public static void main(String[] args) throws IOException {
        Socket socket = new Socket("127.0.01",2000);
        BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        PrintStream ps = new PrintStream(socket.getOutputStream()) ;

        Scanner sc = new Scanner(System.in);
        String s = null;
        while (true){
            s = sc.nextLine();
            ps.println(s);
            System.out.println( br.readLine());
        }
    }
}

上传文件到服务端

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

public class Demo4_Server_SaveFiles {
    public static void main(String[] args) throws IOException{
        ServerSocket server = new ServerSocket(2000);
        while (true){
            final Socket socket = server.accept();
            new Thread(){
                @Override
                public void run() {
                    while (true){
                        try {
                            InputStream is = socket.getInputStream();
                            BufferedReader br = new BufferedReader(new InputStreamReader(is));
                            PrintStream ps = new PrintStream(socket.getOutputStream()) ;


                            File dir = new File("update");
                            if(!dir.exists()){
                                dir.mkdir();
                            }
                            String fileName = br.readLine();
                            System.out.println(fileName);
                            File file = new File(dir, fileName);
                            if( file.exists()){
                                ps.println("已存在");
                                return;
                            }else {
                                ps.println("不存在");
                            }

                            byte[] arr = new byte[8192];
                            int len;
                            FileOutputStream fos = new FileOutputStream(file);
                            while ( ( len = is.read(arr)) != -1){
                                fos.write(arr,0,len);
                            }
                            fos.close();
                            socket.close();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }.start();
        }
    }
}
import java.io.*;
import java.net.Socket;
import java.util.Scanner;

public class Demo4_Client {
    public static void main(String[] args) throws IOException {
        Socket socket = new Socket("127.0.01",2000);
        InputStream is = socket.getInputStream();
        BufferedReader br = new BufferedReader(new InputStreamReader(is));
        PrintStream ps = new PrintStream(socket.getOutputStream()) ;

        Scanner sc = new Scanner(System.in);
        String s = null;
        int len;
        byte[] arr = new byte[8192];
        while (true){
            s = sc.nextLine();

            File file = new File(s);
            if( !file.exists()){
                System.out.println("文件不存在");
            } else if( file.isDirectory()){
                System.out.println("文件夹, 请重新输入文件");
            } else if (file.isFile()){
                ps.println(s);
                String flag = br.readLine();
                if( "已存在".equals(flag)){
                    System.out.println(flag);
                    return;
                } else {
                    InputStream inputStream = new FileInputStream(file);
                    while ( (len = inputStream.read(arr)) != -1){
                        ps.write(arr,0,len);
                    }
                    ps.flush();
                }
            }
        }
    }
}