Java TCP 客户端和服务端之间的使用

本文介绍了一个简单的Java网络编程实例,包括客户端和服务端的实现过程。客户端通过Socket与服务端建立连接,并进行数据交换。服务端则负责接收客户端的请求并作出响应。文中详细展示了如何使用BufferedReader和PrintStream进行高效的数据读写。

Client.Main.java 客户端

package com.company;

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

public class Main {
    //客户端
    //1创建socket连接服务端(指定ip地址 端口) 通过ip找到服务器
    //2 调用socket的getinputstream 和getoutputstream
//获得和拂服务器相连接的io流
//    3 输入流可以读出服务器输出流写出的数据
//    4输出流可以读取服务器输出流写入的数据

    public static void main(String[] args) throws IOException {
       // demo1();
        demo2();
    }

    // write your code here
    public static void demo1() throws IOException {
        //1创建socket连接服务端(指定ip地址 端口) 通过ip找到服务器
        Socket socket = new Socket("127.0.0.1", 12345);
        //2获取客户端输入流
        InputStream is = socket.getInputStream();
        OutputStream os = socket.getOutputStream();
        byte[] arr = new byte[1024];
        //读取服务器发来的数据
        int len = is.read(arr);
        System.out.println(new String(arr, 0, len));
        //向服务器写数据
        os.write("搜索内容".getBytes());
        socket.close();
    }

    // 自带缓存方式
    public static void demo2() throws IOException {
        //1创建socket连接服务端(指定ip地址 端口) 通过ip找到服务器
        Socket socket = new Socket("127.0.0.1", 12345);
        //2获取客户端输入流
        BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));

        //printstream有自动换行功能
        PrintStream ps = new PrintStream(socket.getOutputStream());

        //读取服务器发来的数据

        System.out.println(br.readLine());
        //向服务器写数据
        ps.println("我帅吗");

        //读取服务器发来的数据

        System.out.println(br.readLine());
        //向服务器写数据
        ps.println("真心话?");
        System.out.println(br.readLine());
        socket.close();
    }
}

ServerMain.java 服务端

package com.company;

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

/**
 * Created by dllo on 17/5/20.
 */
public class ServerMain {
    //服务端
    //1创建ServerSocket(需要制定端口号)
    //2调用ServerSocket的accept方法 接收一个客户端请求,
    //得到一个Socket
    //3 调用socket的getinputstream 和getoutputstream
//获得和拂服务器相连接的io流
    //4 输入流可以读取客户端输出流写出的数据
//    5输出流可以读取客户端输出流写入的数据


    public static void main(String[] args) throws IOException {
        //demo1();
      demo2();
       // demo3();
    }

    public static void demo1() throws IOException {
        // 1 创建ServerSocket(需要制定端口号)
        ServerSocket server = new ServerSocket(12345);
        //2调用SerintverSocket的accept方法 接收一个客户端请求,
        Socket socket = server.accept();
        //  3 调用socket的getinputstream 和getoutputstream
//获得和服务器相连接的io流
        InputStream is = socket.getInputStream();
        OutputStream os = socket.getOutputStream();
        //4 输入流可以读取客户端输出流写出的数据
        //  5输出流可以读取客户端输出流写入的数据
        os.write("baidu".getBytes());
        byte[] arr = new byte[1024];
        int len = is.read(arr);
        System.out.println(new String(arr, 0, len));
        socket.close();
    }

    public static void demo2() throws IOException {
        // 1 创建ServerSocket(需要制定端口号)
        ServerSocket server = new ServerSocket(12345);
        //2调用ServerSocket的accept方法 接收一个客户端请求,
        Socket socket = server.accept();
        //  3 调用socket的getinputstream 和getoutputstream
//获得和拂服务器相连接的io流
        BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));

        //printstream有自动换行功能
        PrintStream ps = new PrintStream(socket.getOutputStream());

        //向客户端应答
        ps.println("百度一下你就知道");
        System.out.println(br.readLine());
        ps.println("帅");
        System.out.println(br.readLine());
        ps.println("必须的");


        socket.close();
    }
    //开启线程 一致等待处理客户端数据
    public static void demo3() throws IOException {

        ServerSocket server = new ServerSocket(12345);
        while (true){
            //内部类访问外部变量,加final
           final Socket socket = server.accept();
            //创建线程
            new  Thread() {
                @Override
                public void run() {
                    super.run();
                    try { BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));

                        //printstream有自动换行功能
                        PrintStream ps = new PrintStream(socket.getOutputStream());

                        //向客户端应答
                        ps.println("百度一下你就知道");
                        System.out.println(br.readLine());
                        ps.println("返回搜索结果");
                        System.out.println(br.readLine());


                    }catch (Exception e){
                        e.printStackTrace();
                    }



                }
            }.start();
        }
}
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值