java实现TCP交互

服务器端 

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.PriorityQueue;
import java.util.Scanner;

public class TCP_Server {
    private ServerSocket serverSocket=null;
    public TCP_Server(int port) throws IOException {
        serverSocket=new ServerSocket(port);
    }
    public void start() throws IOException {
        System.out.println("服务器启动");
        while (true){
            //通过accept方法,把内核建立好的连接拿到应用程序中
            //建立连接细节由内核完成
            Socket clientSocket=serverSocket.accept();
            //实现连接
            Thread t=new Thread(()->{
                try {
                    processConnection(clientSocket);
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
            });
            t.start();
        }
    }

    public void processConnection(Socket clientSocket) throws IOException {
        //打印日志,表示客户端连接成功
        System.out.printf("[%s:%d] 客户端上线\n",clientSocket.getInetAddress(),clientSocket.getPort());
        //数据交互
        try (InputStream inputStream = clientSocket.getInputStream()) {
            try (OutputStream outputStream = clientSocket.getOutputStream()) {
                //客户端可能发来多条数据,要循环处理
                while (true) {
                    Scanner scanner = new Scanner(inputStream);
                    if (!scanner.hasNext()) {
                        //连接断开,循环结束
                        break;
                    }
                    //1.读取请求解析,这里用next,因为当客户端输入空拍夫结束输入
                    String request = scanner.next();
                    //2.根据请求返回响应
                    String reponse = process(request);
                    //3.返回客户端
                    //把字节数组写入到 OutputStream
                    PrintWriter printWriter = new PrintWriter(outputStream);
                    //这里println是给客户端不是打印
                    //println带有\n是为了客户端接收的时候以空白符结束
                    printWriter.println(reponse);
                    //刷新缓冲区,写道硬盘
                    printWriter.flush();
                    //4.打印交互内容
                    System.out.printf("[%s:%d] req=%s,resp=%s\n", clientSocket.getInetAddress(), clientSocket.getPort(), request, reponse);
                }
            } catch (IOException e) {
                throw new RuntimeException(e);
            }finally {
                clientSocket.close();
            }
        }
    }

    private String process(String request) {
        //回显服务器
        return  request;
    }

    public static void main(String[] args) throws IOException {
        TCP_Server tcpServer=new TCP_Server(800);
        tcpServer.start();
    }
}

 客户端

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;

public class Tcp_Client {
    private Socket socket=null;
    public Tcp_Client(String serverIp,int serverPort) throws IOException {
        //三次握手细节由内核自动完成
        socket=new Socket(serverIp,serverPort);
    }
    public void start() throws IOException {
        Scanner scanner=new Scanner(System.in);
      try( InputStream inputStream=socket.getInputStream();
           OutputStream outputStream=socket.getOutputStream()){
          PrintWriter writer=new PrintWriter(outputStream);
          Scanner scanner1=new Scanner(inputStream);
          while (true){
              //1.从控制台读入用户输入内容
              System.out.print("->");
              String request=scanner.next();
              //2.把字符串请求发给服务器,用println是为了带上\n与服务器scanner.next呼应
              writer.println(request);
              writer.flush();
              //3.读取服务器请求
              String response=scanner1.next();
              //4.显示返回内容
              System.out.println(response);
          }
      }
    }

    public static void main(String[] args) throws IOException {
        Tcp_Client tcpClient=new Tcp_Client("127.0.0.1",800);
        tcpClient.start();
    }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值