简单聊天室实现分析--信息传输代码分析

3. 服务器发送信息给客户和客户发送信息给服务器相应代码的区别:
1) 服务器发送给客户(给定的字符串发送给客户):

java.io.OutputStream outPut = socket.getOutputStream();
//创建要发送的字符串
String str = "你好,欢迎进我的服务器!\r\n";
//把字符串转变成为字节数组
//因为在网络上,是以字节传输的
byte[] strs = str.getBytes();
//输出字符
outPut.write(strs);
outPut.flush();


2)服务器发送给客户(我们输入的字符串发送给客户):

//针对套接字创建输出流对象
java.io.OutputStream outPut = socket.getOutputStream();
System.out.println("输入你要发送的文字:");
//读取我们要从服务器敲入的数据,同时放入缓存中
BufferedReader read = new BufferedReader(new InputStreamReader(System.in));
//读取缓存中的数据,转化为字符串
String word=String.valueOf(read.readLine());
//给字符串加上换行符
word="服务器说:"+word+"\r\n";
//把字符串拆为字节放入字节数组中
byte[] bytes=word.getBytes();
//输出字节数组中的字节到客户机,客户机读取字节
outPut.write(bytes);
//强制输出
outPut.flush();


3)读取客户发送给服务器的信息:

/**下面的所有代码为从客户机读取字符*/
//从输入输出流套接字中获得输入输出流
java.io.InputStream inPut = socket.getInputStream();
//从输入流中读取字节
int in=inPut.read();
//创建一个缓冲区
StringBuffer sb = new StringBuffer();
//判断所获取的是否会回车符或者窗口是否关闭,-1代表关闭窗口,13为回车符
while(in!=-1&&in!=13){
//如果不是,则把获取的字节转化为字符添加到缓冲区中
sb.append((char)in);
//从输入流中读取一个字节
in=inPut.read();
}
//把缓冲区的内容转化为字符串,trim为去掉字符串的尾空格号
String string="客户机说:"+sb.toString().trim();
//判断字符串是否为bye,如果是的就关闭服务器,退出,如果不是则进行循环内部程序
while(!string.equals("客户机说:bye")){
//打印从输入流缓冲区中的字符串
System.out.println(string);
//再重新读取内容
in=inPut.read();
//创建一个缓冲区
StringBuffer sb = new StringBuffer();
//判断所获取的是否会回车符或者窗口是否关闭,-1代表关闭窗口,13为回车符
while(in!=-1&&in!=13){
//如果不是,则把获取的字节转化为字符添加到缓冲区中
sb.append((char)in);
//从输入流中读取一个字节
in=inPut.read();
}
//把缓冲区的内容转化为字符串
string="客户机说:"+sb.toString().trim();
}
socket.close();


我们一定要注意,在客户发送信息,服务器读取的时候,inPut.read()读取的是字节,而不是字符,所以我们在加入缓存(StringBuffer)的时候一定要先强行转换,把字节转换为字符,在加入(append())到缓存中;如果是服务器发送信息的话,注意在数据流中数据是以字节的形式传输的,所以一定要先转化为字节(getByte()方法)后再传输(outs.write());
[color=red]上面我们还要注意StringBuffer和BufferedReader的区别,还有一个BufferedReader:[/color]
StringBuffer是我们在客户输入字符的时候,把我们输入的字符存入StringBuffer缓存中,主要是以字符存储来实现缓存,当遇到某个我们设定的字符(我们这里设定的是回车符)时候就尽心输出字符串;
BufferedReader是从输入流中读取文本,缓冲各个字符,从而实现高效读取,我们这是用在服务器发送信息给客户上;创建对象时一定要传入输入流对象;获取它的字符串的方法是它对应的readLine()方法,要能输出的话还要在后面再加个toString()方法;注意它的readLine()方法,会阻塞,直到客户端发送了一个回车符后,才将读取的字符串返回,如果在服务器端使用readLine()方法,无论客户机输入了多少字符串,如果没有回车符出现,这个方法就无法执行完毕,从而返回一个字符串,虽然这些字符串都 已经读入了内存;
BufferedWriter将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入;这里没有用到;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值