TCP通信-客户端给服务端发送数据 -聊天室版本3-01

TCP通信(下)与Socket套接字

案例3-01

     案例:实现客户端向服务端发送一条数据,Server接收到之后向Client响应信息。
     注意点:accept()与read系列方法都阻塞的
         flush()是因为DataOutputStream 是一个处理流,发送的数据先到缓冲区,如果不刷新,那么发送数据时会有残留在缓冲区里,导致数据丢失,所有要刷新
     分析:案例3-01添加了服务端接收客户端发来的数据以后,要做出响应,及要在服务端添加响应的数据,发送到客户端,客户端再接收数据。

package cn_socket通信_聊天室版本301;

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

public class Clinet {
    public static void main(String[] args) throws UnknownHostException, IOException {
        //创建客户端Socket对象
        //连接目标服务器的地址,localhost是目标服务器的地址,10086是目标服务器的端口
        Socket socket = new Socket("localhost",10086);

        //获取Socket流中的输出流,向服务器输出消息
        DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
        //写发送数据的大小
        String data ="hello,Server响应Client";
        byte[] bys=data.getBytes();
        //发送的数据类型
        dos.writeByte(1);
        //发送数据长度
        dos.writeInt(bys.length);
        //要发送的数据 内容
        dos.write(bys);
        dos.flush();//刷新

        //接收数据
        //创建数据输入流对象
        DataInputStream dis = new DataInputStream(socket.getInputStream());
        //通过socket对象获取输入流,要读取服务端响应的数据
        //接收数据类型
        byte type=dis.readByte();
        //接收数据长度
        int len = dis.readInt();
        //接收数据内容
        byte[] bys0 = new byte[len];
        dis.read(bys0);
        System.out.println(new String(bys0,"utf-8"));

        socket.close();
    }
}
package cn_socket通信_聊天室版本301;

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

public class Server {
    public static void main(String[] args) throws IOException {
        //接收Client发送的数据
        //创建服务端对象
        ServerSocket ss = new ServerSocket(10086);
        //监听应用所在服务器的10086端口
        //看有没有客户端连接过来,或者发送消息
        //建立连接,获取链接过来的客户端对象
        Socket socket=ss.accept();  //接受客户端请求,
        DataInputStream dis = new DataInputStream(socket.getInputStream());

            //通过socket对象获取输入流,要读取客户端发来的数据
            //接收数据类型
            byte type=dis.readByte();//默认是阻塞的,只有客户端先写数据,服务端接收到之后,才会执行的
            //接收数据长度
            int len = dis.readInt();
            //接收数据内容
            byte[] bys = new byte[len];
            dis.read(bys);
            System.out.println(new String(bys));


            //向Client给出响应数据
            //创建数据输出流对象
            DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
            //发送数据类型
            dos.writeByte(1);
            //发送数据长度
            String data ="接收完毕,您已下线";
            byte[] content = data.getBytes("utf-8");
            dos.writeInt(content.length);
            dos.write(content);
            dos.flush();

            ss.close();
    }
}

程序运行结果

   先运行服务端,后运行客户端
   
   这里写图片描述  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值