Java_TCP网络通信编程

应用案例1(使用字节流):

1.编写一个服务器端,和一个客户端

2.服务器端在9999端口监听

3.客户端连接到服务器端,发送"hello,server",然后退出

4.服务器段接收到 客户端发送的信息,输出,并退出

*ServerSocket可以创建多个Socket对象,ServerSocket只要有一次accept就会返回一个Socket对象

服务器端:

java 复制代码
package com.javaWeb.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.在本机的9999端口监听,等待连接
        //要求9999端口没有被占用,没有其他服务在监听此端口
        ServerSocket serverSocket = new ServerSocket(9999); //代表在本机的9999端口监听
        System.out.println("服务端在9999端口监听,等待链接.....");   //此时端口已被占用,无法被其他程序使用

        //2.当没有客户端链接9999端口时,程序会阻塞,等待连接
        //如果有客户端链接,则会返回一个socket对象,程序继续执行
        Socket socket = serverSocket.accept();
        System.out.println("服务器端socket=" + socket.getClass());//当没有链接时,程序会阻塞在上面的语句,并不会输出这句话

        //3.通过socket.getInputStream()读取客户端写入到数据通道的数据,并显示
        InputStream inputStream = socket.getInputStream();

        //4.IO读取
        byte buf[] = new byte[1024];
        int readLen = 0;
        while ((readLen = inputStream.read(buf)) != -1){
            System.out.print(new String(buf,0,readLen)); //根据读取到的实际长度显示内容/字符串
        }

        //5.关闭流和socket
        inputStream.close();
        socket.close();
        serverSocket.close();
    }
}

客户端:

java 复制代码
package com.javaWeb.Socket;

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

//客户端,发送消息给服务端
public class SocketTCP01client {
    public static void main(String[] args) throws IOException {
        //1.链接服务端(ip,端口)
        //链接InetAddress.getLocalHost()(本机)的9999端口,如果链接成功,会返回一个socket对象
        Socket socket = new Socket(InetAddress.getLocalHost(), 9999);//InetAddress.getLocalHost()这里可以改为要链接对象的IP地址
        System.out.println("客户端socket返回=" + socket.getClass());

        //2.连接上后,生成Socket,通过socket.getOutputStream()
        //得到和socket对象关联的输出流对象
        OutputStream outputStream = socket.getOutputStream();//会返回一个outputStream

        //3.通过输出流,写入数据到数据通道
        outputStream.write("hello,server".getBytes());

        //4.关闭流对象和socket,不然会造成资源浪费
        outputStream.close();
        socket.close();
        System.out.println("客户端退出.....");
    }
}

应用案例2(使用字节流):

1.编写一个服务器端,和一个客户端

2.服务器端在9999端口监听

3.客户端连接到服务器端,发送"hello,server",并接收服务器端回发的"hello,client",再退出

4.服务器端接收到客户端发出的信息,输出,并发送"hello,client"再退出

*设置写入结束标记(没有这个标记就无法接收):

java 复制代码
shutdownOutput();

服务器端:

java 复制代码
package com.javaWeb.Socket;

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

public class SocketTCP02server {
    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = new ServerSocket(9999); //代表在本机的9999端口监听
        System.out.println("服务端在9999端口监听,等待链接.....");   //此时端口已被占用,无法被其他程序使用

        //2.当没有客户端链接9999端口时,程序会阻塞,等待连接
        //如果有客户端链接,则会返回一个socket对象,程序继续执行
        Socket socket = serverSocket.accept();
        System.out.println("服务器端socket=" + socket.getClass());//当没有链接时,程序会阻塞在上面的语句,并不会输出这句话

        //3.通过socket.getInputStream()读取客户端写入到数据通道的数据,并显示
        InputStream inputStream = socket.getInputStream();

        //4.IO读取
        byte buf[] = new byte[1024];
        int readLen = 0;
        while ((readLen = inputStream.read(buf)) != -1) {
            System.out.print(new String(buf, 0, readLen)); //根据读取到的实际长度显示内容/字符串
        }

        //5.获取socket相关联的输出流
        OutputStream outputStream = socket.getOutputStream();
        outputStream.write("hello,client".getBytes());
        //设置结束标记
        socket.shutdownOutput();

        //6.关闭流和socket
        outputStream.close();
        inputStream.close();
        socket.close();
        serverSocket.close();
    }
}

客户端:

java 复制代码
package com.javaWeb.Socket;

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

public class SocketTCP02client {
    public static void main(String[] args) throws IOException {
        //1.链接服务端(ip,端口)
        //链接InetAddress.getLocalHost()(本机)的9999端口,如果链接成功,会返回一个socket对象
        Socket socket = new Socket(InetAddress.getLocalHost(), 9999);//InetAddress.getLocalHost()这里可以改为要链接对象的IP地址
        System.out.println("客户端socket返回=" + socket.getClass());

        //2.连接上后,生成Socket,通过socket.getOutputStream()
        //得到和socket对象关联的输出流对象
        OutputStream outputStream = socket.getOutputStream();//会返回一个outputStream

        //3.通过输出流,写入数据到数据通道
        outputStream.write("hello,server".getBytes());
        //设置结束标记
        socket.shutdownOutput();

        //4,获取和socket关联的输入流,读取数据(字节)并显示
        InputStream inputStream = socket.getInputStream();
        byte[] buf = new byte[1024];
        int readLen = 0;
        while ((readLen = inputStream.read(buf)) != -1){
            System.out.println(new String(buf,0,readLen));
        }

        //5.关闭流对象和socket,不然会造成资源浪费
        inputStream.close();
        outputStream.close();
        socket.close();
        System.out.println("客户端退出.....");
    }
}

应用案例3(使用字符流):

1.编写一个服务器端,和一个客户端

2.服务器端在9999端口监听

3.客户端连接到服务器端,发送"hello,server",并接收服务器端回发的"hello,client",再退出

4.服务器端接收到客户端发出的信息,输出,并发送"hello,client"再退出

*如果使用字符流,需要手动刷新,否则数据不会写入通道

java 复制代码
bufferedWriter.flush();

*设置写入结束标记(没有这个标记就无法接收),也可以使用

java 复制代码
writer.newLine();//要求对方使用readLine()方式读取才能读到

*这里需要使用转换流:

服务器端:

java 复制代码
package com.javaWeb.Socket;

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

//使用字符流读写
public class SocketTCP03server {
    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = new ServerSocket(9999); //代表在本机的9999端口监听
        System.out.println("服务端在9999端口监听,等待链接.....");   //此时端口已被占用,无法被其他程序使用

        //2.当没有客户端链接9999端口时,程序会阻塞,等待连接
        //如果有客户端链接,则会返回一个socket对象,程序继续执行
        Socket socket = serverSocket.accept();
        System.out.println("服务器端socket=" + socket.getClass());//当没有链接时,程序会阻塞在上面的语句,并不会输出这句话

        //3.通过socket.getInputStream()读取客户端写入到数据通道的数据,并显示
        InputStream inputStream = socket.getInputStream();

        //4.IO读取,使用字符流
        //使用InputStreamReader 将字节流inputStream转成字符流
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
        String s = bufferedReader.readLine();
        System.out.println(s);

        //5.获取socket相关联的输出流,使用字符输出流方式回复
        OutputStream outputStream = socket.getOutputStream();
        BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream));
        bufferedWriter.write("hello,client字符流....");
        bufferedWriter.newLine();//插入一个换行符,表示回复内容结束
        bufferedWriter.flush();

        //6.关闭流和socket
        bufferedWriter.close();
        bufferedReader.close();
        socket.close();
        serverSocket.close();
    }
}

客户端:

java 复制代码
import java.io.*;
import java.net.InetAddress;
import java.net.Socket;

//使用字符流读写
public class SocketTCP03client {
    public static void main(String[] args) throws IOException {
        //1.链接服务端(ip,端口)
        //链接InetAddress.getLocalHost()(本机)的9999端口,如果链接成功,会返回一个socket对象
        Socket socket = new Socket(InetAddress.getLocalHost(), 9999);//InetAddress.getLocalHost()这里可以改为要链接对象的IP地址
        System.out.println("客户端socket返回=" + socket.getClass());

        //2.连接上后,生成Socket,通过socket.getOutputStream()
        //得到和socket对象关联的输出流对象
        OutputStream outputStream = socket.getOutputStream();//会返回一个outputStream

        //3.通过输出流,写入数据到数据通道,使用字符流
        BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream));
        bufferedWriter.write("hello,server字符流.....");
        bufferedWriter.newLine();//插入一个换行符,表示写入的内容结束,要求对方使用readLine方式读取
        bufferedWriter.flush();//如果使用字符流,需要手动刷新

        //4,获取和socket关联的输入流,读取数据(字节)并显示
        InputStream inputStream = socket.getInputStream();
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
        String s = bufferedReader.readLine();
        System.out.println(s);

        //5.关闭流对象和socket,不然会造成资源浪费
        bufferedReader.close();//关闭外层流
        bufferedWriter.close();
        socket.close();
        System.out.println("客户端退出.....");
    }
}
相关推荐
利刃大大4 分钟前
【JavaSE】十九、JVM运行流程 && 类加载Class Loading
java·开发语言·jvm
永不停歇的蜗牛5 分钟前
K8S之rke2证书过期,如何处理以及遇到的问题
服务器·容器·kubernetes
testresultstomorrow6 分钟前
GB26875消防物联网协议Java实现详解
java·物联网
wanhengidc9 分钟前
电脑端 云手机都有哪些注意事项
运维·服务器·安全·智能手机·云计算
咕噜签名-铁蛋9 分钟前
DDoS攻击:网络安全的隐形风暴
服务器
凌寒119 分钟前
ip地址归属地查询方法(纯真ip)
tcp/ip
heartbeat..13 分钟前
Java Map 详解:原理、实现与使用场景
java·map·集合
2022.11.7始学前端14 分钟前
n8n第十三节 三个节点测试技巧
运维·服务器·n8n
果然途游20 分钟前
完整Java后端学习路径
java·开发语言·学习笔记
张泽腾6621 分钟前
Ubuntu 扩容
linux·服务器·嵌入式硬件