【java】TCP方式实现网络编程

215 阅读2分钟

TCP网络编程

基本流程

netstate指令

TCP连接秘密~

  1. 服务端开启端口8888监听,连接成功后,客户端也会开启一个随机端口
  2. 先关闭后打开的流,再关闭socket
  3. 关闭外层流,bufferedReader.close()不用再inputStream.close()

案例1:字节流

  • 客户端
package com.hspedu.socket;

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

public class SocketTcp01Client {
    public static void main(String[] args) throws UnknownHostException, IOException {
        // 1. 创建socket,发起连接
        Socket socket = new Socket(InetAddress.getLocalHost(),9999);
        // 2. 得到socket对象关联的输出流对象
        OutputStream outputStream =  socket.getOutputStream();
        // 3. 向输出流对象写入数据
        outputStream.write("hello!server!".getBytes());
        // 4. 关闭输出流和socket
        outputStream.close();
        socket.close();
        System.out.println("客户端退出");
    }
}
  • 服务端
package com.hspedu.socket;

import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class SocketTcp01Server {
    public static void main(String[] args) throws IOException {
        // 1. 创建ServerSocket,监听端口
        ServerSocket serverSocket01 = new ServerSocket(9999);
        // 未连接时,程序阻塞,等待连接
        System.out.println("9999端口监听,等待连接");
        // 2. 连接成功,拿到socket对象
        Socket socket = serverSocket01.accept();
        System.out.println("socket = "+socket.getClass());
        
        // 3. 拿到socket对象关联的输入流
        InputStream inputStream = socket.getInputStream();
        // io读取
        byte[] buf = new byte[1024];
        int readLen = 0;
        while((readLen = inputStream.read(buf)) != -1) {
            System.out.println(new String(buf,0,readLen));
        }

        // 4. 关闭流和socket
        inputStream.close();
        socket.close();
        serverSocket01.close();
    }
}

案例2:socket结束

outputStream.write("Hello,server!".getBytes());
// 发送完数据后,设置结束标记
socket.shutdownOutput();

案例3:字符流

  • 客户端
import java.io.*;
import java.net.InetAddress;
import java.net.Socket;

public class SocketTCPclient03 {
    public static void main(String[] args) throws IOException {
        Socket socket = new Socket(InetAddress.getLocalHost(), 8888);
        OutputStream outputStream = socket.getOutputStream();
        // 输出字符流
        BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream));
        bufferedWriter.write("hello,server 字符流");
        // 发送完数据后,设置结束标记
        bufferedWriter.newLine();//插入一个换行符,表示写入的内容结束,要求对方使用readLine()才能识别
        bufferedWriter.flush();//需要手动刷新


        InputStream inputStream = socket.getInputStream();
        // 输入字符流
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
        String s = bufferedReader.readLine();
        System.out.println(s);

        // 必须关闭流对象和socket
        bufferedReader.close();
        bufferedWriter.close();
//        inputStream.close();
//        outputStream.close();
        socket.close();
    }
}
  • 服务器
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

public class SocketTCP03 {
    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = new ServerSocket(8888);
        Socket socket = serverSocket.accept();
        InputStream inputStream = socket.getInputStream();
        // IO读取,输入字符流
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
        String s = bufferedReader.readLine();
        System.out.println(s);

        // 输出字符流
        OutputStream outputStream = socket.getOutputStream();
        BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream));
        bufferedWriter.write("hello client03,字符流");
        bufferedWriter.newLine();
        bufferedWriter.flush();


        bufferedReader.close();
        bufferedWriter.close();
//        inputStream.close();
        socket.close();
        serverSocket.close();
    }
}

案例4:上传文件

UDP网络编程