为什么客户端和服务器端都收不到消息?

psjcarlos 2010-04-30 01:33:44
新手。。
学习聊天室程序。。。
编译通过。
但是两端都只能发信息。。收不到任何信息。。
为什么呢?

import java.io.*;
import java.net.*;

public class ChartServer {
public static void main(String[] args) {
try {
ServerSocket ss = new ServerSocket(1985);
Socket s = ss.accept();
InputStream serverIn = s.getInputStream();
OutputStream serverOut = s.getOutputStream();
new ServerReader(serverIn).start();
new ServerWriter(serverOut).start();
} catch(Exception e) {
e.printStackTrace();
}
}

}

class ServerReader extends Thread {
ServerReader(InputStream aIn) {
in = aIn;
}
public void run() {
try {
BufferedReader br = new BufferedReader(new InputStreamReader(in));
while(true) {
System.out.println("对方说:" + br.readLine());
}
} catch(IOException e) {
e.printStackTrace();
}

}
private InputStream in;

}

class ServerWriter extends Thread {
ServerWriter(OutputStream aOut) {
out = aOut;
}
public void run() {
try{
InputStreamReader in = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(in);
String info;
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(out));
while(true) {
info = br.readLine();
bw.write(info);
bw.flush();
}
} catch(IOException e) {
e.printStackTrace();
}

}
private OutputStream out;
}




import java.io.*;
import java.net.*;

public class ChartClient {
public static void main(String[] args) {
System.out.println("欢迎进入简易聊天系统客户端");
try {
Socket s = new Socket("127.0.0.1",1985);
InputStream in = s.getInputStream();
OutputStream out = s.getOutputStream();
new ClientWriter(out).start();
new ClientReader(in).start();

} catch(Exception e) {
e.printStackTrace();
}
}

}

class ClientReader extends Thread {
ClientReader(InputStream aIn) {
in = aIn;
}
public void run() {
try {
InputStreamReader isr = new InputStreamReader(in);
BufferedReader br = new BufferedReader(isr);
String info;
while(true) {
info = br.readLine();
System.out.println("服务器端说:" + info);
}
} catch(Exception e) {
e.printStackTrace();
}
}
private InputStream in;
}

class ClientWriter extends Thread {
ClientWriter(OutputStream aOut) {
out = aOut;
}
public void run() {
String info;
try {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(out));
while(true) {
info = br.readLine();
bw.write(info);
bw.flush();
}
} catch(Exception e) {
e.printStackTrace();
}
}
private OutputStream out;
}
...全文
192 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
mochibing 2010-04-30
  • 打赏
  • 举报
回复
经过分析,原因是因为你使用BufferedReader.readLine来获得返回数据的,而这个函数要求每一行的末尾需要有\r\n(回车换行符)。但是你在输出的时候是用了BufferedWriter.write,这个函数并不会在输入的末尾加上\r\n,所以导致BufferedReader.readLine一直认为你的输入还没结束,所以一直处于阻塞状态。你可以把BufferedWriter.write全部替换成下面这样,问题就解决了

PrintWriter pWriter=new PrintWriter(new OutputStreamWriter(socket.getOutputStream()),true);
String temp;
while(true){
try {
temp=bReader.readLine();
System.out.println("你输入的内容是:"+temp);
pWriter.println(temp);
System.out.println("数据发送成功");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}
mochibing 2010-04-30
  • 打赏
  • 举报
回复
可以改成这样,应该没问题
ChatServer.java

package server;

import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class ChatServer {
public static void main(String[] args) {
try {
ServerSocket ss = new ServerSocket(1985);
Socket s = ss.accept();
InputStream serverIn = s.getInputStream();
OutputStream serverOut = s.getOutputStream();
new ServerReader(serverIn).start();
new ServerWriter(serverOut).start();
} catch (Exception e) {
e.printStackTrace();
}
}

}

class ServerReader extends Thread {
ServerReader(InputStream aIn) {
in = aIn;
}

public void run() {
try {
DataInputStream dataInputStream = new DataInputStream(in);
byte[] content=new byte[1000];
while (true) {
int count=dataInputStream.read(content);
System.out.println("对方说:" + new String(content,0,count));
}
} catch (IOException e) {
e.printStackTrace();
}

}

private InputStream in;

}

class ServerWriter extends Thread {
ServerWriter(OutputStream aOut) {
out = aOut;
}

public void run() {
try {
InputStreamReader in = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(in);
DataOutputStream dOutputStream=new DataOutputStream(out);
String info;
while (true) {
info = br.readLine();
dOutputStream.write(info.getBytes());
dOutputStream.flush();
}
} catch (IOException e) {
e.printStackTrace();
}

}

private OutputStream out;
}



ChatClient.java

package client;

import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.Socket;

public class ChatClient {
public static void main(String[] args) {
try {
Socket s = new Socket("127.0.0.1", 1985);
InputStream in = s.getInputStream();
OutputStream out = s.getOutputStream();
new ClientWriter(out).start();
new ClientReader(in).start();

} catch (Exception e) {
e.printStackTrace();
}
}

}

class ClientReader extends Thread {
ClientReader(InputStream aIn) {
in = aIn;
}

public void run() {
try {
DataInputStream dataInputStream = new DataInputStream(in);
byte[] content=new byte[1000];
while (true) {
int count=dataInputStream.read(content);
System.out.println("服务器端说:" + new String(content,0,count));
}
} catch (Exception e) {
e.printStackTrace();
}
}

private InputStream in;
}

class ClientWriter extends Thread {
ClientWriter(OutputStream aOut) {
out = aOut;
}

public void run() {
String info;
try {
BufferedReader br = new BufferedReader(new InputStreamReader(
System.in));
DataOutputStream dOutputStream=new DataOutputStream(out);
while (true) {
info = br.readLine();
dOutputStream.write(info.getBytes());
dOutputStream.flush();
}
} catch (Exception e) {
e.printStackTrace();
}
}

private OutputStream out;
}

什么鬼哈哈 2010-04-30
  • 打赏
  • 举报
回复
逻辑十分混乱 两边都在等待~ 所以你收不到是因为你没发送

public class ServerImpl implements ServerService{

@Override
public List userList() {
// TODO Auto-generated method stub
return null;
}

@Override
public void userRegister() {
try {

int i = 1;
ServerSocket s = new ServerSocket(9000);

ServerActionController.getInstance().getFrame().getJConsoleTextArea().append("启动。。\n");

/*采用循环来处理多个客户端连接的问题*/
while(true){
Socket client = s.accept();
Runnable clientRunnable = new ThreadedRegHandle(client, i);
Thread clientThread = new Thread(clientRunnable);
clientThread.start();
i++;
}

} catch (IOException e) {
e.printStackTrace();
}
}
}


客户端:

/*然后将信息通过socket,将用户信息发送到服务器端*/
try {
socket = new Socket(IP_ADDRESS,9000);

Scanner in = new Scanner(socket.getInputStream());
PrintWriter out=new PrintWriter(socket.getOutputStream());
/*告诉服务器客户端需要的是注册服务*/
out.println("login");
out.flush();

String userName = userNameTextField.getText();
String userPassword = userPasswordField.getText();
myUser.setUser_name(userName);
out.println(userName);
out.println(userPassword);
out.flush();


while(userState == null || userState.equals(""))
userState = in.nextLine();
}catch (UnknownHostException e1) {
e1.printStackTrace();
}catch (IOException e1) {
e1.printStackTrace();
}
church88 2010-04-30
  • 打赏
  • 举报
回复
收不到信息,你怎么能确定信息已成功发送?
uastation 2010-04-30
  • 打赏
  • 举报
回复
收不到任何信息。。
问题你有没写方法把各方写的消息发到各个用户对话框上面显示。。。我讲下思想:写一个方法用发发送消息给各个用户,方法里面最好是有List<User>的容器,以及取到IO流对象用于显示在对话框上面。。
学到后面如何是学了JMS的话,写这个应该不难。
本人比较懒,没看楼主的源码就回答问题了,见谅![近来心情不好]
yexiongMYBH 2010-04-30
  • 打赏
  • 举报
回复
Server和Client没有一个是有发送的,怎么读的出来、、
小小咖啡豆 2010-04-30
  • 打赏
  • 举报
回复
read()的方法基本都是阻塞的,你不给两个都在傻傻的等着!

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧