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 小时前
Java数据结构初阶——LinkedList
java·开发语言·数据结构
qq_12498707535 小时前
基于springboot的建筑业数据管理系统的设计与实现(源码+论文+部署+安装)
java·spring boot·后端·毕业设计
一 乐5 小时前
宠物管理|宠物共享|基于Java+vue的宠物共享管理系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·springboot·宠物
a crazy day5 小时前
Spring相关知识点【详细版】
java·spring·rpc
白露与泡影5 小时前
MySQL中的12个良好SQL编写习惯
java·数据库·面试
foundbug9995 小时前
配置Spring框架以连接SQL Server数据库
java·数据库·spring
凯酱5 小时前
@JsonSerialize
java
百***86465 小时前
服务器部署,用 nginx 部署后页面刷新 404 问题,宝塔面板修改(修改 nginx.conf 配置文件)
运维·服务器·nginx
悦悦子a啊6 小时前
项目案例作业(选做):使用文件改造已有信息系统
java·开发语言·算法
lkbhua莱克瓦246 小时前
Java项目——斗地主小游戏(控制台版)
java·开发语言·windows·斗地主项目