java聊天室常见错误解析

一。输出输入流的处理

常见问题:1.消息发送成功,对方接收不到
        2.出现乱码
        3.服务器能接收到数据,但转发失败

出现以上问题绝对是输出输入没有处理好,比如下面情况会出现乱码甚至接收不到数据:写入是cout.write((byte)ch);读取是din.readUTF()。发现写入的是字节,却来读取字符,岂不怪哉!

正确写法:(说到底就是要你 怎么发送怎么接收)

第一种:
//发送
String message="要发送的字";
OutputStream out=null;
DataOutputStream dos=null;

out=socket.getOutputStream();
dos=new DataOutputStream(out);
dos.writeUTF(message);//发送数据类型是字符串
dos.flush();

//接收
InputStream in=null;
DataInputStream din=null;

in=socket.getInputStream();
din=new DataInputStream(in);

message = din.readUTF();

第二种:
//发送
out=clientSocket.getOutputStream();
cout=new DataOutputStream(out);

int ch;
while((ch=System.in.read())!=-1) {
		cout.write((byte)ch);//发送数据类型是字节
		if(ch=='\n') {
		cout.flush();


InputStream in = clientSocket1.getInputStream();
BufferedReader sin = new BufferedReader(new InputStreamReader(in));
while((aLine=sin.readLine())!=null) {
  System.out.print(aLine);

二。多线程操作之局部变量与全局变量

常见问题:一般出现在群聊中
        1.最后一个开启的客户端永远接收不到前面开启的客户端的消息,而前面客户端接收到自己的消息

我这里的问题是:服务器端的socket定义成了全局变量,run()线程中引用的socket就是最后一个客户端的socket,所以服务器转发消息时永远是发送给前面的客户。所以这里的解决方法就是在run()里面再定义一个socket局部变量,并接受全局变量的socket

public void run() {
		Socket clientSocket1=clientSocket;

三。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值