简单的tcp聊天

package com.pers.tcptest;

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

import org.junit.Test;

public class TCPTest {

    @Test// 客户端
    public void client() {
        Socket socket = null;
        Scanner scanner = null;
        OutputStream os = null;
        InputStream is = null;
        try {
            socket = new Socket(InetAddress.getByName("127.0.0.1"), 9092);
            // 输出流 程序到数据 write
            os = socket.getOutputStream();
            System.out.println("请输入多个字符:");
            // 封装键盘输入流
            scanner = new Scanner(System.in);
            String str = scanner.next();
            os.write(str.getBytes());//发送出去
            //必须加上  表示我这边发送结束   服务端可以read去循环读取了  交互性
            socket.shutdownOutput();
            // 输入流 把数据读到程序中 显示出来
            is = socket.getInputStream();
            byte[] b = new byte[10];
            int len;
            while ((len = is.read(b)) != -1) {
                String str2 = new String(b, 0, len);
                System.out.println(str2);// str2是读取到的所有信息内容
            }

        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally {
            // 一定记得把稀缺的流资源关闭,一旦上面报错 关闭流 判断是否为null 避免还没创建流呢 就执行关闭 造成空指针异常
            if (is != null) {
                try {
                    is.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }

            try {
                if (os != null) {
                    os.close();
                }
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            if (scanner != null)
                scanner.close();
            try {
                if (socket != null) {
                    socket.close();
                }
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

        }

    }

    @Test// 服务端
    public void server() {
        ServerSocket ss = null;
        Socket socket = null;
        // 接受来自客户端的信息
        InputStream is = null;
        // 返回给客户端信息
        OutputStream os = null;
        try {
            ss = new ServerSocket(9092);
            socket = ss.accept();
            // 接受来自客户端的信息
            is = socket.getInputStream();
            byte[] b = new byte[10];//输入  就要 考虑接收一下读过来的字节数据
            int len;
            String str = new String();
            while ((len = is.read(b)) != -1) {//考虑多余10个字节的数据 一次读取不完  分批次放到str中
                String str2 = new String(b, 0, len);
                str += str2;
                                System.out.println("服务端接收过来的信息是:"+str);
            }
            // 返回给客户端大写的串信息
            os = socket.getOutputStream();
            os.write(str.toUpperCase().getBytes());
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (os != null) {
                    os.close();
                }
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            try {
                is.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            try {
                socket.close();
            } catch (IOException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
            try {
                ss.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
}
----------------------------------运行结果   先执行服务端 再执行客户端
客户端
请输入多个字符:  
hdhaihdoihio   (点击回车,服务端接收转为大写之后再发送给客户端)
HDHAIHDOIH   (因为一次读取10个字节  所以分两次读完的)
IO
服务端
服务端接收过来的信息是:hdhaihdoih
服务端接收过来的信息是:io           

 课余之外  可以去了解两个东东  如下:

 

posted @ 2017-09-13 20:38  starskyhu  阅读(311)  评论(0编辑  收藏  举报