一。输出输入流的处理
常见问题: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;
三。