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

TCP通信

  TCP通信-客户端给服务端发送数据 -聊天室版本3-02
  —————————-
    案例:client可以重复向server发送数据,server在client下线后,给出响应数据.
    分析:综合了前面的案例,重复发送数据用到循环,服务端给出响应,

代码实现如下:

package cn_socket通信_聊天室版本302;
import java.io.DataInputStream;
/*
 * 客户端发数据到服务端
 * 1.Tcp传输,客户端建立的过程.
 *    创建tcp客户端socket服务,使用的是socket对象
 *    建议该对象一创建就明确目的地,要连接的主机.
 * 2.如果连接建立成功,说明数据传输通道已建立。
 *    该通道就是socket流,是底层建立好的。既然是流,说明这里既有输入,又有输出。
 *    想要输入或输出流对象,可以找Socket来获取。
 *    可以通过getOutputStream(),和getInputStream()来获取两个字节流
 * 3.使用输出流,将数据写出。
 * 4.关闭资源   
 */
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;
/*
 * 版本3-1:client可以重复向server发送数据,
 * server在client下线后,给出响应数据
 */
public class Client {
    public static void main(String[] args) throws UnknownHostException, IOException {

        //创建客户端Socket对象
        //连接目标服务器的地址,localhost是目标服务器的地址,10086是目标服务器的端口
        Socket socket = new Socket("localhost",10086);

        Scanner sc = new Scanner(System.in);
        //获取Socket流中的输出流,向服务器输出消息,即发消息到服务器
        DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
        while(true){

            //发送数据的大小
            String data = sc.nextLine();
            byte[] bys=data.getBytes();
            //写数据-遵循TLD协议 1:文本数据  2:图片数据  3:音频数据
            //发送的数据类型
            dos.writeByte(1);
            //发送数据长度
            dos.writeInt(bys.length);
            //写要发送的数据   通常用了流之后要关闭的close()但是这里不用
            dos.write(bys);
            dos.flush();//刷新
            //判断
            if("886".equals(data)){
                break;
            }
        }
        //接收数据
        //接收server的响应数据
        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,"utf-8"));

        //断开连接   客户端下线  (所有的流也关闭)  
        sc.close();
        socket.close();
    }
}
package tedu.cn_socket通信_聊天室版本302;
/*
 * 服务端接收客户端发过来的数据,并打印在控制台上。
 * 建立tcp服务端的思路:
 *   1.创建服务端Soket服务,通过ServerSocket对象
 *   2.服务端必须对外提供一个端口,否则客户端无法连接
 *   3.获取连接过来的客户端对象
 *   4.通过客户端对象获取socket流读取客户端发来的数据
 * */
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {
    static ServerSocket ss;
    static Socket socket;
    //static byte type;
    //UDP:发送端、接收端(无连接)
    //TCP:客户端、服务端(要连接)先启动服务端,再启动客户端
    public static void main(String[] args) throws IOException {

            //创建服务端对象
            ss = new ServerSocket(10086);
            //监听应用所在服务器的10086端口
            //看有没有客户端连接过来,或者发送消息
            //建立连接,获取链接过来的客户端对象
            socket=ss.accept();  //接受客户端请求,
            //不停地接收此客户端发送的数据
            DataInputStream dis = new DataInputStream(socket.getInputStream());
            while(true){
                //通过socket对象获取输入流,要读取客户端发来的数据
                //接收数据类型
                byte type=dis.readByte();

                //根据type判断进行一些操作
                //接收数据长度
                int len = dis.readInt();

                //接收数据内容
                byte[] bys = new byte[len];
                dis.read(bys);
                String data =new String(bys);
                System.out.println(data);
                //"886" 意味着Client要下线
                if("886".equals(data)){
                    System.out.println("此客户端下线!");
                    break;
                }
            }

        //向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();
    }
}

程序运行结果

   先运行服务端,后运行客户端

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值