IM即时通信(二) 文本传输

版权声明:本文为博主原创文章,转载请说明出处,谢谢。 https://blog.csdn.net/qq_27070443/article/details/61614481

服务端

package me.mxzf;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * 
 * @Title: TextServer
 * @Dscription: 服务端
 * @author Deleter
 * @date 2017年3月12日 上午9:14:55
 * @version 1.0
 */
public class TextServer {
    public static void main(String[] args) {
        try {
            // 新建一个服务端实例,监听绑定1234端口
            ServerSocket serverSocket = new ServerSocket(1234);
            // accept阻塞直到有Socket进行握手
            Socket socket = serverSocket.accept();
            // 用Data输入输出流封装流通道
            DataInputStream dis = new DataInputStream(socket.getInputStream());
            DataOutputStream dos = new DataOutputStream(
                    socket.getOutputStream());
            // 定义一些变量,用来接收来自"客户端"的信息
            String content;
            StringBuilder contents = new StringBuilder();
            // 当没有消息来之前,readUTF()一直处于阻塞状态
            while ((content = dis.readUTF()) != null) {
                // 一开始readUTF()是阻塞的,直到有数据来便开始读入
                // 如果readUTF()读到了流的尾部也就是null
                // 那么可以假设数据读入完整,自动跳出循环
                contents.append(content);
            }
            // 经典的输出语句,这里就不多说了
            System.out.println(contents.toString());
            // 服务器主动推送信息
            dos.writeUTF("孙子别走,看爷爷打不死你.");
            // 刷新缓冲区,防止粘包
            dos.flush();
            //断开连接
            socket.close();
        } catch (IOException e) {
            //捕捉异常
            e.printStackTrace();
        }
    }
}

客户端

package me.mxzf;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.InetAddress;
import java.net.Socket;

/**
 * 
 * @Title: TextSocket
 * @Dscription: 客户端
 * @author Deleter
 * @date 2017年3月12日 上午9:15:08
 * @version 1.0
 */
public class TextSocket {
    public static void main(String[] args) {
        try {
            // 新建Socket实例(服务器地址,被监听端口)
            Socket socket = new Socket(InetAddress.getLocalHost(), 1234);
            // 用Data输入输出流封装流通道
            DataInputStream dis = new DataInputStream(socket.getInputStream());
            DataOutputStream dos = new DataOutputStream(
                    socket.getOutputStream());
            // 客户端向服务器发送一条信息
            // 通信前,客户端"必须先"向服务器发送消息
            dos.writeUTF("爷爷,Mdzz");
            // 定义一些变量用来接收,来自"服务器"的消息
            String content;
            StringBuilder contents = new StringBuilder();
            // 当没有消息来之前,readUTF()一直处于阻塞状态
            while ((content = dis.readUTF()) != null) {
                // 一开始readUTF()是阻塞的,直到有数据来便开始读入
                // 如果readUTF()读到了流的尾部也就是null
                // 那么可以假设数据读入完整,自动跳出循环
                contents.append(content);
                break;
            }
            //依然是,输出语句
            System.out.println(contents);
            //断开连接
            socket.close();
        } catch (IOException e) {
            //捕捉异常
            e.printStackTrace();
        }
    }
}

**注意:

1、先运行服务端,在运行客户端
2、客户端一定要先发送消息,很多孩纸都闷在这步,不晓得哪里错了,就是没有用,也不报错.**

猜你喜欢

转载自blog.csdn.net/qq_27070443/article/details/61614481