java:如何在服务端接收客户端发送的字节流数据将其存储到一个字符串中(Socket处理网络连接)

可以使用BufferedInputStream的read(byte[] b)方法和String(byte[] bytes, int offset, int length)方法实现.

代码如下

客户端:

package socket;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.net.InetAddress;
import java.net.Socket;

public class Client {
	public static void main(String[] args) throws Exception {
		System.out.println("这是客户端\n");
		// 得到本机ip
		String ip = InetAddress.getLocalHost().getHostAddress();
		/*
		 * 获取套接字, 参数为(本机ip地址,端口号)
		 * 端口号可以自定义, 范围从1024到65536
		 * (1024之前的是一些知名的网络服务和应用的端口号)
		 * 注意: 服务端的端口号要和客户端的端口号一样才能建立连接
		 */
		Socket soc = new Socket(ip, 23778);
		// 获取网络的输出流
		BufferedOutputStream bos = new BufferedOutputStream(soc.getOutputStream());
		// 向服务端发送数据
		// 将数据写到缓冲区
		bos.write("嗨嗨嗨, 我tm来了!".getBytes());
		// 将数据发送到服务端
		bos.flush();
		// 发送完毕, 关闭网络输出((相当于告诉服务端, 客户端已经停止发送数据了))
		// 如果不加这条命令, 服务器会一直等待, 导致双方都卡住
		soc.shutdownOutput();
		// 接收服务端的反馈
		// 从网络获取输入流, 这一段操作与服务端中的一样
		BufferedInputStream bis = new BufferedInputStream(soc.getInputStream());
		StringBuffer sb = new StringBuffer();
		byte[] b = new byte[8192];
		int len = -1;
		while ((len=bis.read(b)) != -1) {
			sb.append(new String(b,0,len));
		}
		System.out.println("服务端的反馈:"+sb.toString());
		// 关闭网络输入(相当于告诉服务端, 客户端已经停止接收数据了)
		soc.shutdownInput();
		// 关闭连接
		soc.close();
	}
}

服务端:

package socket;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {
	public static void main(String[] args) throws Exception {
		System.out.println("这是服务端\n");
        // 服务端开始监听
        ServerSocket serSoc = new ServerSocket(23778);
        Socket soc = serSoc.accept();
        // 获取输入流
        BufferedInputStream bis = new BufferedInputStream(soc.getInputStream());
        // 用来存接收到的信息
        StringBuffer sb = new StringBuffer();
        // 字节数组, read(byte[] b)方法会将字节流的数据存到b中
        byte[] b = new byte[8192];
        // 用来存read(byte[] b)方法返回来的b的长度
		int len = -1;
        // 循环读取, read方法如果什么都没读到就会返回-1, 这时退出循环
        while ((len=bis.read(b)) != -1) {
            // read方法读取到了东西, 将读到的东西转化成String
        	sb.append(new String(b,0,len));
		}
        // 读取结束, 显示结果
        System.out.println("接收到信息: "+sb.toString());
        // 关闭网络输入(相当于告诉客户端, 服务端已经停止接收数据了)
        soc.shutdownInput();
        // 向客户端反馈
        // 获取输出流
        BufferedOutputStream bos = new BufferedOutputStream(soc.getOutputStream());
        // 向客户端发送数据
        // 将数据写道缓冲区
        bos.write("我tm知道了!".getBytes());
        // 将数据发送到客户端
        bos.flush();
        // 发送完毕, 关闭网络输出(相当于告诉客户端, 服务端已经停止发送数据了)
        soc.shutdownOutput();
        // 关闭连接
        soc.close();
        // 关闭服务端
        serSoc.close();
    }
}

先运行服务端, 然后运行客户端, 结果如下(软件为eclipse):

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值