可以使用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):