java TCP通信

 

java在包java.net中提供了两个类Socket和ServerSocket,分别用来表示双向连接的客户端和服务端。
 

package urlconnection;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * @author ermu
 * @since 2021/3/23 9:22
 */
public class Server extends Thread{
    private ServerSocket serverSocket;

    public Server(ServerSocket serverSocket) {
        this.serverSocket = serverSocket;
    }

    public Server(int port) throws IOException {
        this.serverSocket = new ServerSocket(port);
    }

    @Override
    public void run() {
        Socket socket = null;
        BufferedReader  in = null;
        PrintWriter out = null;
        BufferedReader sin = null;
        try {
            //使用accept()阻塞等待客户端请求,有客户
            //请求到来则产生一个Socket对象,并继续执行
            socket = serverSocket.accept();
            //得到socket输入流
            in= new BufferedReader(new InputStreamReader(socket.getInputStream()));
            //得到socket输出流
            out = new PrintWriter(socket.getOutputStream());
            //得到控制台输入流
            sin = new BufferedReader(new InputStreamReader(System.in));
            //打印客户端内容
            System.out.println("Client:"+in.readLine());
            //获取服务器端控制台输入
            String data = sin.readLine();
            while(!data.equals("bye")) {
                //向客户端发送内容
                out.println(data);
                //刷新输出流,使客户端马上收到字符串
                out.flush();
                //在系统标准输出上打印读入的字符串
                System.out.println("Server:"+data);
                //从Client读入一字符串,并打印到标准输出上
                System.out.println("Client:"+in.readLine());
                //从系统标准输入读入一字符串
                data = sin.readLine();
            }
            //向客户端发送内容
            out.println(data);
            //刷新输出流,使客户端马上收到字符串
            out.flush();
        }catch (IOException e){
            e.printStackTrace();
        }finally {
            if(sin != null){
                try {
                    sin.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(out != null){
                out.close();
            }
            if(in != null){
                try {
                    in.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(socket != null){
                try {
                    socket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    public static void main(String[] args) throws Exception{
            new Server(8001).start();
    }
}
package urlconnection;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;

/**
 * @author ermu
 * @since 2021/3/23 9:23
 */
public class Client extends Thread{
    Socket socket = null;

    public Client(Socket socket){
        this.socket = socket;
    }

    @Override
    public void run(){
        //由Socket对象得到输入流,并构造相应的BufferedReader对象
        BufferedReader in = null;
        //由系统标准输入设备构造BufferedReader对象
        BufferedReader cin = null;
        //由Socket对象得到输出流,并构造PrintWriter对象
        PrintWriter out = null;
        try {
            in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            cin = new BufferedReader(new InputStreamReader(System.in));
            out = new PrintWriter(socket.getOutputStream());
            //从控制台读取数据
            String data = cin.readLine();
            while (!data.equals("bye")) {
                out.println(data);
                out.flush();
                //在系统标准输出上打印读入的字符串
                System.out.println("Client:"+data);
                //从Server读入一字符串,并打印到标准输出上
                System.out.println("Server:"+in.readLine());
                //从系统标准输入读入一字符串
                data = cin.readLine();
                //向服务器发送数据
            }
            out.println(data);
            out.flush();
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            if(cin != null){
                try {
                    cin.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(out != null){
                out.close();
            }
            if(in != null){
                try {
                    in.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(socket != null){
                try {
                    socket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    public static void main(String[] args) {
        try {
            new Client(new Socket("127.0.0.1",8001)).start();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

如有错误请指正

参考链接:https://blog.csdn.net/u013256816/article/details/50186693

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值